由于前几天一直在面试,没有继续总结,今天继续总结SSM整合的第二大步,业务层的整合。
业务层整合的目标:Spring管理service,Service通过spring调用mapper,由spring进行事务控制。
首先开发我们的service接口和实现类:
/**
* 用户管理
* @author user
*
*/
public interface UserService {
public User findUserById(int id);
public void saveUser();
// 插入用户
public void insertUser(User user) throws Exception;
}
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User findUserById(int id) {
// TODO Auto-generated method stub
try {
return userMapper.findUserById(id);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
public void saveUser() {
// TODO Auto-generated method stub
//更新用户
User user_update = new User();
user_update.setId(1);
user_update.setUsername("哈哈1111111");
try {
userMapper.updateUser(user_update);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//插入用户,插入一个同id的用户,由于id的唯一约束,插入错误,回滚
User insert_user = new User();
insert_user.setId(1);
try {
insertUser(insert_user);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void insertUser(User user) throws Exception {
// TODO Auto-generated method stub
userMapper.insertUser(user);
}
}
这里直接把事务测试了。
为了规范程序员编码,采用声明式事务配置方式。
在applicationContext.xml配置事务管理:
<!-- 事务管理器
mybatis使用jdbc事务管理
-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!-- 配置传播行为 -->
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- aop配置 -->
<aop:config>
<aop:advisor advice-ref="txAdvice"
pointcut="execution(* cn.itcast.ssm.service.impl.*.*(..))"/>
</aop:config>
applicationContext-service.xml:
<?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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
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-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd ">
<!-- 用户管理 -->
<bean id = "userService" class="com.my.ssm.service.UserServiceImpl">
</bean>
</beans>
一个service方法是一个事务单元 。
创建一个service方法,方法中发起多次数据库操作,只要有一个次操作失败(抛出runtime异常)事务回滚,该方法中其它成功操作自动回滚。
业务层测试:
public class ServiceTest {
private ApplicationContext applicationContext;
//测试原始dao方法
public void testService() throws Exception {
applicationContext = new ClassPathXmlApplicationContext(new String[] {
"spring/applicationContext.xml",
"spring/applicationContext-dao.xml",
"spring/applicationContext-service.xml"
});
UserService userService = (UserService) applicationContext.getBean("userService");
User user = userService.findUserById(1);
userService.saveUser();
System.out.println(user);
}
public static void main(String[] args) throws Exception {
ServiceTest test = new ServiceTest();
test.testService();
}
}