JDBC的事务控制和批量处理

 

一、 在实际的应用中,很少只局限于对单表进行操作,通常会涉及多表操作。例如银行的取款操作,它至少需要两个步骤——首先进行取款操作,取款成功后更改账户金额;其次记录日志,记录此次取款的时间及金额等。这两个步骤是需要同时成功才算完成取款交易的。要完成上述的需求就需要借助于JDBC的事务管理和批量处理。

术语“ACID”是一个简称,每个事务处理必须满足ACID原则,即原子性(A),一致性(C),隔离性(I)和持久性(D)。

1   JDBC事务控制

所谓事务:是指一组原子操作(一组SQL语句执行)的工作单元

这个工作单元中的所有原子操作在进行期间,与其他事务隔离,免于因数据来源的交相更新而发生混乱,事务中的所有原子操作要么全部执行成功,要么全部失败。

创建JDBC的事务主要分以下步骤:

a)  设置事务的提交方式为非自动提交:conn.setAutoCommit(false); 

b)  将需要添加事务的代码放在try、catch块中:
try {
       //需要添加事务的业务代码
} catch (SQLException e) {
       ...
}

c)  在try块内添加提交操作,表示操作无异常,提交事务:conn.commit();   //正常流程,提交事务

d)  在catch块内添加回滚事务,表示操作出现异常,撤消事务:conn.rollback();   //发生异常,撤消事务

e)  设置事务提交方式为自动提交:conn.setAutoCommit(true);  //自动提交事务

2   JDBC批量处理

Statement的execute()等方法一次只能执行一条SQL语句,如果同时有多条SQL语句要执行的话,可以使用addBatch()方法将要执行的SQL语句加入进来,然后执行executeBatch()方法,这样就可以在一次方法调用中执行多条SQL语句,以提高执行效率。

为了保证这一批语句要么全部成功,要么全部失败,应该把批处理放置在事务中进行。

使用PreparedStatement也可以进行批处理。

注意:批处理中执行的语句只能是更新语句(insert、delete、update),否则会抛出异常

简单地说,JDBC可做三件事:与数据库建立连接、发送 SQL 语句并处理结果。接下来通过几个简单的示例演示JDBC的应用。

3   PreparedStatement的使用

PreparedStatement表示预编译的SQL语句的对象。

实例——prepdemo:根据传入不同的id查询学生信息。

4   对JDBC操作数据库的工具类的封装

对获得Connection对象进行封装

a)  将数据库的配置信息写到一个属性文件中,然后用IO流去获取,当需要修改数据库连接的时候只要改动配置文件即可。

b)  在src下新建属性文件jdbc.properties,添加如下内容:

driver=com.mysql.jdbc.Driver

url=jdbc:mysql://localhost:3306/test

username=root

password=root

对关闭JDBC资源类的封装

– 新建DbClose.java类,添加方法关闭结果集对象、语句对象、连接对象。

– 在执行增加、删除、修改的时候可以使用代码关闭连接:DbClose.close(Statement stmt, Connection conn);

– 在执行查询之后使用如下代码关闭连接:DbClose.close(ResultSet rs, Statement stmt, Connection conn);

对执行数据库操作类的封装

– 在一个程序中会有很多地方要操作数据库,那么对执行数据库操作同样需要修改。新建ControlDB.java。

5   JDBC对LOB的读写

在JDBC中提供了java.sql.Blob和java.sql.Clob,两个类分别代表BLOB与CLOB数据。

a)  BLOB(Binary Large Object):用于存储大量二进制数据。

b)  CLOB(Character Large Object):用于存储大量文本数据。

c)  可以使用PreparedStatement的setBinaryStream()、setCharacterStream()、setAsciiStream()、setUnicodeStream()等方法将其存入数据库中。

示例(blobdemo.java),向content列插入大量文本内容,向image列插入一张图片。

– 创建stuinfo表,并添加id字段、姓名字段、简介字段、头像字段等内容,将简介字段设为mediumtext类型,头像字段设置为BLOB类型。

– 首先准备一个文本文件,里面的内容可以自行设置,文本文件命名为“text.txt”;再准备一张图片,命名为“bzc.bmp”。将文本文件与图片放置于src目录之下。新建MyBlobTest.java,添加代码:

pstat=con.prepareStatement("insert into stuinfo(name,content,image) values(?,?,?)");

BufferedReader br=null;

InputStream isimg=null;

pstat.setString(1,“test”);//第一个?对应的参数值

br=new BufferedReader(new FileReader(“src/text.txt"));

pstat.setCharacterStream(2,br);

isimg=new FileInputStream("src/DSCF3318.JPG");

pstat.setBinaryStream(3, isimg);

if(pstat.executeUpdate()==1)

        System.out.println("插入成功");

else

        System.out.println("插入失败");

LOB的读取

新建MyBlobTestSelect.java,添加代码。

pstat=con.prepareStatement("select * from stuinfo where name=?");

ResultSet rs=null;

pstat.setString(1,"test");

rs=pstat.executeQuery();

while(rs.next()){

    br=new BufferedReader(rs.getCharacterStream(3));

    String str=null;

   while((str=br.readLine())!=null){

       System.out.println(str);

       str=br.readLine();

    }

}

6   本节重点:术语“ACID”是一个简称,每个事务处理必须满足ACID原则,即原子性(A),一致性(C),隔离性(I)和持久性(D)。JDBC事务控制

对JDBC操作数据库的工具类的封装。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值