`
gudujianxuehu
  • 浏览: 96168 次
  • 来自: ...
社区版块
存档分类
最新评论

JDBC基础理论与实践

阅读更多
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();  


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/darxin/archive/2009/11/14/4809684.aspx
分享到:
评论

相关推荐

    JDBC 3.0数据库开发与设计

    4.6 JNDI与JDBC API 4.6.1 JDBC数据源 4.6.2 实例 4.7 连接池 4.7.1 连接池数据源(Connection PoolDataSource) 4.7.2 连接池处理事件 4.7.3 三层环境下的连接池操作 4.7.4 连接池和DataSource实现 4.7.5 ...

    分库分表理论与实战-基于ShardingJDBC5.4.1(资料+视频教程)

    本资源是一套专注于ShardingJDBC 5.4.1的分库分表理论与实践相结合的教程,旨在帮助开发者掌握在高并发、大数据量场景下的数据库优化技术。内容包括数据库分片的基础知识、ShardingJDBC的配置与使用、真实场景下的分...

    oracle+MySQL+jdbc数据库教程

    本课程提供专业的数据库培训,深入解析Oracle和MySQL这两大主流关系型数据库管理...同时,结合数据库理论与Java编程实践,学员能够在开发过程中高效地集成和操作数据库,从而在软件开发和数据管理领域迈出坚实的一步。

    教学在线留言答疑系统,JavaWeb基础,servlet jsp filter,原生jdbc.zip

    理论与实践相结合:在学习过程中,不仅要关注代码实现,更要理解背后的设计思想和原理。 模块化学习:建议按照项目模块进行学习,从基础到高级,逐步深入。 持续实践与反思:通过实JavaWeb“系统管理”项目资源概览 ...

    设备维修管理系统,JavaWeb 项目,使用原生servlet 和 JDBC。.zip

    理论与实践相结合:在学习过程中,不仅要关注代码实现,更要理解背后的设计思想和原理。 模块化学习:建议按照项目模块进行学习,从基础到高级,逐步深入。 持续实践与反思:通过实JavaWeb“系统管理”项目资源概览 ...

    JSP基础与案例开发详解 光盘part1

    书中内容由浅入深、循序渐进地介绍了JSP的基本运用,其中包括网页布局与修饰、JDBC应用、Servlet应用、JSP运用、EL表达式运用、自定义标签运用、标准标签库运用等。在讲解的过程中,引用了大量的实例,且每一部分...

    原生HTML、css、JavaScript、jdbc连接数据库实现的一个餐饮系统

    通过参与实际项目,你可以应用所学的理论知识,深入了解软件开发或其他领域的实践流程和技术要求。 可放心下载学习借鉴,你会有所收获。 【无积分此资源可私信博主有偿获取】 # 注意 1. 本资源仅用于开源学习和...

    JSP基础与案例开发详解 光盘part2

    书中内容由浅入深、循序渐进地介绍了JSP的基本运用,其中包括网页布局与修饰、JDBC应用、Servlet应用、JSP运用、EL表达式运用、自定义标签运用、标准标签库运用等。在讲解的过程中,引用了大量的实例,且每一部分...

    Java语言实用教程

    本书注意理论与实际的结合,例题短小、精练,将实用性与趣味性相结合,在讲清相关概念的同时注意培养读者运用知识的能力。 本书可作为高等院校相关专业的教材和教学参考书,也可作为读者学习Java语言的自学用书。

    javaweb,图书管理系统,软件设计与分析,期末大作业.zip

    理论与实践相结合:在开发过程中,注重理论与实践的结合,确保您不仅掌握技术原理,还能熟练应用于实际项目中。 团队协作与交流:鼓励您与其他同学组成团队,共同完成项目。通过团队协作与交流,互相学习、共同进步...

    Jmeter性能测试高级项目实践课程资源.rar

    课程从基础讲起,全程以实战为基础,每个知识点通过实际项目演练讲解理论实践结合,更容易理解,就算是小白也能接受 通过系统的学习,独立完成企业性能测试任务,助力你成功升级为性能测试工程师

    使用jsp+servlet+java bean+jdbc实现功能,外加html+css+js手捏页面的图书管理系统.zip

    通过参与实际项目,你可以应用所学的理论知识,深入了解软件开发或其他领域的实践流程和技术要求。 可放心下载学习借鉴,你会有所收获。 【无积分此资源可私信博主有偿获取】 # 注意 1. 本资源仅用于开源学习和...

    JavaWeb期末大作业.zip

    理论与实践相结合:在开发过程中,注重理论与实践的结合,确保您不仅掌握技术原理,还能熟练应用于实际项目中。 团队协作与交流:鼓励您与其他同学组成团队,共同完成项目。通过团队协作与交流,互相学习、共同进步...

    南昌大学javaweb期末大作业-在线商城系统.zip

    理论与实践相结合:在开发过程中,注重理论与实践的结合,确保您不仅掌握技术原理,还能熟练应用于实际项目中。 团队协作与交流:鼓励您与其他同学组成团队,共同完成项目。通过团队协作与交流,互相学习、共同进步...

    JavaWeb期末大作业--在线相册管理系统.zip

    理论与实践相结合:在开发过程中,注重理论与实践的结合,确保您不仅掌握技术原理,还能熟练应用于实际项目中。 团队协作与交流:鼓励您与其他同学组成团队,共同完成项目。通过团队协作与交流,互相学习、共同进步...

    javaweb 期末大作业 在线购书系统 jsp+Servlet+mysql5.6.zip

    理论与实践相结合:在开发过程中,注重理论与实践的结合,确保您不仅掌握技术原理,还能熟练应用于实际项目中。 团队协作与交流:鼓励您与其他同学组成团队,共同完成项目。通过团队协作与交流,互相学习、共同进步...

    CJLU_JavaWeb期末大作业.zip

    理论与实践相结合:在开发过程中,注重理论与实践的结合,确保您不仅掌握技术原理,还能熟练应用于实际项目中。 团队协作与交流:鼓励您与其他同学组成团队,共同完成项目。通过团队协作与交流,互相学习、共同进步...

    Javaweb期末大作业_CPS校园门户网站.zip

    理论与实践相结合:在开发过程中,注重理论与实践的结合,确保您不仅掌握技术原理,还能熟练应用于实际项目中。 团队协作与交流:鼓励您与其他同学组成团队,共同完成项目。通过团队协作与交流,互相学习、共同进步...

    分布式事务实践 解决数据一致性

    2-3 事务原则与实现:JDBC事务(上) 2-4 事务原则与实现:JDBC事务(下) 第3章 使用Docker搭建环境 介绍了Docker的使用,通过Docker将课程环境搭建起来,方便那些不了解这些技术的同学之后的学习。 3-1 docker...

    JAVA社区网络服务系统(源代码+论文).rar

    JAVA社区网络服务系统是一个基于Java技术实现的...这个源码文件包是计算机科学与技术专业学生进行实践操作和学术研究的宝贵资源,有助于学生将理论知识与实际应用相结合,为未来的职业生涯打下坚实的基础。重新回答||

Global site tag (gtag.js) - Google Analytics