Spring学习笔记(5)

Spring中的Template

使用xml配置

直接继承JdbcDaoSupport就可以不写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
public 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的声明式事务控制配置步骤

  1. 配置事务管理器
  2. 配置事务的通知

    • 此时我们需要导入事务的约束 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>
  3. 配置AOP中的通用切入点表达式

  4. 建立事务通知和切入点表达式的对应关系
  5. 配置事物的属性
    • tx:advice标签的内部
      • isolation:用于指定事物的隔离级别,默认值是DEFAULT,表示使用数据库的默认隔离级别
      • propagation: 用于指定事务的传播行为,默认值是REQUIRED,表示一定会有事务,增删改选择,查询方法的话可以选择SUPPORTS
      • read-only: 用于指定事务是否只读,只有查询方法才能设置为true,默认值为false,表示读写
      • rollback-for: 用于指定一个异常,产生该异常时事务回滚,产生其他异常时,事务不回滚。没有默认值,表示任何异常都回滚
      • no-rollback-for: 用于指定一个异常,产生该异常时事务不回滚,产生其他异常时,事务回滚。没有默认值,表示任何异常都回滚
      • timeout: 用于指定事务的超时,默认值是-1,表示永不超时,如果指定了数值,以秒为单位

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>

<!--配置事务的通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!--配置事务的属性-->
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" read-only="false"/>
<!--遵循查询方法都以find开头,就可以很方便配置-->
<tx:method name="find*" propagation="SUPPORTS" read-only="true"></tx:method>
</tx:attributes>
</tx:advice>

<!--配置AOP-->
<aop:config>
<!--配置切入点表达式-->
<aop:pointcut id="pc1" expression="execution(* com.xushui.service.Impl.*.*(..))"></aop:pointcut>
<!--建立切入点表达式和事务通知的对应关系-->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pc1"></aop:advisor>
</aop:config>

Spring中基于注解的声明式事务控制配置步骤

  1. 配置事务管理器
  2. 开启Spring对注解事务的支持
  3. 在需要开启事务支持的地方使用@Transactional注解

示例

1
2
3
4
5
6
<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 开启Spring对注解事务的支持 -->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>

纯注解方式

可以加上@EnableTransctionManagement注解实现开启Spring对注解事务的支持


# Spring

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×