- 事物处理
- 批量更新
- 返回自动主键
- DAO
1,事物处理
什么是事物?java
事务(Transaction):数据库中保证交易可靠的机制。JDBC支持数据库中的事务概念,而且在JDBC中,事务默认是自动提交的。mysql
事务提交的方式有两种:sql
- 显示提交:使用commit;
- 自动提交:执行DDL或DCL语句,或者程序正常退出;
当事务所包含的任意一个数据库操做执行失败后,应该回滚事务(rollback),使该事务中所作的修改所有失效。数据库
事务回滚有两种方式:数组
- 显示回滚:使用rollback。
- 自动回滚:系统错误或者强行退出。
事务特性介绍:(ACID) (1)原子性(Atomicity):事务必须是原子工做单元;对于其数据修改,要么全都执行,要么全都不执行 (2)一致性(Consistency):事务在完成时,必须使全部的数据都保持一致状态 (3)隔离性(Isolation):由并发事务所做的修改必须与任何其它并发事务所做的修改隔离 (4)持久性(Durability):事务完成以后,它对于系统的影响是永久性的 事务是数据库的概念,JDBC支持事务,本质仍是在数据库中实现的。并发
JDBC中和事务相关API:app
- Connection.getAutoCommit() :得到当前事务的提交方式,默认为true
- Connection.setAutoCommit():设置事务的提交属性,参数是true:自动提交;false:不自动提交
- Connection.commit():提交事务
- Connection.rollback():回滚事务
JDBC处理事务模式: (1)先将事务的自动提交关闭; (2)执行事务中的若干SQL语句; (3)事务提交;SQL失败则回滚; (4)恢复JDBC的事务提交状态;释放资源。dom
事务隔离级别:工具
事务的并发读问题:性能
- 脏读:读取到另外一个事务未提交更新数据,即读取到了脏数据;
- 不可重复读:对同一记录的两次读取不一致,由于另外一事物对该记录作了修改;
- 幻读(虚读):对同一张表的两次查询不一致,由于零壹拾伍插入了一条记录;
四大隔离级别:
四个等级的事务隔离级别,在相同数据环境下,使用相同的输入,执行相同的工具,根据不一样的隔离级别,能够致使不一样的结果。不一样事务隔离级别可以解决的数据并发问题的能力是不一样的。
-
SERIAUZABLE(串行化):不会出现任何并发性问题,由于它是对同一数据的访问是串行的,非并发访问的。 性能最差
-
REPEATABLEREAD(可重复读):防止脏读和不可重复读,不能处理幻读问题。性能比SERIAUZABLE好
-
READCOMMITTED(读已提交数据):防止脏读,没有处理不可重复读,也没有处理幻读。性能比REPEATABLEREAD。
-
READUNCOMMITTED(读未提交数据):可能出现任何事物并发问题,性能最好;
2,批量更新
批量更新主要方法:
- PreparedStatement.addBatch():将多条预编译的SQL语句,添加到语句列表中。
- PreparedStatement.executeBatch():把语句列表中的全部SQL语句,发送给数据库处理。
- PreparedStatement.clearBatch():清空当前SQL语句列表。
批量添加:
public int[] insBatch() { Connection connection = null; Statement statement = null; String sql = ""; try { //获取数据链接 connection = basicUse.getConnection(); //获取发送sql指令执行sql对象 statement = connection.createStatement(); for (int i = 0; i < 10; i++) { StringBuffer sbf = new StringBuffer("insert into student (name, age, addr, hobby) "); sbf.append(" values ('kenx',24,'上海','篮球')"); sql = sbf.toString(); System.out.println("执行sql" + sql); //将指定SQL添加到Statement对象的当前命令列表中 statement.addBatch(sql); } //执行成功返回更新计数的数组 int[] success = statement.executeBatch(); //批量执行全部sql返回一个更新计数的数组 return success; } catch (Exception e) { e.printStackTrace(); return null; } finally { //执行完数据库操做后记得关闭数据库链接资源 try { statement.close(); connection.close(); } catch (SQLException e) { e.printStackTrace(); } } }
批量更新:
public int[] updBatch() { Connection connection = null; Statement statement = null; String sql = ""; try { //获取数据链接 connection = basicUse.getConnection(); //获取发送sql指令执行sql对象 statement = connection.createStatement(); for (int i = 1; i < 10; i++) { StringBuffer sbf = new StringBuffer("update student set hobby='足球'"); sbf.append(" where id=" + i); sql = sbf.toString(); System.out.println("执行sql" + sql); //将指定SQL添加到Statement对象的当前命令列表中 statement.addBatch(sql); } //执行成功返回更新计数的数组 int[] success = statement.executeBatch(); //批量执行全部sql返回一个更新计数的数组 return success; } catch (Exception e) { e.printStackTrace(); return null; } finally { //执行完数据库操做后记得关闭数据库链接资源 try { statement.close(); connection.close(); } catch (SQLException e) { e.printStackTrace(); } } }
3,返回自动主键
JDBC API:
ResultSet java.sql.Statement.getGeneratedKeys() throws SQLException
例:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; public class Tester { public static void main(String[] args) throws Exception { // 注册数据库驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver()); // 获取链接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "***"); // 准备SQL String sql = "insert into user(name) values('Belin')"; // 准备语句,配置为自动返回生成主键。 PreparedStatement pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); // 执行语句 pstmt.executeUpdate(); // 获取主键值,是一个ResultSet。 ResultSet rs = pstmt.getGeneratedKeys(); if (rs.next()) { System.out.println(rs.getInt(1)); } } }
DAO:
什么是DAO? Data Access Object 数据访问对象,创建在数据库和业务层之间,封装全部对数据库的访问。
DAO的做用:将数据访问逻辑和业务逻辑分开。
DAO一般包括: ①,一个DAO工厂类
②,一个DAO接口
③,一个实现DAO接口的具体类
④,数据传递对象(实体对象或值对象)
实体对象:
将java程序中的对象对应到关系数据库的表中
表和类对应
表中的字段和类的属性对应
记录和对象对应
实现的步骤:
- 先创建模型的对象domain;
- 编写DAO接口;
- 定义DAO实现类;
- 生产DAO测试类;
- 在DAO测试类中测试方法;