1.导入Maven坐标
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.8.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.2.RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
2.关键Bean.xml的配置
< bean id= "accountService" class = "com.joyTop.service.impl.AccountServiceImpl" >
< property name= "accountDao" ref= "accountDao" > < / property>
< / bean>
< bean id= "accountDao" class = "com.joyTop.dao.impl.AccountDaoImpl" >
< property name= "dataSource" ref= "dataSource" > < / property>
< / bean>
< bean id= "jdbcTemloate" class = "org.springframework.jdbc.core.JdbcTemplate" >
< property name= "dataSource" ref= "dataSource" > < / property>
< / bean>
< ! -- 配置数据源 -- >
< bean id= "dataSource" class = "org.springframework.jdbc.datasource.DriverManagerDataSource" >
< property name= "driverClassName" value= "com.mysql.jdbc.Driver" > < / property>
< property name= "Url" value= "jdbc:mysql://localhost:3306/spring4_day3?characterEncoding=utf-8" > < / property>
< property name= "username" value= "root" > < / property>
< property name= "password" value= "123.com" > < / property>
< / bean>
< ! -- sprng中基于XML 的事务控制配置步骤
1. 配置事务管理器
2. 配置事务通知
此时我们需要导入事务的约束 tx名称空间和约束、同时也需要aop
使用tx: advice标签配置事务通知
属性:
id: 给事务通知启唯一ID
transaction- manager: 给事务通知提供一个事务管理器引用
3. 配置AOP 中的通用切入点表达式
4. 建立事务通知和切入点表达式的对应关系
5. 配置事务的属性
是在事务的通知tx: advice标签的内部
-- >
< bean id= "transactionManager" class = "org.springframework.jdbc.datasource.DataSourceTransactionManager" >
< property name= "dataSource" ref= "dataSource" > < / property>
< / bean>
< ! -- 配置事务通知-- >
< tx: advice id= "txAdvice" transaction- manager= "transactionManager" >
< ! -- 配置事务的属性
isolation: 用于指定事务的隔离级别,默认值是DEFAULT , 表示使用数据库的默认隔离级别
timeout: 事务超时,默认值- 1 ,表示永远不超时,如果指定了数值,以秒为单位
propagation: 用于指定事务的传播行为。默认值是REQUIRED , 表示一定会有事务,增删改的选择,查询方法可以选择SUPPORTS
read- only: 指定事务是否只读,只有查询方法才能设置为true , 默认值是false , 表示读写
rollback- for :用于指定一个异常,当产生该异常时,事务回滚,产生其他异常时,事务不回滚,没有默认值。表示任何异常都回滚。
no- rollback- for : 同上相反
-- >
< tx: attributes>
< tx: method name= "*" propagation= "REQUIRED" read- only= "false" / >
< tx: method name= "find" propagation= "SUPPORTS" read- only= "true" > < / tx: method>
< / tx: attributes>
< / tx: advice>
< ! -- 配置AOP -- >
< aop: config>
< ! -- 配置切入点表达式-- >
< aop: pointcut id= "pt1" expression= "execution(* com.joyTop.service.impl.*.*(..))" / >
< ! -- 建立切入点表达式和事务通知的对应关系-- >
< aop: advisor advice- ref= "txAdvice" pointcut- ref= "pt1" > < / aop: advisor>
< / aop: config>
3.Dao 使用了继承 JdbcDaoSupport ,Bean.xml中accountDao不用引入JdbcTemplate,直接引入dataSource数据源,dao中用super.getJdbcTemplate()来获取JdbcTemplate.
public class AccountDaoImpl extends JdbcDaoSupport implements IAccountDao {
public Account findAccountById ( float id) {
List< Account> list = super . getJdbcTemplate ( ) . query ( "select * from account where id = ?" , new BeanPropertyRowMapper < Account> ( Account. class ) , id) ;
return list. isEmpty ( ) ? null : list. get ( 0 ) ;
}
public Account findAccountByName ( String accountName) {
List< Account> list = super . getJdbcTemplate ( ) . query ( "select * from account where name = ?" , new BeanPropertyRowMapper < Account> ( Account. class ) , accountName) ;
if ( list. isEmpty ( ) ) {
return null ;
}
if ( list. size ( ) > 1 ) {
throw new RuntimeException ( "结果不唯一" ) ;
}
return list. get ( 0 ) ;
}
public void updateAccount ( Account account) {
super . getJdbcTemplate ( ) . update ( "update account set money=? where id=?" , account. getMoney ( ) , account. getId ( ) ) ;
}
}
4.Service 业务层
public class IAccountServiceImpl implements IAccountService {
private IAccountDao accountDao;
public void setAccountDao ( IAccountDao accountDao) {
this . accountDao = accountDao;
}
public Account findAccountById ( Integer accountId) {
return accountDao. findAccountById ( accountId) ;
}
public void updateAccount ( Account account) {
accountDao. updateAccount ( account) ;
}
public void transfer ( String sourceName, String targetName, Float money) {
System. out. println ( "transfer...." ) ;
Account source = accountDao. findAccountByName ( sourceName) ;
Account target = accountDao. findAccountByName ( targetName) ;
source. setMoney ( source. getMoney ( ) - money) ;
target. setMoney ( target. getMoney ( ) + money) ;
accountDao. updateAccount ( source) ;
accountDao. updateAccount ( target) ;
}
}
5.测试 spring整和Junit,注解进行测试
@RunWith ( SpringJUnit4ClassRunner. class )
@ContextConfiguration ( locations = "classpath:bean.xml" )
public class AccountServiceTest {
@Autowired
private IAccountService as ;
@Test
public void testTransfer ( ) {
as . transfer ( "aaa" , "bbb" , 100 f) ;
}
}
6.可能是导入的Maven版本有问题没运行出来,有小伙伴看出问题的,可以联系我,感谢了。
QQ : 583083874