本作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。
Java技术中,JDBC是所有数据库操作的基础,不管是iBATIS还是Hibernate,其基础无不来自于JDBC。掌握了JDBC,对通用库的理解就简单了。
一. 数据库连接器
数据库连接器(java.sql.Connection)是JDBC操作的核心,一次完整的数据库操作均起始于数据库连接器。
有多种方式创建数据库连接器,基本方式有两种:DriverManager方式和DataSource方式。其中DriverManager是最原始的连接方式;DataSource方式统一了接口,通过不同的实现完成更多的任务,如Apache的DBCP就在DataSource基础上提供了强大的缓冲池技术,大大提高了创建数据库连接器的速度。
创建数据库连接器时需要提供四个基本数据,分别为
JDBC驱动:driverClassName
数据库连接字:url
数据库访问所需要的用户名:username
数据库访问所需要的密码:password
其中
JDBC驱动的值可以是:
MySQL:"com.mysql.jdbc.Driver"
PostgreSQL:"org.postgresql.Driver"
Oracle:"oracle.jdbc.driver.OracleDriver"
Sybase:"com.sybase.jdbc2.jdbc.SybDriver"
SQLServer:"com.microsoft.jdbc.sqlserver.SQLServerDriver"
DB2:"com.ibm.db2.jdbc.net.DB2Driver"
数据库连接字的值可以是:
MySQL:"jdbc:mysql://DbComputerNameOrIP:3306/DbName"
PostgreSQL:"jdbc:postgresql://DbComputerNameOrIP:3306/DbName"
Oracle:"jdbc:oracle:thin:@DbComputerNameOrIP:1521:DbName"
Sybase:"jdbc:sybase:DbName:DbComputerNameOrIP:2638"
SQLServer:"jdbc:microsoft:sqlserver://DbComputerNameOrIP:1433;databaseName=DbName"
DB2:"jdbc:db2://DbComputerNameOrIP/DbName"
以DriverManager方式创建数据库连接器的代码如下:
以DataSource方式创建数据库连接器的代码如下:
二. SQL声明
在一个数据库连接器中,我们可以调用多条SQL语句。每一条SQL语句的执行由一个SQL声明(java.sql.Statement)完成。
数据库连接器有三种声明SQL的方式:一般声明、预编译声明和存储过程声明。几种声明的本质区别在于SQL语句的指定时机,一般声明在执行时指定SQL语句,而后两种声明则在创建时指定SQL语句。
SQL声明的执行方式又分两种:基于检索的executeQuery方法,用于SELECT语句;以及基于变更的executeUpdate方法,用于INSERT、UPDATE、DELETE语句。同时还提供了通用性更强的execute方法。
一般声明
创建一个一般声明很简单,代码如下:
一般声明通过executeQuery执行一个查询语句(包括SELECT),查询语句的执行结果以结果集(java.sql.ResultSet)的形式提供。代码如下:
上述代码也可用如下方式完成:
一般声明通过executeUpdate执行一个更新语句(包括UPDATE、INSERT、DELETE),通过更新操作影响到的元素个数决定成功与否。代码如下:
上述代码也可用如下方式完成:
预编译声明
与一般声明不同,预编译声明则是在执行前将SQL语句进行预处理,其最大的用处在于可将SQL语句参数化。创建预编译声明时需要指定一个SQL语句,语句中不确定的参数用“?”表示,参数根据序号(以1开始)通过一系列set方法设置。预编译声明的执行操作与一般声明类似但不提供参数。代码样例如下:
存储过程声明
存储过程(Stored Procedure)属于数据库技术,存储过程直接保存在数据库中,由数据库对其进行优化。数据库连接器通过prepareCall创建存储过程声明。代码如下:
关于存储过程声明的详细用法,可参考:
http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0802tiwary/
三. 事务处理
根据业务的不同多个SQL声明可以组成一个事务,在一个事务中保证了其中的所有SQL声明或者全部执行成功或者都不执行。简单的说,事务就是把一件事情分成几个步骤,并且确保这件事情的所有步骤要么全部做完,要么就全部都没做,不存在只做了其中几个步骤的可能。
在JDBC中事务的处理由数据库连接器完成,事务处理的最小单元就是一个SQL声明。数据库连接器中针对事务的操作有两种:commit及rollback。commit使SQL声明的执行立即生效而rollback则使执行了的SQL声明无效。
根据业务的不同,数据库连接器提供两种处理事务的策略:自动提交与手动提交。默认情况下,数据库连接器的事务处理策略是自动提交,在自动提交模式下,commit及rollback不必手动调用。JDBC会为每一个SQL声明提供独立的事务,执行每一个声明时立即commit,并在出现错误时自动rollback。这种传统的提交方式不能完成我们对事务的要求,所以我们必须用手动提交的方式完成事务处理。手动提交模式需要根据业务逻辑在适当的位置调用commit及rollback方法。将数据库连接器的事务处理策略设置为手动提交的代码如下: