JDBC 基础知识总结

1.  何谓JDBC  --- Java Database Connectivity. 由Sun 公司提供的访问数据库的一组java类和接口,用来对数据库进行链接、发送SQL语句、处理返回结果,为开发人员提供了统一的访问数据库入口API,使得开发人员可以不用绑定到特定数据库访问API。

 

2. 应用程序,JDBC API,JDBC 驱动程序,数据库之间的层次关系如下图:

 

3. 

 

4.  JDBC 有四种驱动:

4.1  JDBC-ODBC 桥链接:   把对JDBC接口的访问翻译成对应的ODBC的访问。

      (缺点:执行效率比较低;它需要在客户机上安装一个ODBC驱动,使用这一类驱动,就失去JDBC平台无关的好处;此外,ODBC驱动器需要客户端的管理

     

4.2  JDBC-Native 本地API: 提供了一个构建在本地数据库驱动上的JDBC接口而没有使用ODBC。

    (缺点:JDBC驱动将标准的JDBC调用转化为对数据库API的本地调用,使用这一类的驱动也会失去JDBC平台无关性的好处,并且需要安装客户端的本地代码)

4.3  JDBC-Network: JDBC-network桥不需要客户端的数据库驱动。它使用网络上的中间服务器来访问一个数据库可以实现负载均衡、连接缓冲池和数据缓存等。

        只需要相对更少的下载时间,具有平台独立性,而且是不需要在客户端安装并取得控制权,很适合于Internet上的应用。

4.4  纯JAVA驱动:纯Java数据库驱动来提供直接的数据库访问,由于这类驱动运行在客户端,并且直接访问数据库,因此运行在这个模式暗示要且用一个两层的体系

 

5.  JDBC API 有哪些

 5.1    java.sql.Connection   链接接口

          java.sql.Driver          驱动接口

          java.sql.DriverManager  驱动管理类

          java.sql.CallableStatement   可调用申明,用于调用存储过程。

          java.sql.PreparedStatement 一个预编译的SQL对象接口

          java.sql.ResultSet              一个结果集接口

          ...  等等

 

5.2    javax.sql   主要是对链接管理,分布式事物,连接池的管理.

        

6.  Connection  ---   有两种类型的链接(直接连接,连接池),其中直接连接是指在JAVA代码中,写数据打开,关闭代码来维护连接;  连接池是指J2EE服务器管理的连接.

 

7.  JDBC 编程主要分以下步骤:

7.1  装载并注册JDBC程序

       加载 JDBC 驱动需调用 Class 类的静态方法 forName(),向其传递要加载的 JDBC 驱动的类名:   Class.forName(driver);

       Oracle:  Class.forName("oracle.jdbc.driver.OracleDriver");

          SQLServer: Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver");

          MySql:   Class.forName(“com.mysql.jdbc.Driver");

7.2  定义URL   

  URL指定数据库服务器的主机名,端口以及希望与之连接的数据库名

  Oracle:  URL = "jdbc:oracle:thin:@localhost:1521:hrSys" ;

  SQLServer: URL = "jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=hrSys";

  MySql:  URL = “jdbc:mysql://localhost:3306/hrSys

7.3 建立连接

       有了数据库 URL 用户名密码就可以和数据库建立连接,  连接的类为 Connection, 格式为:    Connection conn = DriverManager.getConnection(URL地址,用户名,密码);

          Connection conn = DriverManager.getConnection(URL,username,password);

7.4 建立Statement对象

     Statement对象用来向数据库发送查询和命令.它由ConnectioncreateStatement()方法创建

       Statement  stmt = conn.createStatement();

7.5  准备并执行调用SQL语句

     有了statement对象就可以使用它来发送SQL语句

    String sql = “select * from table”;

    ResultSet  rs = stmt . executeQuery(sql);

    Statement对象的常用方法:

    executeQuery( ): 执行SQL查询并在ResultSet中返回数据, ResultSet可能为空,但不会为null.

    executeUpdate( ): 执行update , insert , delete 命令,返回受影响的行数,可以为0. 它还支持DDL命令, create table , drop table , alter table .

          PS: 

               使用PreparedStatement 执行预编译的SQL语句这样可以比使用拼字符串更安全

           String sql = “select * from  student   where   name=? and id = ?”       其中name为字符型数据 id 为整数

 

     PreparedStatement  pstmt = conn . preparedStatemengt(sql);

 

          pstmt.setString(1,”lilei”);   第一个问号值为 lilei

 

          pstmt.setInt(2,5);           第二个问号值为 5

 

    ResultSet rs = pstmt.executeQuery( );

 

 

7.5  出来ResultSet 结果集

        ResultSet next 方法返回一个布尔值  TRUE 表下面还有数据,并移动到表的下一行。

       使用ResultSet对象的 getXXX(“字段名”)获取该行中字段的数据,或者getXXX("index")来获取索引.

7.6 释放资源     

     Connection.close(); 关闭连接,  关闭连接会关闭对应的StatementResultSet  对象

 

 

8.  JDBC   批处理方式

     JDBC 批处理有两种方式:

  8.1  第一种方式:Statement.addBatch(sql)  Statement中有一个集合属性list存储所有的sql
    executeBatch()方法:执行批处理命令
      clearBatch()方法:清除批处理命令 

 

 1 try{
 2 
 3 conn = DBManager.getConnection();
 4 
 5 String sql1 = "insert into testbatch(id,name) values(1,'aa')";
 6 
 7 String sql2 = "insert into testbatch(id,name) values(2,'bb')";
 8 
 9 String sql3 = "delete from testbatch where id=1";
10 
11 st = conn.createStatement();
12 
13 st.addBatch(sql1);//把sql语句加入到批中
14 
15 st.addBatch(sql2);
16 
17 st.addBatch(sql3);
18 
19 //该方法返回值为int[],返回的是每条sql语句执行后对表中记录的影响行数
20 
21 st.executeBatch(); 
22 
23 st.clearBatch();
24 
25 }catch (Exception e) {
26 
27 throw new RuntimeException(e);
28 
29 }finally{
30 
31 DBManager.release(conn, st, rs);
32 
33 }
34 
35 }

采用Statement.addBatch(sql)方式实现批处理的

优点:可以向数据库发送多条不同的SQL语句。

缺点:   一是SQL语句没有预编译;     二是当向数据库发送多条语句相同,但仅参数不同的SQL语句时,需重复写上很多条SQL语句(如:sql1, sql2那样的繁琐)

 

8.2  第二种方式:PreparedStatement.addBatch()

 1  {
 2 
 3 long starttime = System.currentTimeMillis();
 4 
 5 Connection conn = null;
 6 
 7 PreparedStatement st = null; //list
 8 
 9 ResultSet rs = null;
10 
11 try{
12 
13 conn = DBManager.getConnection();
14 
15 String sql = "insert into testbatch(id,name) values(?,?)";
16 
17 st = conn.prepareStatement(sql); //预编译次SQL语句 ;
18 
19 for(int i=0;i<10000004;i++){
20 
21 st.setInt(1, i);
22 
23 st.setString(2, "aa" + i);
24 
25 st.addBatch();   // 加入到批处理中;
26 
27 if(i%1000==0){ // 由于添加记录数目较大,可能导致内存爆满,所以每千条提交一次,并清理批处理内容
28 
29 st.executeBatch();
30 
31 st.clearBatch();
32 
33 }
34 
35 }
36 
37 st.executeBatch();//为了保证最后那4条sql语句也会被提交
38 
39 }catch (Exception e) {
40 
41 throw new RuntimeException(e);
42 
43 }finally{
44 
45 DBManager.release(conn, st, rs);
46 
47 }
48 
49 long endtime = System.currentTimeMillis();
50 
51 System.out.println("共花了: " + (endtime-starttime)/1000 + "秒");
52 
53 }

 采用PreparedStatement.addBatch()实现批处理

• 优点:发送的是预编译后的SQL语句,执行效率高。

• 缺点:只能应用在SQL语句相同,但参数不同的批处理中。因此此种形式的批处理经常用于在同一个表中批量插入数据,或批量更新表的数据

 

 

 

 

 

posted @ 2014-05-01 21:35  yql_dragonfly  阅读(352)  评论(0编辑  收藏  举报