JDBC

来源:互联网 发布:奢侈品包 知乎 编辑:程序博客网 时间:2024/05/21 14:28

JDBC

JDBC 原理

JDBC 定义了应用程序和数据库的交互规范。具体的数据库有着特定的访问协议,使得不同数据库有着不同的驱动。Driver接口为不同的数据库驱动,给出统一的操作规范。DirverManager Class 在类层面管理着不同的数据库驱动。






Driver 注册


具体Driver实现类的静态代码段中,创建Driver实例并将其加入到 DriverManager 里。即通过加载驱动类,完成驱动注册。    

private final static CopyOnWriteArrayList<DriverInfo> registeredDrivers = new CopyOnWriteArrayList<DriverInfo>();
    public static synchronized void registerDriver(java.sql.Driver driver)
        throws SQLException {
        /* Register the driver if it has not already been added to our list */
        if(driver != null) {
            registeredDrivers.addIfAbsent(new DriverInfo(driver));
        } else {
            // This is for compatibility with the original DriverManager
            throw new NullPointerException();
        }
        println("registerDriver: " + driver);
    }

1.Class.forName("com.mysql.jdbc.Driver")

  1.  String url="jdbc:mysql://localhost:3306/databasename";//数据库连接子协议  
  2.  Connection conn=DriverManager.getConnection(url,"username","password"); 

加载驱动类

2. DriverManager.registerDriver(new com.mysql.jdbc.Driver()) 或 new com.mysql.jdbc.Driver()

  1.  String url="jdbc:mysql://localhost:3306/databasename";//数据库连接子协议  
  2.  Connection conn=DriverManager.getConnection(url,"username","password");

加载驱动类

3. System.setProperty("jdbc.drivers","com.mysql.jdbc.Driver"); 

DriverManager 类被加载时,静态代码段中检查系统属性并根据属性配置的驱动类名去加载对应的驱动类。

可以同时导入多个jdbc驱动,中间用冒号“:”分开

比如System.setProperty("jdbc.drivers","XXXDriver:XXXDriver:XXXDriver");


获取Connection

数据库类型与数据库连接子协议一一匹配,具体的数据库驱动能够解析其所支持数据库JDBC URL. 当给定JDBC URL, DriverManager 通过遍历其管理的驱动,查看驱动是否能够解析给定的URL,如果是,则通过驱动返回Connection.


Statement

普通的不带参的查询SQL;支持批量更新,批量删除.每次执行sql语句,数据库都要执行sql语句的编译,并重新生成执行计划。在用于仅执行一次查询并返回结果和每次查询都要重新生成执行计划的情形下,效率高于PreparedStatement.

  1. Statement用法:   
  2. String sql = "select seq_orderdetailid.nextval as test dual";   
  3. Statement stat1=conn.createStatement();   
  4. ResultSet rs1 = stat1.executeQuery(sql);   
  5. if ( rs1.next() ) {   
  6.     id = rs1.getLong(1);   
  7. }  

PreparedStatement: 
是预编译的,支持批量更新,批量删除

1. 在执行可变参数的一条SQL时,PreparedStatement比Statement的效率高,因为DBMS预编译一条SQL当然会比多次编译一条SQL的效率要高。 
2. 安全性好,有效防止Sql注入等问题。 
3.  对于多次重复执行的语句,使用PreparedStament效率会更高一点,并且在这种情况下也比较适合使用batch;

  1. PreparedStatement用法:   
  2. PreparedStatement pstmt  = con.prepareStatement("UPDATE EMPLOYEES  SET SALARY = ? WHERE ID =?");   
  3. pstmt.setBigDecimal(1153.00);   
  4. pstmt.setInt(21102);   
  5. pstmt. executeUpdate();  

CallableStatement 

用于调用存储过程


  1.   
  2. INOUT参数使用:   
  3. CallableStatement cstmt = conn.prepareCall("{call revise_total(?)}");   
  4. cstmt.setByte(125);   
  5. cstmt.registerOutParameter(1, java.sql.Types.TINYINT);   
  6. cstmt.executeUpdate();   
  7. byte x = cstmt.getByte(1);

Batch
  1. Statement的Batch使用:   
  2. Statement stmt  = conn.createStatement();   
  3. String sql = null;   
  4. for(int i =0;i<20;i++){   
  5.     sql = "insert into test(id,name)values("+i+","+i+"_name)";   
  6.     stmt.addBatch(sql);   
  7. }   
  8. stmt.executeBatch();   
  9.   
  10. PreparedStatement的Batch使用:   
  11. PreparedStatement pstmt  = con.prepareStatement("UPDATE EMPLOYEES  SET SALARY = ? WHERE ID =?");   
  12. for(int i =0;i<length;i++){   
  13.     pstmt.setBigDecimal(1, param1[i]);   
  14.     pstmt.setInt(2, param2[i]);   
  15.     pstmt.addBatch();   
  16. }   
  17. pstmt.executeBatch();   

0 0