JDBC基础理论与实践
2009-11-14 09:02
351 查看
本作品采用知识共享署名-非商业性使用-相同方式共享 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方式创建数据库连接器的代码如下:
]try { // 加载JDBC驱动 Class.forName(driverClassName); // 建立数据库连接 Connection conn = DriverManager.getConnection( url, userName, password); }catch(ClassNotFoundException e) { // 驱动加载失败 }catch(SQLException e) { // 建立数据库连接失败 }
以DataSource方式创建数据库连接器的代码如下:
]// 建立数据源 org.apache.commons.dbcp.BasicDataSource dataSource = new org.apache.commons.dbcp.BasicDataSource(); // 设置基本属性 dataSource.setDriverClassName(driverClassName); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); try { // 建立数据库连接器 Connection conn = dataSource.getConnection(); }catch(SQLException e) { // 建立数据库连接器失败 }
二. SQL声明
在一个数据库连接器中,我们可以调用多条SQL语句。每一条SQL语句的执行由一个SQL声明(java.sql.Statement)完成。数据库连接器有三种声明SQL的方式:一般声明、预编译声明和存储过程声明。几种声明的本质区别在于SQL语句的指定时机,一般声明在执行时指定SQL语句,而后两种声明则在创建时指定SQL语句。
SQL声明的执行方式又分两种:基于检索的executeQuery方法,用于SELECT语句;以及基于变更的executeUpdate方法,用于INSERT、UPDATE、DELETE语句。同时还提供了通用性更强的execute方法。
一般声明
创建一个一般声明很简单,代码如下:]// 创建一个一般声明 Statement state = conn.createStatement();
一般声明通过executeQuery执行一个查询语句(包括SELECT),查询语句的执行结果以结果集(java.sql.ResultSet)的形式提供。代码如下:
String querySql = "select ..."; ResultSet rs = state.executeQuery(querySql);
上述代码也可用如下方式完成:
String querySql = "select ..."; boolean success = state.execute(querySql); if (success) { ResultSet rs = state.getResultSet(); }
一般声明通过executeUpdate执行一个更新语句(包括UPDATE、INSERT、DELETE),通过更新操作影响到的元素个数决定成功与否。代码如下:
String updateSql = "update ..."; int result = state.executeUpdate(updateQql);
上述代码也可用如下方式完成:
String updateSql = "update ..."; boolean success = state.execute(updateSql); if (success) { int result = state.getUpdateCount(); }
预编译声明
与一般声明不同,预编译声明则是在执行前将SQL语句进行预处理,其最大的用处在于可将SQL语句参数化。创建预编译声明时需要指定一个SQL语句,语句中不确定的参数用“?”表示,参数根据序号(以1开始)通过一系列set方法设置。预编译声明的执行操作与一般声明类似但不提供参数。代码样例如下:]// 创建带有参数的SQL语句,参数用“?”表示。 StringBuffer sql = new StringBuffer(); sql.append("insert into T_DOC001 ") .append("(DOC_ID, LANG_TYPE, DOC_NAME, PUB_DATE, SOURCE, SUMMARY)") .append("values(?, ?, ?, ?, ?, ?)"); // 创建预编译声明 PreparedStatement preState = conn.prepareStatement(sql.toString()); // 按序号(从1开始)设置参数值 preState.setString( 1, docId); preState.setInt( 2, langType); preState.setString( 3, docName); preState.setDate( 4, pubDate); preState.setBlob( 5, source); preState.setString( 6, summary); // 执行SQL语句 // 执行方法与一般声明相似,但不用提供参数。 preState.executeUpdate();
存储过程声明
存储过程(Stored Procedure)属于数据库技术,存储过程直接保存在数据库中,由数据库对其进行优化。数据库连接器通过prepareCall创建存储过程声明。代码如下:// 创建存储过程声明 CallableStatement callState = conn.prepareCall("{?= call <procedure-name>[(<arg1>,<arg2>, ...)]}");
关于存储过程声明的详细用法,可参考:
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方法。将数据库连接器的事务处理策略设置为手动提交的代码如下:
]// 将数据库连接器设置成手动提交模式 conn.setAutoCommit(false); try { // 第一个SQL声明的执行 { conn.execute(...); } // 第二个SQL声明的执行 { conn.execute(...); } // 手动提交事务 conn.commit(); }catch(SQLException e) { // 数据库发生错误,事务会滚。 conn.rollback(); }
相关文章推荐
- 基础、理论、实践、实战
- 基础、理论、实践、实战
- 互联网电商大数据环境 ——大数飓数据分析实践培训精华笔记(四)——维度建模基础理论
- JVM理论与实践【类加载器基础】
- Java基础学习总结(53)——HTTPS 理论详解与实践
- awt实现登陆界面+数据库——学java,零基础不怕,不只要理论,更要实践+项目<a href...
- 解析Monte-Carlo算法(基本原理,理论基础,应用实践)
- Java理论和实践:用软引用阻止内存泄漏-Java基础-Java-编程开发
- Microsoft NLayerApp案例理论与实践 - 基础结构层(数据访问部分)
- 基础、理论、实践、实战
- Java基础学习总结(53)——HTTPS 理论详解与实践
- java访问修饰符详解——学java,零基础不怕,不只要理论,更要实践+项目,<a href=http://www.bjweixin.com>太原维信科技提供 </a>
- JDBC基础理论知识
- Java基础学习总结(53)——HTTPS 理论详解与实践
- 解析Monte-Carlo算法(基本原理,理论基础,应用实践)
- 软件工程——理论、方法与实践 之 面向对象基础
- 《软件工程 ——理论、方法与实践》知识概括第六章 面向对象基础
- HTTPS理论基础及其在Android中的最佳实践
- 解析Monte-Carlo算法(基本原理,理论基础,应用实践)
- HTTPS理论基础及其在Android中的最佳实践