一、JDBC 概念

什么是JDBC?
通俗地说:JDBC是java和关系数据库的之间的桥梁;
根据"百科名片"所描述:

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名。

二、JDBC组成

JDBC有两部分组成: JDBC APIJDBC Driver Interface.
JDBC API:是提供给开发者的一组独立于数据库的API,对任何数据库的操作,都可以用这组API来进行.那么要把这些通用的API翻译成特定数据库能懂的"指令",就要由JDBC Driver Interface来实现了;
JDBC Driver Interface: 是面向JDBC驱动程序开发商的编程接口,它会把我们通过JDBC API发给数据库的通用指令翻译给他们自己的数据库.
为了使客户端程序独立于特定数据库驱动程序,JDBC规范建议开发者使用接口编程方式,即尽量使应用依赖java.sql 及javax.sql中的接口和类.

四、JDBC驱动程序类型

1.JDBC-ODBC桥加ODBC驱动程序:需要ODBC驱动,适合于企业网或三层结构应用程序(通过将JDBC调用委托给ODBC接口)
2.本地API:需要驱动程序的二进制代码支持(一部分java编写,一部分委托给数据库客户端代码实现)
3.JDBC网络纯java驱动程序:将JDBC转换为与DBMS无关的网络协议,又被某服务器转换为一种DBMS协议,以操作各种数据库(驱动程序由中间件服务器提供)
4.本地协议纯java驱动程序:将JDBC调用直接转换成JDBC所使用的网络协议 (全部由JAVA实现,直接和数据库访问)

五、详解JDBC原理

1.结构:

DriverManager (是一工厂实现类,用了工厂方法模式)
|
Dirver (是驱动程序对象的接口,指向具体数据库驱动程序对象=DriverManager.getDriver(String URL))
|
Connection (是连接对象接口,指向具体数据库连接对象=Drivermanager.getConnection(String URL))
|
Statement (执行静态SQL语句接口,=Connection.CreateStatement())
|
ResultSet (是指向结果集对象的接口,=Statement.excuteXXX())

2.工作原理:

(1).装载驱动程序:(实例化时自动向DriverManager注册
(DriverManager.registerDriver())
(1).Class.forName(driver)
(2).Class.forName(driver).newInstance()
(3).new driver()

(2).取得数据库连接(Connect to the DataBase)
A.用DriverManager取数据库连接
Connection cn = DriverManager.getConnection(url,uid,pwd);
B.用jndi(java的命名和目录服务)方式:多用于jsp

Context ctx = (Context) new InitialContext().lookup("java:comp/env");
DataSource ds = (DataSource) ctx.lookup(jndi);
Connection cn = ds.getConnection();

(3).执行sql语句(Execute the SQL)
A.用Statement来执行sql语句(主要是不带参的SQL)

    Statement sm = cn.createStatement();
    sm.executeQuery(sql); // 执行数据查询语句(select
    sm.executeUpdate(sql); // 执行数据更新语句(deleteupdateinsertdrop等

B.用PreparedStatement来执行sql语句(带参SQL)

String  sql  = "insert into CUSTOMER(id,name) values (?,?)";
PreparedStatement ps = cn.prepareStatement(sql);
ps.setInt(1,xxx);
ps.setString(2,xxx);
...
ResultSet rs = ps.executeQuery(); // 查询
int c = ps.executeUpdate(); // 更新

C.用PreparedStatement来执行sql语句(批量更新或删除SQL)

PreparedStatement pstmt  =  con.prepareStatement("UPDATE EMPLOYEES  SET SALARY = ? WHERE ID = ?");
for(int i =0;i<length;i++){
    pstmt.setBigDecimal(1, param1[i]);
    pstmt.setInt(2, param2[i]);
    pstmt.addBatch();
}
pstmt. executeBatch();

D.用CallablePrepareStatement来调用存储过程

 CallableStatement cstmt = con.prepareCall("{call getTestData(?, ?)}");
 cstmt.registerOutParameter(1, java.sql.Types.TINYINT);
 cstmt.registerOutParameter(2, java.sql.Types.DECIMAL, 3);
 cstmt.executeQuery();
 byte x = cstmt.getByte(1);
 java.math.BigDecimal n = cstmt.getBigDecimal(2, 3);

(4).事务的处理(JDBC的事务处理简单,在执行多条更新语句后,加cn.commit()或cn.rollback()就可以)
A.关闭Connection的自动提交
connection.setAutoCommit(false);
B.执行一系列sql语句:执行新sql前,以前的Statement(或PreparedStatemet)须close

Statement sm ;
sm = cn.createStatement(insert into user...);
sm.executeUpdate();
sm.close();
sm = cn.createStatement("insert into corp...);
sm.executeUpdate();
sm.close();

C.提交
cn.commit();
D.如果发生异常,回滚:
cn.rollback();

(5).处理执行结果:
A.查询语句,返回记录集ResultSet
B.更新语句,返回数字,表示该更新影响的记录数(0,表示未更新,-1表示更新失败)

C.ResultSet的方法while(re.next())
next()将游标往后移动一行如果成功返回true否则返回false
getInt("id")或getSting("name")返回当前游标下某个字段的值

(6).关闭数据库连接

rs.close();
ps.close(); /stat.close();
con.close();