Spring中的Template
使用xml配置
直接继承JdbcDaoSupport
就可以不写template1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {
@Override
public Account findAccountById(int id) {
List<Account> account = getJdbcTemplate().query("select * from account where id=?", new BeanPropertyRowMapper<Account>(Account.class), id);
return account.isEmpty()?null:account.get(0);
}
@Override
public Account findAccountByName(String name) {
List<Account> account = getJdbcTemplate().query("select * from account where name = ?", new BeanPropertyRowMapper<Account>(Account.class), name);
if (account.isEmpty()){
return null;
}
if (account.size() > 1){
throw new RuntimeException("结果集不唯一");
}
return account.get(0);
}
@Override
public void updateAccount(Account account) {
getJdbcTemplate().update("update account set name=?,money=? where id=?", account.getName(), account.getMoney(), account.getId());
}
}
使用注解配置
使用注解配置时,因为无法给jar包中的template加上注解,所以采用这种方式1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27@Repository
public class AccountDaoImpl2 implements AccountDao {
@Autowired
JdbcTemplate template;
@Override
public Account findAccountById(int id) {
List<Account> account = template.query("select * from account where id=?", new BeanPropertyRowMapper<Account>(Account.class), id);
return account.isEmpty()?null:account.get(0);
}
@Override
public Account findAccountByName(String name) {
List<Account> account = template.query("select * from account where name = ?", new BeanPropertyRowMapper<Account>(Account.class), name);
if (account.isEmpty()){
return null;
}
if (account.size() > 1){
throw new RuntimeException("结果集不唯一");
}
return account.get(0);
}
@Override
public void updateAccount(Account account) {
template.update("update account set name=?,money=? where id=?", account.getName(), account.getMoney(), account.getId());
}
}
Spring中的事务控制
事务控制也是基于aspectjweaver(重要)
Spring中基于XML的声明式事务控制配置步骤
- 配置事务管理器
配置事务的通知
- 此时我们需要导入事务的约束 tx和aop名称空间和约束
- 使用
tx:advice
标签配置事务通知- 属性:
id
: 事务通知的唯一标识transaction-manager
: 给事务通知提供一个事务管理器的引用1
2
3
4
5
6
7
8
9
10
11
12
13<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
</beans>
- 属性:
配置AOP中的通用切入点表达式
- 建立事务通知和切入点表达式的对应关系
- 配置事物的属性
- 在
tx:advice
标签的内部isolation
:用于指定事物的隔离级别,默认值是DEFAULT
,表示使用数据库的默认隔离级别propagation
: 用于指定事务的传播行为,默认值是REQUIRED
,表示一定会有事务,增删改选择,查询方法的话可以选择SUPPORTS
read-only
: 用于指定事务是否只读,只有查询方法才能设置为true
,默认值为false
,表示读写rollback-for
: 用于指定一个异常,产生该异常时事务回滚,产生其他异常时,事务不回滚。没有默认值,表示任何异常都回滚no-rollback-for
: 用于指定一个异常,产生该异常时事务不回滚,产生其他异常时,事务回滚。没有默认值,表示任何异常都回滚timeout
: 用于指定事务的超时,默认值是-1
,表示永不超时,如果指定了数值,以秒为单位
- 在
示例
1 | <!--配置事务管理器--> |
Spring中基于注解的声明式事务控制配置步骤
- 配置事务管理器
- 开启Spring对注解事务的支持
- 在需要开启事务支持的地方使用
@Transactional
注解
示例
1 | <!--配置事务管理器--> |
纯注解方式
可以加上@EnableTransctionManagement
注解实现开启Spring对注解事务的支持