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对象用来向数据库发送查询和命令.它由Connection的createStatement()方法创建
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(); 关闭连接, 关闭连接会关闭对应的Statement和ResultSet 对象
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语句相同,但参数不同的批处理中。因此此种形式的批处理经常用于在同一个表中批量插入数据,或批量更新表的数据