SSM整合——業務層的整合
阿新 • • 發佈:2018-11-21
由於前幾天一直在面試,沒有繼續總結,今天繼續總結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();
}
}