1.取消自动提交事务
* JDBC默认是自动提交事务的,即:每当执行一条DML操作后,就自动执行COMMIT
* 若希望执行控制事务,需要先取消自动提交事务,然后再控制事务。* 事务的控制是Connection管理的。
*/
conn = DBUtil.getConnection();
//取消自动提交事务
conn.setAutoCommit(false);
注意:在向连接池还连接的时候,要将提交改为自动
//用完连接之后 改回自动提交
conn.setAutoCommit(true);
2. 批量执行
*
* 当有大批量数据需要插入到数据库某张表时,影响插入性能的主要因素:
* 1.事务,一条DML执行一次事务的效率是很差的,可以考虑多条记录使用同一个事务
* 2.PreparedStatement的使用可以减少执行计划的生成 (每一条SQL语句都使用同一个执行计划)
* 3.减少网络调用,客户端一次发送一条SQL语句与一次发送多条SQL语句到数据库服务端的效率也是不一样的。
* 批量执行就是减少网络调用,大批量执行SQL语句时应当考虑使用批量执行操作。
/*2.1
* 在一个事务中插入1000条可以减少事务对表的实际写操作次数,提高效率
*/
conn.setAutoCommit(false);
String sql = " INSERT INTO userinfo_snow "
+ " (id,username,password,email,nickname,account) "
+ "VALUES "
+ "(?,?,'123456',?,?,10000) ";
ps = conn.prepareStatement(sql);
long start = System.currentTimeMillis();
for(int i=10000;i<20000;i++){
ps.setInt(1, i);
ps.setString(2, "test"+i);
ps.setString(3, "test"+i+"@qq.com");
ps.setString(4, "nickname"+i);
/*
* 执行executeUpdate方法,会将?对应的一组数据发送给数据库服务端,
* 那么调用10000次该方法就会发送10000次,增加了网络调用次数,会降低网络传输效率
*/
// ps.executeUpdate();
//添加到本地缓存中(添加到批中)
ps.addBatch();
}
//执行批操作(将缓存内容一次性发送给数据库执行)
int[] d = ps.executeBatch();//每一次批操作影响数据库的次数
System.out.println(d.length);
conn.commit();
long end = System.currentTimeMillis();
System.out.println("插入数据成功!耗时为:"+(end-start)+"ms");
3. 自动返回主键
* 允许我们在插入一条信息的同时将该条数据中指定的字段返回。
* 通常返回的都是系统自动生成的值,例如主键值
* 使用Connection 带两个参数的方法生成PS,其中第二个参数是一个字符串数组,
* 数组中每一个字符串内容应当是需要知道插入后该条记录希望返回值的字段名。
*/
PreparedStatement ps = conn.prepareStatement(sql, columnNames);
//取出id
ResultSet rs = ps.getGeneratedKeys();
rs.next();
int id = rs.getInt(1);
userinfo.setId(id);
4. * DAO 数据连接对象
* DAO泛指一个层次的类,DAO层是在业务逻辑层与数据库之间的层次
* 作用:让业务逻辑对数据库的操作完全面向对象化,并且只对数据库的具体操作透明。
* 使得业务逻辑层的类只需要关注业务操作即可。
为了建立一个健壮的Java应用,需将所有对数据源的访问操作抽象封装在一个公共API中,需要:
- 建立一个接口,接口中定义了应用程序中将会用到的所有事务方法
- 建立接口的实现类,实现接口对应的所有方法,和数据库直接交互
在应用程序中,当需要和数据源交互时则使用DAO接口,不涉及任何数据库的具体操作。DAO通常包括:
1. 一个DAO工厂类;
2. 一个DAO接口;
3. 一个实现DAO接口的具体类;
4. 数据传递对象(实体对象(Entity)或值对象(Value Object,简称VO)).
1. JDBC高级编程
1.1. JDBC高级编程
1.1.1. 事务简介
事务(Transaction):数据库中保证交易可靠的机制。JDBC支持数据库中的事务概念,并且在JDBC中,事务默认是自动提交的。
可能存在的问题:某些业务逻辑必须在一个事务中完成。如图-1所示。
图-1事务示意图
事务特性介绍:ACID
- 原子性(Atomicity):事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行
- 一致性(Consistency):事务在完成时,必须使所有的数据都保持一致状态
- 隔离性(Isolation):由并发事务所作的修改必须与任何其它并发事务所作的修改隔离
- 持久性(Durability):事务完成之后,它对于系统的影响是永久性的
事务是数据库的概念,JDBC支持事务,本质还是在数据库中实现的。
1.1.2. JDBC事务API
JDBC中和事务相关API:
- Connection.getAutoCommit() :获得当前事务的提交方式,默认为true
- Connection.setAutoCommit():设置事务的提交属性,参数是true:自动提交;false:不自动提交
- Connection.commit():提交事务
- Connection.rollback():回滚事务
1.1.3. JDBC标准事务编程模式
JDBC处理事务的通常模式:
- 先将事务的自动提交关闭;
- 执行事务中的若干SQL语句;
- 事务提交;SQL失败则回滚;
- 恢复JDBC的事务提交状态;释放资源。
- try{
- // 1.定义用于在事务中执行的SQL语句
- String sql1 = "update account set amount = amount - " + amount + " where id = '" + from + "'";
- String sql2 = "update account set amount = amount + " + amount + " where id = '" + to + "'";
- autoCommit = con.getAutoCommit(); // 2.获得自动提交状态
- con.setAutoCommit(false); // 3.关闭自动提交
- stmt.executeUpdate(sql1); // 4.执行SQL语句
- stmt.executeUpdate(sql2);
- con.commit(); // 5.提交
- con.setAutoCommit(autoCommit); // 6.将自动提交功能恢复到原来的状态
- //其他语句;
- }catch(SQLException e){
- conn.rollback();//异常时回滚
- }
1.2. 批量更新
1.2.1. 批量更新的优势
批处理:发送到数据库作为一个单元执行的一组更新语句。批处理降低了应用程序和数据库之间的网络调用,相比单个SQL语句的处理,批处理更为有效