zoukankan      html  css  js  c++  java
  • JDBC

    JDBC = JAVA Database Connectivity   java数据库连接

    JDBC是Java访问数据的的标准是一种规范

    JAVA想要连接数据库必须需要数据库的驱动

     1 package cn.Tony.demo;
     2 
     3 import java.sql.Connection;
     4 import java.sql.DriverManager;
     5 import java.sql.ResultSet;
     6 import java.sql.SQLException;
     7 import java.sql.Statement;
     8 
     9 
    10 public class MainTest {
    11 
    12     public static void main(String[] args) {
    13         //声明Connection对象
    14         Connection con = null;
    15         //驱动程序名
    16         String driver = "com.mysql.cj.jdbc.Driver";
    17         //指向要访问的数据库名
    18         String ur1 = "jdbc:mysql://127.0.0.1:3306/booktik?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT";
    19         //MYSQL配置时的用户名
    20         String user = "root";
    21         //MYSQL配置是的密码
    22         String password = "gllh_123456";
    23         
    24         try {
    25             //加载驱动
    26             Class.forName(driver);
    27             //1.getConnection()方法 连接MYSQL数据库
    28             con = DriverManager.getConnection(ur1,user,password);
    29             if(!con.isClosed()) {
    30                 System.out.println("Succeeded connectiong to the Database!");
    31             }
    32             // 2.创建statement类对象,来执行SQL语句
    33             Statement statement = con.createStatement();
    34             // 要执行的SQL语句
    35             String sql = "select * from book";
    36             // 3.ResultSet类 用来存放获取的结果集!
    37             ResultSet rs = statement.executeQuery(sql);
    38             System.out.println("-----------------");
    39             System.out.println("执行结果如下所示:");  
    40             System.out.println("-----------------");  
    41             System.out.println("id" + "	" + "bookname"+"	"+"size");  
    42             System.out.println("-----------------");  
    43            
    44             int id ;
    45             String bookname = null;
    46             int size ;
    47             while(rs.next()) {
    48                 //获取booktik数据
    49                 id = rs.getInt("id");
    50                 bookname = rs.getString("bookname");
    51                 size = rs.getInt("size");
    52                 System.out.println("id="+id+",bookname="+bookname+",size"+size);
    53             }
    54             rs.close();
    55             con.close();
    56         } catch (ClassNotFoundException e) {
    57             //数据库驱动类异常处理
    58             System.out.println("Sorry,can't find the Driver!");
    59             e.printStackTrace();
    60             
    61         } catch (SQLException e) {
    62             e.printStackTrace();
    63         }catch (Exception e) {
    64             e.printStackTrace();
    65         }finally {
    66             System.out.println("数据库数据成功获取");
    67         }
    68     }
    69 }

      更新数据库:public int executeUpdate(String sql)throws SQLException 返回更新行数

      查询数据库:ResultSet executeQuery(String sql)throws SQLException

      下面需要为开发准备一张数据表:

    范例:编写数据表创建脚本

     1 DROP TABLE member RURUGE;
     2 DROP SEQUENCE myseq;
     3 CREATE SEQUENCE myseq;
     4 CREATE TABLE member(
     5     mid         NUMBER ,
     6     name        VARCHAR2(50)    NO NULL ,
     7     age            NUMBER ,
     8     brithday    DATE ,
     9     note         CLOB ,
    10     CONSTRAINT  pk_mid PRIMARY KEY(mid)
    11 );
     

    数据更新 

      数据更新一共分为三个操作:增加 修改 删除 如果要更新的操作使用的是Statement接口的话,只要按照结构拼出完整的SQL语句即可。

    1.数据增加处理

      SQL 语法:INSERT INTO 表名称(字段,字段,字段,...)VALUES(值,值,值...)

       

    2.修改数据

      修改的SQL:UPDATE 表名称 SET 字段=值,WHERE 更新条件;

    3.删除数据

       通过以上的执行也可以发现一些规律:使用Statement进行数据库操作的时候,直接编写一个数据库可以读懂的SQL语句即可。

    数据查询处理

      查询语句指的是向数据库发出查询操作,而后数据库会把满足于查询条件的数据返回。数据库把所有满足于条件的数据返回给程序,实际上这些程序就会保存在内存之中,那么如果此时放回的数据量过大,则一定会造成性能的下降,在查询的时候请考虑的数据量问题。

      在Statement接口之中如果要进行查询,返回的是ResultSet接口对象,那次此接口对象可以包装任意的返回结果(行列的数据结构)

     

    范例:实现数据查询

      在以后所有进行的数据库开发过程中,觉得不允许出现"SELECT *",写查询语句的时候要写上具体的数据类型。

          另外以上在进行数据取出的时候使用了getXxx(字段名称)这种做法一般不常用,因为再SELECT子句定义的时候已经明确给出了使用的字段,所以重复编写没有意义。那么习惯的做法是编写序列。

      查询的整体的操作流程都是固定流程,取出数据给结构集,结果集循环输出。是否使用循环要看你返回的数据量来决定

    Java数据库编程

    使用PreparedStatement操作数据库

       在所有的项目开发中不会有任何一位愚蠢的开发人员去使用Statement 而唯一可以使用的只有PreparedStatement子接口

    分析Statement接口的操作问题

       Statement接口在整体的操作上非常的直观,因为只需要转入一个完整的SQL语句,就可以实现相应的数据库操作,如果这种操作真的结合到了开发之前是非常混乱的。

      在SQL里面" ' "用于描述字符串,所以如果采用了拼凑SQL的语句形式,那么这个符号的处理比较麻烦。另外用Statement处理的时候对于日期的格式定义非常受到数据库的局限。综合的结论:开发不要使用Statement 如果要使用就使用Statement的子接口:PreparedStatement接口完成。如果要想取得本接口的实例化对象,则需要使用Connection接口处理,在Connection接口里面定义方法:  

    PreparedStatement prepareStatement(String sql)throws SQLException

        这里面的SQL是需要占位符来进行描述的 而使用"?" 作为站位符,编号从1开始。 

      而取得了PreparedStatement接口对象之后如果要想执行数据库操作那么也要更换新的方法

        更新操作:public int executeUpdate() throws SQLException;

        查询操作:public ResultSet executeQuery()throws SQLException;

        填充数据:public void setXxx(int index,数据类型 变量);

      在使用PreparedStatement接口操作 Date数据的时候也别要引起注意:使用的是java.sql.Date类,而在程序之中描述日期一定是java.util.Date类型,而在java.util.Date类中有三个子类:

    Date(日期) DateTime(时间)Timestamp(日期时间);这三个子类都有一个类似的构造方法:

        java.sql.Date类:public Date(long date);

        java.sql.Time类:public Time(long time);

        java.sql.Timestamp类:public Timestamp(long time);

       而在java.util.Date类中有一个getTime()方法可以将Date变为long

    范例:使用PreparedStatement来解决之前的操作问题

      所以在以后的开发中不要去使用Statement做任何处理了,都使用PreparedStatement完成。而如果增加实现了,对于修改和删除操作是一样的形式。

    PreparedStatement接口查询(核心)

      由于在实际的开发之中PreparedStatement接口的使用频率非常的高,所以对于此接口的查询操作就特别重要了,下面列举几个最为基础的查询处理模型,这些基本的查询案例编写后,就可以编写程序了

    1.查询全部

     1 package cn.Tony.demo;
     2 
     3 import java.sql.Connection;
     4 import java.sql.DriverManager;
     5 import java.sql.PreparedStatement;
     6 import java.sql.ResultSet;
     7 import java.sql.SQLException;
     8 import java.sql.Statement;
     9 import java.util.Date;
    10 
    11 public class MainTest {
    12     
    13     public static final String DBDRIVER = "com.mysql.cj.jdbc.Driver";
    14     public static final String DBURL = "jdbc:mysql://127.0.0.1:3306/myseq?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT";
    15     public static final String DBUSER = "root";
    16     public static final String DBPASSWORD = "gllh_123456";
    17     
    18     public static void main(String[] args) throws Exception{
    19         // 进行数据库驱动加载
    20         Class.forName(DBDRIVER);
    21         // 进行数据库连接
    22         Connection con = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD);
    23         // 写SQL语句
    24         String sql = " SELECT empno,ename,job,hiredate,sal FROM emp ";
    25         PreparedStatement pstmt = con.prepareStatement(sql);
    26 //        pstmt.setString(1, "曹操");
    27         ResultSet rs= pstmt.executeQuery();
    28         while(rs.next()) {
    29             int empno = rs.getInt(1);
    30             String ename = rs.getString(2);
    31             String job = rs.getString(3);
    32             Date birthday = rs.getDate(4);
    33             float sal = rs.getFloat(5);
    34             System.out.println(empno+","+ename+","+job+","+birthday+","+sal);
    35         }
    36         con.close();
    37      }
    38 }

    2.进行根据id查询

     1 package cn.Tony.demo;
     2 
     3 import java.sql.Connection;
     4 import java.sql.DriverManager;
     5 import java.sql.PreparedStatement;
     6 import java.sql.ResultSet;
     7 import java.sql.SQLException;
     8 import java.sql.Statement;
     9 import java.util.Date;
    10 
    11 public class MainTest {
    12     
    13     public static final String DBDRIVER = "com.mysql.cj.jdbc.Driver";
    14     public static final String DBURL = "jdbc:mysql://127.0.0.1:3306/myseq?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT";
    15     public static final String DBUSER = "root";
    16     public static final String DBPASSWORD = "gllh_123456";
    17     
    18     public static void main(String[] args) throws Exception{
    19         // 进行数据库驱动加载
    20         Class.forName(DBDRIVER);
    21         // 进行数据库连接
    22         Connection con = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD);
    23         // 写SQL语句
    24         String sql = " SELECT empno,ename,job,hiredate,sal FROM emp WHERE empno=?";
    25         PreparedStatement pstmt = con.prepareStatement(sql);
    26         pstmt.setInt(1, 6060);
    27         ResultSet rs= pstmt.executeQuery();
    28         while(rs.next()) {
    29             int empno = rs.getInt(1);
    30             String ename = rs.getString(2);
    31             String job = rs.getString(3);
    32             Date birthday = rs.getDate(4);
    33             float sal = rs.getFloat(5);
    34             System.out.println(empno+","+ename+","+job+","+birthday+","+sal);
    35         }
    36         con.close();
    37      }
    38 }

    3.模糊查询处理:

     1 package cn.Tony.demo;
     2 
     3 import java.sql.Connection;
     4 import java.sql.DriverManager;
     5 import java.sql.PreparedStatement;
     6 import java.sql.ResultSet;
     7 import java.sql.SQLException;
     8 import java.sql.Statement;
     9 import java.util.Date;
    10 
    11 public class MainTest {
    12     
    13     public static final String DBDRIVER = "com.mysql.cj.jdbc.Driver";
    14     public static final String DBURL = "jdbc:mysql://127.0.0.1:3306/myseq?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT";
    15     public static final String DBUSER = "root";
    16     public static final String DBPASSWORD = "gllh_123456";
    17     
    18     public static void main(String[] args) throws Exception{
    19         String column = "ename"; // 在那个列上执行模糊查询
    20         String keyword = "曹操"; // 关键字
    21         // 进行数据库驱动加载
    22         Class.forName(DBDRIVER);
    23         // 进行数据库连接
    24         Connection con = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD);
    25         // 写SQL语句
    26         // 使用“?”填充的占位符只有数据可以使用,而对于列是无法使用的
    27         String sql = " SELECT empno,ename,job,hiredate,sal FROM emp WHERE " + column + " LIKE ?";
    28         PreparedStatement pstmt = con.prepareStatement(sql);
    29         pstmt.setString(1, "%" + keyword + "%");
    30 //        pstmt.setInt(1, 6060);
    31         ResultSet rs= pstmt.executeQuery();
    32         while(rs.next()) {
    33             int empno = rs.getInt(1);
    34             String ename = rs.getString(2);
    35             String job = rs.getString(3);
    36             Date birthday = rs.getDate(4);
    37             float sal = rs.getFloat(5);
    38             System.out.println(empno+","+ename+","+job+","+birthday+","+sal);
    39         }
    40         con.close();
    41      }
    42 }

    范例:分页查询

    int currentPage = 1; // 当前在第一页

    int lineSize = 5; // 每页显示5行记录

    5.统计查询

    SELECT COUNT(*) FROM emp;

     1 package cn.Tony.demo;
     2 
     3 import java.sql.Connection;
     4 import java.sql.DriverManager;
     5 import java.sql.PreparedStatement;
     6 import java.sql.ResultSet;
     7 import java.sql.SQLException;
     8 import java.sql.Statement;
     9 import java.util.Date;
    10 
    11 public class MainTest {
    12     
    13     public static final String DBDRIVER = "com.mysql.cj.jdbc.Driver";
    14     public static final String DBURL = "jdbc:mysql://127.0.0.1:3306/myseq?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT";
    15     public static final String DBUSER = "root";
    16     public static final String DBPASSWORD = "gllh_123456";
    17     
    18     public static void main(String[] args) throws Exception{
    19         String column = "ename"; // 在那个列上执行模糊查询
    20         String keyword = "曹操"; // 关键字
    21         // 进行数据库驱动加载
    22         Class.forName(DBDRIVER);
    23         // 进行数据库连接
    24         Connection con = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD);
    25         // 写SQL语句
    26         // 使用“?”填充的占位符只有数据可以使用,而对于列是无法使用的
    27         String sql = " SELECT COUNT(*) FROM emp WHERE "
    28         + column + " LIKE ?";
    29         PreparedStatement pstmt = con.prepareStatement(sql);
    30         pstmt.setString(1, "%" + keyword + "%");
    31 //        pstmt.setInt(1, 6060);
    32         ResultSet rs= pstmt.executeQuery();
    33         if(rs.next()) {
    34             long count = rs.getLong(1);
    35             System.out.println(count);
    36         }
    37         con.close();
    38      }
    39 }

      以上所给出的几个开发代码是后续开发项目的核心基础部分,请牢固掌握

    总结

    1.PreparedStatement与Statement相比发现其代码的常用设计会更难;

    2.PreparedStatement的几个查询将作为日后项目的编写基础

    批处理与事务处理(批处理)

      在之前使用使用的JDBC的操作形式严格来讲都是从JDK1.0开始兴起的,现在的JDBC最新版好像是JDBCX.0(没人关注了),现在使用JDBC的时候会发现里面的操作已经优化了不少。例如:最初操作的时候必须按照顺序取,只能取一次。但是从JDBC2.0开始追加了一些神奇的新功能:结果集更新,可滚动结果集,批处理(唯一好用的)

      所谓的批处理指的是多条SQL语句可以同时进行更新处理。而由于批处理追加之后Statement PreparedStatement两个接口里面也追加了一些处理方法:

        Statement接口定义的批处理方法:

          增加待执行的SQL:public void addBatch(String sql)throws SQLException

           执行批处理操作:public int[] executeBatch()throws SQLException

         PreparedStatement接口定义的批处理方法:
          增加待执行的SQL:public void addBatch()throws SQLException

    范例:使用PreparedStatement实现批处理

      批处理的的特点就是所有的操作一次性的向数据库中发出

     事务处理

      事务保证的是所有的更新操作要么一起成功,要么一起失败,现在对于给定的批处理里面发现 可以一次性的执行多条更新操作,那么假设说中间有一条失败了会如何呢?

       此时执行的语句出现了错误,结构错误之前的语句正常执行,而错误之后的语句没有执行,那么如果这些更新属于同一个业务的处理操作,那么此时的数据就乱了,所有为了保证整体的操作要么一起成功。要么一起失败,就可以利用JDBC的原生事务(数据库)事务进行解决,而事务的控制方法都在Connection接口里面:

         设置事务是否自动提交: public  void setAutoCommit(boolean autoCommit)throws SQLException

        提交事务:public void commit() throws SQLException

        回滚事务:public void rollback() throws SQLException

    范例:用套路解决事务问题

     

      对于事务的操作概念理解就可以了,因为在以后的开发中,这种手工的事务处理不好用,以后有工具,来帮你进行事务处理,记住批处理操作就可以了!

  • 相关阅读:
    SQL中如何用一个表的列更新另一个表的列?
    ASPxGridView利用CheckBox实现全选
    DevExpress.NETv8.1(Web Controls)学习笔记
    ALSA vs OSS
    video telephone
    uClinux系统分析 转
    Using KVM On Ubuntu 7.10 (Gutsy Gibbon)转
    想买开发板,我真的需要么?
    uClinux的内存管理转
    各种开源软件授权方式的选择 (zt)
  • 原文地址:https://www.cnblogs.com/Tony98/p/10678636.html
Copyright © 2011-2022 走看看