银⾏转账javamysql_⼀个银⾏转账业务模型分析:⼤魏Java记
5-7
银⾏转账业务是⼀个典型的事务,我们先介绍基本概念,这样后⾯的代码看起来就⽐较容易理解了。
⼀、事务处理
“事务处理”这个名字的概念,相信⼤多数朋友都有所了解。我们看⼀下中关于“事务处理”的定义:
“在计算机科学中,事务是⽆法被分割的操作,事务处理就是被分割为个体的信息处理。事务必须作为⼀个完整的单元成功或失败,不可能存在部分完成的事务。”
看着是不是有点绕?
好,我们换个视⾓看“事务处理”,从数据库视⾓。
在数据库操作中,事务是由⼀条或者多条SQL语句组成的⼀个⼯作单元。只有当事中的所有操作都正常完成,整个事务才被提交到数据库,如果意向操作没有完成,则整个事务被撤销。
例如zhangsan给lisi转200元钱,对应的SQL是;
UPDATE ACCOUNT set MONEY=MONEY-200 WHERE NAME='zhangsan';
UPDATE ACCOUNT set MONEY=MONEY+200 WHERE NAME='lisi';
转钱这件事,就是⼀个事务处理。所以,事务是以数据为核⼼的,⽽数据是存在关系型数据库上的。因此,应⽤如何操作数据库就成为事务处理中的关键。
Java应⽤操作数据库的模块是JDBC。
⼆、JDBC
JBDC的全称为:Java Database Connectivity,是⼀套⽤于执⾏SQL语句的Java API。应⽤程序可以通过这套API连接到关系型数据库,并使⽤SQL语句来完成对数据库的查询、更新、删除⼯作。
我们先看⼀下JDBC API的内容。
在下⾯的三⾊框中,中间部分是JDBC常⽤的API。
第⼀部分是DataSource接⼝的实现;
第三名部分是DBUtils⼯具库;
JDBC的实现细节如下图所⽰,包含三⼤部分:
(1)JDBC驱动管理器:负责注册特定的JDBC驱动器,通过java.sql.DeviceManager类实现。
(2)Java驱动器API;其中最主要的接⼝是:java.sql.Driver接⼝。
(3)JDBC驱动器:⼀种数据库驱动,由数据库⼚商创建。JDBC启动器实现了JDBC驱动器API,负责与特定的数据库链接,以及处理通信细节。
⼀个完整的JDBC分为六⼤步骤:通过DriverManager加载并注册DB驱动
通过DeiverManager获取数据库连接(DB connection)
通过Connection对象获取Statement对象。
使⽤Statement执⾏SQL语句,⽣成结果集ResultSet。
操作结果集,取出结果。
mysql下载jar包释放数据库资源
需要注意的是:由于Driver类的源码中,已经在静态代码块中完成了数据库驱动的注册,所有为了避免数据库驱动被重复注册,主要在程序中加载驱动类即可。
下⾯我们查看⼀个完成的JDBC⽰例。下图中的标号,就对应上⽂的6个步骤。我们看到第六步释放了Statement和Connection资源。
三、JDBC批处理
在实际开发中,经常需要向数据库发送多条SQL语句。这时如果逐条执⾏这些SQL语句,效率会很低。为此,JDBC提供了批处理机制,可以同时执⾏多条SQL语句。Statement和PreparedStatement都实现了批处理。
PreparedStatement是Statement的⼀个⼦类。PreparedStatement对象可以对SQL语句进⾏预编译。当相同的SQL语句再次执⾏时,数据库只需使⽤缓冲区的数据,⽽不需要对SQL语句再次编译,从⽽有效提⾼了数据的访问效率。
我们查看Statement加载和执⾏批处理的代码,如下图红框所⽰:
我们再看通过PreparedStatement加载和执⾏批处理的代码:
很明显,PreparedStatement的⽅式更灵活。
需要注意的是:Statement和PreparedStatement的executeBactch()⽅法的范围值都是int[]类型的,所以能够进⾏批处理的SQL语句必须是INSERT、UPDATE、DELETE等返回值为int类型的SQK语句。
四、JDBC如何处理事务
针对JDBC处理事务的操作,在Connection接⼝中,提供了三个相关的⽅法,具体如下:
1. setAutoCommit(boolean autoCommit):设置是否⾃动提交事务。
2. commit(): 提交事务
接下来,我们通过⼀个案例展⽰J如何通过JDBC进⾏事务处理。
⾸先看⼀个⼯具类:JDBCUtils。
这个⼯具类避免我们每次操作都要书写:加载数据库驱动、检查数据连接以及关闭数据的连接的代码:
接下来,新建⼀个类,⽤于在两个账号之间转账。
从下图可以看出,本类使⽤了⼯具类JDBCUtils中的⽅法访问数据库。
JDBC关闭事务⾃动提交、提交事务、回滚事务的位置,我⽤红框标出来了,⽐较好理解。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。