1、什么是JdbcTemplate
- Spring框架对JDBC进行封装,使用JdbcTemplate方便实现对数据库的操作
2、JdbcTemplate增删改查
(1)新增
public void insert(){
String sql = "insert into book values(?,?,?)";
Object[] args = {1,2,3};
int update = jdbcTemplate.update(sql,args);
}
//批量插入
public void batchInsert(List<Object[]> args){
String sql = "insert into book values(?,?,?)";
int[] ints = jdbcTemplate.batchUpdate(sql,args);
}
(2)修改
public void update(){
String sql = "update book set name=?,status=? where id=?";
Object[] args = {1,2,3};
int update = jdbcTemplate.update(sql,args);
}
//批量修改
public void batchUpdateBook(List<Object[]> batchArgs) {
String sql = "update t_book set name=?,status=? where id=?";
int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);
}
(3)删除
public void delete(){
String sql = "delete from book where id = ?";
int update = jdbcTemplate.update(sql,1);
}
//批量删除
public void batchDeleteBook(List<Object[]> batchArgs) {
String sql = "delete from book where id=?";
int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);
}
(4)查询
//查询数量
public void selectCount(){
String sql = "select count(*) from book";
Integer count = jdbcTemplate.qqueryForObject(sql,Integer.class);
}
//查询单条记录
public void selectById(){
String sql = "select * from book where id = ?";
Book book = jdbcTemplate.queryForObject(sql,new BeanPropertyRowMapper<Book>(Book.class),id);
}
//返回list集合
public void findAll(){
String sql = "select * from book";
List<Book> list = jdbcTemplate.query(sql,new BeanPropertyRowMapper<Book>(Book.class));
}
3、什么是事务
- 事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败则所有操作都失败
4、事务特性
- 原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用
- 一致性(Consistency):一旦事务完成(不论成功失败),系统必须确保它所建的业务处于一致状态
- 隔离性(Isolation):多个事务同时处理相同数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏
- 持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响
5、在Spring进行事务管理操作有两种方式
- 编程式事务管理
- 声明式事务管理
6、Spring事务管理底层使用的是AOP原理
7、在Service类上面或者方法上面添加注解@Transactional开始事务
8、propagation:事务传播机制
- PROPAGATION_REQUIRED:Spring默认的传播机制,能满足绝大部分业务需求,如果外层有事务,则内层使用外层事务,一块提交,一块回滚。如果外层没有事务,新建一个事务执行
- PROPAGATION_REQUES_NEW:该事务传播机制是每次都会新开启一个事务,同时把外层事务挂起,当当前事务执行完毕,恢复上层事务的执行。如果外层没有事务,执行当前新开启的事务即可
- PROPAGATION_SUPPORT:如果外层有事务,则加入外层事务,如果外层没有事务,则直接使用非事务方式执行。完全依赖外层的事务
- PROPAGATION_NOT_SUPPORT:该传播机制不支持事务,如果外层存在事务则挂起,执行完当前代码,则恢复外层事务,无论是否异常都不会回滚当前的代码
- PROPAGATION_NEVER: 该传播机制不支持外层事务,即如果外层有事务就抛出异常
- PROPAGATION_NESTED:该传播机制的特点是可以保存状态保存点,当前事务回滚到某一个点,从而避免所有的嵌套事务都回滚,即各自回滚各自的,如果子事务没有把异常吃掉,基本还是会引起全部回滚的。
9、事务隔离级别
- 脏读:发生在一个事务读取了被另一个事务改写但尚未提交的数据时。如果这些改变在稍后被回滚了,那么第一个事务读取的数据就会是无效的
- 不可重复读:发生在一个事务执行相同的查询两次或两次以上,但每次查询结果都不相同时。这通常是由于另一个并发事务在两次查询之间更新了数据
- 幻读:和不可重复读相似。当一个事务(T1)读取几行记录后,另一个并发事务(T2)插入了一些记录时,幻读就发生了。在后来的查询中,第一个事务(T1)就会发现一些原来没有的额外记录。
10、timeout:超时时间
- 事务需要在一定时间内进行提交,如果不提交则回滚
- 默认值是-1不超时,时间单位是秒
11、readOnly:只读
- 默认值false:表示可以增删改查,设置成true后只能查询
12、rollbackFor和 noRollbackFor
- 出现相应异常进行回滚和不回滚