2018/1/4
功能描述:
(1)新增功能:1.实现对角色表smbms_role 的查询和添加操作。
要求:1.角色名称模糊查询 角色信息列表;2.实现角色信息添加,使用事务切面实现声明式事务管理。
3.使用属性文件配置数据源(database.properties)
4.使用xml-aop标签配置事务切面。
下面是实现思路和方法:
【0】文件框架:
图1
{dao:sql映射文件和接口;entities:实体类;service:业务类}
【1】新建 数据源配置文件 database.properties:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8
user=root
password=
【2】新建 Spring配置文件 applicationContext-mybatis.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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 引入properties文件 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>classpath:database.properties</value>
</property>
</bean>
<!-- 数据源配置 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${driver}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${username}"></property>
<property name="password" value="${password}"></property>
</bean>
</beans>
然后添加 SqlSessionFactoryBean 配置内容:
<!-- SqlSessionFactoryBean 配置 -->
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 引用数据源组件 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 引用Mybatis配置文件的配置 -->
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
</bean>
package com.smbms.entities;
import java.math.BigInteger;
import java.util.Date;
public class Role {
private Integer id;
private String roleCode;
private String roleName;
private BigInteger createdBy;
private Date creationDate;
private BigInteger modifyBy;
private Date modifyDate;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getRoleCode() {
return roleCode;
}
public void setRoleCode(String roleCode) {
this.roleCode = roleCode;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public BigInteger getCreatedBy() {
return createdBy;
}
public void setCreatedBy(BigInteger createdBy) {
this.createdBy = createdBy;
}
public Date getCreationDate() {
return creationDate;
}
public void setCreationDate(Date creationDate) {
this.creationDate = creationDate;
}
public BigInteger getModifyBy() {
return modifyBy;
}
public void setModifyBy(BigInteger modifyBy) {
this.modifyBy = modifyBy;
}
public Date getModifyDate() {
return modifyDate;
}
public void setModifyDate(Date modifyDate) {
this.modifyDate = modifyDate;
}
@Override
public String toString() {
return "Role [id=" + id + ", roleCode=" + roleCode + ", roleName=" + roleName + ", createdBy=" + createdBy
+ ", creationDate=" + creationDate + ", modifyBy=" + modifyBy + ", modifyDate=" + modifyDate + "]";
}
public Role(Integer id, String roleCode, String roleName, BigInteger createdBy, Date creationDate,
BigInteger modifyBy, Date modifyDate) {
super();
this.id = id;
this.roleCode = roleCode;
this.roleName = roleName;
this.createdBy = createdBy;
this.creationDate = creationDate;
this.modifyBy = modifyBy;
this.modifyDate = modifyDate;
}
public Role() {
super();
// TODO 自动生成的构造函数存根
}
}
【4】新建 RoleMapper.java接口文件和sql映射文件RoleMapper.xml:
RoleMapper.java:
package com.smbms.dao;
import java.util.List;
import com.smbms.entities.Role;
public interface RoleMapper {
public List<Role> roleshow();
public List<Role> findRoleByCode(Integer roleId);
public int addNewRole(Role role);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.smbms.dao.RoleMapper">
<select id="roleshow" resultType="com.smbms.entities.Role">
select * from smbms_role
</select>
<select id="findRoleByCode" parameterType="integer"
resultType="com.smbms.entities.Role">
select * from smbms_role where id like CONCAT('%',#{roleId},'%')
</select>
<insert id="addNewRole" parameterType="com.smbms.entities.Role">
insert into smbms_role (id,roleCode,roleName,createBy,creationDate)
values
(#{id},#{roleCode},#{roleName},#{createdBy},#{creationDate})
</insert>
</mapper>
【5】Dao层代码通过MapperScannerConfigurer 扫描自动生成,然后业务层就能直接调用 xxxMapper 属性,所以,需要在Spring配置文件中添加以下内容:
<!-- 配置MapperScannerConfigurer,扫描生成 xxxmapper实例!!就是方便 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.smbms.dao"></property>
</bean>
【6】开始写业务层代码,新建RoleService.java接口文件和实现类RoleServiceimpl.java:
RoleService.java:
package com.smbms.service;
import java.util.List;
import com.smbms.entities.Role;
public interface RoleService {
public List<Role> roleshow();
public List<Role> findRoleByCode(Integer roleCode);
public boolean addNewRole(Role role);
}
RoleServiceimpl.java:
package com.smbms.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.smbms.dao.RoleMapper;
import com.smbms.entities.Role;
@Service("roleService")
public class RoleServiceImpl implements RoleService {
@Autowired
private RoleMapper roleMapper;
public RoleMapper getRoleMapper() {
return roleMapper;
}
public void setRoleMapper(RoleMapper roleMapper) {
this.roleMapper = roleMapper;
}
public RoleServiceImpl() {
super();
// TODO 自动生成的构造函数存根
}
public RoleServiceImpl(RoleMapper roleMapper) {
super();
this.roleMapper = roleMapper;
}
@Override
public List<Role> roleshow() {
return roleMapper.roleshow();
}
@Override
public List<Role> findRoleByCode(Integer roleCode) {
return roleMapper.findRoleByCode(roleCode);
}
@SuppressWarnings("finally")
@Override
public boolean addNewRole(Role role) {
boolean result = false;
try {
roleMapper.addNewRole(role);
result = true;
}catch (RuntimeException e){
e.printStackTrace();
result = false;
throw e;
}finally{
return result;
}
}
}
由于实现类是通过注解实现 RoleMapper 的依赖注入,所以要在Spring配置文件添加以下内容(扫描器):
<!-- 扫描注解配置 -->
<context:component-scan base-package="com.smbms.service"></context:component-scan>
【7】写测试单元RoleServiceImplTest.java:
package com.smbms.service;
import java.util.List;
import org.apache.log4j.Logger;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.smbms.entities.Role;
public class RoleServiceImplTest {
static Logger log = Logger.getLogger(RoleServiceImplTest.class.getName());
@Test
public void test() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-mybatis.xml");
RoleService roleService = (RoleService)ctx.getBean("roleService");
log.debug("-------1-------");
List<Role> roles = roleService.roleshow();
for(Role r:roles){
log.debug(r.toString());
}
log.debug("-------2-------");
roles = roleService.findRoleByCode(110);
for(Role r:roles){
log.debug(r.toString());
}
log.debug("-------3-------");
Role role = new Role();
role.setId(100);
role.setRoleName("tour");
boolean result = roleService.addNewRole(role);
log.debug("testAddRole result :"+result);
System.out.println("--------*****------------");
}
}
【8】最后利用AOP 切面,给包下面的所有方法添加事务增强处理,需要在Spring配置文件添加以下内容:
<!-- 事务管理器组件,以提供对事务处理的全面支持和统一管理,在切面中相当于增强处理的角色 ,需要注入数据源组件-->
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 指定的事务管理器 设置事务属性 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<!-- 定义属性,声明事务规则 -->
<tx:attributes>
<tx:method name="find*" propagation="SUPPORTS"/>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="update" propagation="REQUIRED" />
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- 定义切面,这里不知道能不能也使用注解? -->
<aop:config>
<!-- 定义切入点 -->
<aop:pointcut id="serviceMethod" expression="execution(* com.smbms.service.*.*(..))" />
<!-- 将事务增强和切入点组合 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod"/>
</aop:config>
【9】至此,Spring 配置文件的完整内容如下:
<?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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 引入properties文件 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>classpath:database.properties</value>
</property>
</bean>
<!-- 数据源配置 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${driver}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${username}"></property>
<property name="password" value="${password}"></property>
</bean>
<!-- SqlSessionFactoryBean 配置 -->
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 引用数据源组件 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 引用Mybatis配置文件的配置 -->
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
</bean>
<!-- 配置MapperScannerConfigurer,扫描生成 xxxmapper实例!!就是方便 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.smbms.dao"></property>
</bean>
<!-- 扫描注解配置 -->
<context:component-scan base-package="com.smbms.service"></context:component-scan>
<!-- 事务管理器组件,以提供对事务处理的全面支持和统一管理,在切面中相当于增强处理的角色 ,需要注入数据源组件-->
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 指定的事务管理器 设置事务属性 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<!-- 定义属性,声明事务规则 -->
<tx:attributes>
<tx:method name="find*" propagation="SUPPORTS"/>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="update" propagation="REQUIRED" />
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- 定义切面,这里不知道能不能也使用注解? -->
<aop:config>
<!-- 定义切入点 -->
<aop:pointcut id="serviceMethod" expression="execution(* com.smbms.service.*.*(..))" />
<!-- 将事务增强和切入点组合 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod"/>
</aop:config>
</beans>
【10】输出结果:
DEBUG 01-04 16:16:15,700 -------1------- (RoleServiceImplTest.java:21)
DEBUG 01-04 16:16:15,709 Creating new transaction with name [com.smbms.service.RoleServiceImpl.roleshow]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT (AbstractPlatformTransactionManager.java:367)
DEBUG 01-04 16:16:16,079 Acquired Connection [jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8, UserName=Administrator@localhost, MySQL Connector Java] for JDBC transaction (DataSourceTransactionManager.java:206)
DEBUG 01-04 16:16:16,083 Switching JDBC Connection [jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8, UserName=Administrator@localhost, MySQL Connector Java] to manual commit (DataSourceTransactionManager.java:223)
DEBUG 01-04 16:16:16,084 Bound value [org.springframework.jdbc.datasource.ConnectionHolder@c7045b9] for key [org.apache.commons.dbcp.BasicDataSource@6cb6decd] to thread [main] (TransactionSynchronizationManager.java:193)
DEBUG 01-04 16:16:16,084 Initializing transaction synchronization (TransactionSynchronizationManager.java:272)
DEBUG 01-04 16:16:16,084 Getting transaction for [com.smbms.service.RoleServiceImpl.roleshow] (TransactionAspectSupport.java:466)
DEBUG 01-04 16:16:16,088 Creating a new SqlSession (JakartaCommonsLoggingImpl.java:54)
DEBUG 01-04 16:16:16,091 Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6ee4d9ab] (JakartaCommonsLoggingImpl.java:54)
DEBUG 01-04 16:16:16,092 Bound value [org.mybatis.spring.SqlSessionHolder@18e36d14] for key [org.apache.ibatis.session.defaults.DefaultSqlSessionFactory@5b7a8434] to thread [main] (TransactionSynchronizationManager.java:193)
DEBUG 01-04 16:16:16,098 Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@c7045b9] for key [org.apache.commons.dbcp.BasicDataSource@6cb6decd] bound to thread [main] (TransactionSynchronizationManager.java:140)
DEBUG 01-04 16:16:16,098 Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@c7045b9] for key [org.apache.commons.dbcp.BasicDataSource@6cb6decd] bound to thread [main] (TransactionSynchronizationManager.java:140)
DEBUG 01-04 16:16:16,099 JDBC Connection [jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8, UserName=Administrator@localhost, MySQL Connector Java] will be managed by Spring (JakartaCommonsLoggingImpl.java:54)
DEBUG 01-04 16:16:16,103 Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@c7045b9] for key [org.apache.commons.dbcp.BasicDataSource@6cb6decd] bound to thread [main] (TransactionSynchronizationManager.java:140)
DEBUG 01-04 16:16:16,104 ==> Preparing: select * from smbms_role (JakartaCommonsLoggingImpl.java:54)
DEBUG 01-04 16:16:16,130 ==> Parameters: (JakartaCommonsLoggingImpl.java:54)
DEBUG 01-04 16:16:16,149 <== Columns: id, roleCode, roleName, createBy, creationDate, modiftyBy, modifyDate (JakartaCommonsLoggingImpl.java:59)
DEBUG 01-04 16:16:16,150 <== Row: 101, 101, 鏅?氱敤鎴?, 110, 2017-12-17 12:26:00.0, null, null (JakartaCommonsLoggingImpl.java:59)
DEBUG 01-04 16:16:16,153 <== Row: 110, 110, 绠$悊鍛?, 110, 2017-12-17 12:26:00.0, null, null (JakartaCommonsLoggingImpl.java:59)
DEBUG 01-04 16:16:16,154 <== Row: 111, 111, 缁忕悊, 110, 2017-12-17 12:26:00.0, null, null (JakartaCommonsLoggingImpl.java:59)
DEBUG 01-04 16:16:16,154 <== Total: 3 (JakartaCommonsLoggingImpl.java:54)
DEBUG 01-04 16:16:16,157 Retrieved value [org.mybatis.spring.SqlSessionHolder@18e36d14] for key [org.apache.ibatis.session.defaults.DefaultSqlSessionFactory@5b7a8434] bound to thread [main] (TransactionSynchronizationManager.java:140)
DEBUG 01-04 16:16:16,157 Retrieved value [org.mybatis.spring.SqlSessionHolder@18e36d14] for key [org.apache.ibatis.session.defaults.DefaultSqlSessionFactory@5b7a8434] bound to thread [main] (TransactionSynchronizationManager.java:140)
DEBUG 01-04 16:16:16,158 Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6ee4d9ab] (JakartaCommonsLoggingImpl.java:54)
DEBUG 01-04 16:16:16,158 Completing transaction for [com.smbms.service.RoleServiceImpl.roleshow] (TransactionAspectSupport.java:495)
DEBUG 01-04 16:16:16,158 Triggering beforeCommit synchronization (AbstractPlatformTransactionManager.java:926)
DEBUG 01-04 16:16:16,158 Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6ee4d9ab] (JakartaCommonsLoggingImpl.java:54)
DEBUG 01-04 16:16:16,158 Triggering beforeCompletion synchronization (AbstractPlatformTransactionManager.java:939)
DEBUG 01-04 16:16:16,158 Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6ee4d9ab] (JakartaCommonsLoggingImpl.java:54)
DEBUG 01-04 16:16:16,158 Removed value [org.mybatis.spring.SqlSessionHolder@18e36d14] for key [org.apache.ibatis.session.defaults.DefaultSqlSessionFactory@5b7a8434] from thread [main] (TransactionSynchronizationManager.java:243)
DEBUG 01-04 16:16:16,159 Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6ee4d9ab] (JakartaCommonsLoggingImpl.java:54)
DEBUG 01-04 16:16:16,159 Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@c7045b9] for key [org.apache.commons.dbcp.BasicDataSource@6cb6decd] bound to thread [main] (TransactionSynchronizationManager.java:140)
DEBUG 01-04 16:16:16,159 Initiating transaction commit (AbstractPlatformTransactionManager.java:755)
DEBUG 01-04 16:16:16,160 Committing JDBC transaction on Connection [jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8, UserName=Administrator@localhost, MySQL Connector Java] (DataSourceTransactionManager.java:269)
DEBUG 01-04 16:16:16,160 Triggering afterCommit synchronization (AbstractPlatformTransactionManager.java:952)
DEBUG 01-04 16:16:16,160 Triggering afterCompletion synchronization (AbstractPlatformTransactionManager.java:968)
DEBUG 01-04 16:16:16,161 Clearing transaction synchronization (TransactionSynchronizationManager.java:331)
DEBUG 01-04 16:16:16,161 Removed value [org.springframework.jdbc.datasource.ConnectionHolder@c7045b9] for key [org.apache.commons.dbcp.BasicDataSource@6cb6decd] from thread [main] (TransactionSynchronizationManager.java:243)
DEBUG 01-04 16:16:16,162 Releasing JDBC Connection [jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8, UserName=Administrator@localhost, MySQL Connector Java] after transaction (DataSourceTransactionManager.java:327)
DEBUG 01-04 16:16:16,162 Returning JDBC Connection to DataSource (DataSourceUtils.java:327)
DEBUG 01-04 16:16:16,163 Role [id=101, roleCode=101, roleName=鏅?氱敤鎴?, createdBy=null, creationDate=Sun Dec 17 12:26:00 CST 2017, modifyBy=null, modifyDate=null] (RoleServiceImplTest.java:24)
DEBUG 01-04 16:16:16,163 Role [id=110, roleCode=110, roleName=绠$悊鍛?, createdBy=null, creationDate=Sun Dec 17 12:26:00 CST 2017, modifyBy=null, modifyDate=null] (RoleServiceImplTest.java:24)
DEBUG 01-04 16:16:16,163 Role [id=111, roleCode=111, roleName=缁忕悊, createdBy=null, creationDate=Sun Dec 17 12:26:00 CST 2017, modifyBy=null, modifyDate=null] (RoleServiceImplTest.java:24)
DEBUG 01-04 16:16:16,163 -------2------- (RoleServiceImplTest.java:26)
DEBUG 01-04 16:16:16,164 Initializing transaction synchronization (TransactionSynchronizationManager.java:272)
DEBUG 01-04 16:16:16,164 Getting transaction for [com.smbms.service.RoleServiceImpl.findRoleByCode] (TransactionAspectSupport.java:466)
DEBUG 01-04 16:16:16,164 Creating a new SqlSession (JakartaCommonsLoggingImpl.java:54)
DEBUG 01-04 16:16:16,165 Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@43b9fd5] (JakartaCommonsLoggingImpl.java:54)
DEBUG 01-04 16:16:16,165 Bound value [org.mybatis.spring.SqlSessionHolder@79dc5318] for key [org.apache.ibatis.session.defaults.DefaultSqlSessionFactory@5b7a8434] to thread [main] (TransactionSynchronizationManager.java:193)
DEBUG 01-04 16:16:16,165 Fetching JDBC Connection from DataSource (DataSourceUtils.java:110)
DEBUG 01-04 16:16:16,165 Registering transaction synchronization for JDBC Connection (DataSourceUtils.java:114)
DEBUG 01-04 16:16:16,166 Bound value [org.springframework.jdbc.datasource.ConnectionHolder@54eb2b70] for key [org.apache.commons.dbcp.BasicDataSource@6cb6decd] to thread [main] (TransactionSynchronizationManager.java:193)
DEBUG 01-04 16:16:16,166 Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@54eb2b70] for key [org.apache.commons.dbcp.BasicDataSource@6cb6decd] bound to thread [main] (TransactionSynchronizationManager.java:140)
DEBUG 01-04 16:16:16,167 JDBC Connection [jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8, UserName=Administrator@localhost, MySQL Connector Java] will be managed by Spring (JakartaCommonsLoggingImpl.java:54)
DEBUG 01-04 16:16:16,167 Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@54eb2b70] for key [org.apache.commons.dbcp.BasicDataSource@6cb6decd] bound to thread [main] (TransactionSynchronizationManager.java:140)
DEBUG 01-04 16:16:16,167 ==> Preparing: select * from smbms_role where id like CONCAT('%',?,'%') (JakartaCommonsLoggingImpl.java:54)
DEBUG 01-04 16:16:16,168 ==> Parameters: 110(Integer) (JakartaCommonsLoggingImpl.java:54)
DEBUG 01-04 16:16:16,169 <== Columns: id, roleCode, roleName, createBy, creationDate, modiftyBy, modifyDate (JakartaCommonsLoggingImpl.java:59)
DEBUG 01-04 16:16:16,169 <== Row: 110, 110, 绠$悊鍛?, 110, 2017-12-17 12:26:00.0, null, null (JakartaCommonsLoggingImpl.java:59)
DEBUG 01-04 16:16:16,171 <== Total: 1 (JakartaCommonsLoggingImpl.java:54)
DEBUG 01-04 16:16:16,171 Retrieved value [org.mybatis.spring.SqlSessionHolder@79dc5318] for key [org.apache.ibatis.session.defaults.DefaultSqlSessionFactory@5b7a8434] bound to thread [main] (TransactionSynchronizationManager.java:140)
DEBUG 01-04 16:16:16,171 Retrieved value [org.mybatis.spring.SqlSessionHolder@79dc5318] for key [org.apache.ibatis.session.defaults.DefaultSqlSessionFactory@5b7a8434] bound to thread [main] (TransactionSynchronizationManager.java:140)
DEBUG 01-04 16:16:16,172 Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@43b9fd5] (JakartaCommonsLoggingImpl.java:54)
DEBUG 01-04 16:16:16,172 Completing transaction for [com.smbms.service.RoleServiceImpl.findRoleByCode] (TransactionAspectSupport.java:495)
DEBUG 01-04 16:16:16,172 Triggering beforeCommit synchronization (AbstractPlatformTransactionManager.java:926)
DEBUG 01-04 16:16:16,172 Triggering beforeCompletion synchronization (AbstractPlatformTransactionManager.java:939)
DEBUG 01-04 16:16:16,172 Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@43b9fd5] (JakartaCommonsLoggingImpl.java:54)
DEBUG 01-04 16:16:16,172 Removed value [org.mybatis.spring.SqlSessionHolder@79dc5318] for key [org.apache.ibatis.session.defaults.DefaultSqlSessionFactory@5b7a8434] from thread [main] (TransactionSynchronizationManager.java:243)
DEBUG 01-04 16:16:16,172 Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@43b9fd5] (JakartaCommonsLoggingImpl.java:54)
DEBUG 01-04 16:16:16,172 Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@54eb2b70] for key [org.apache.commons.dbcp.BasicDataSource@6cb6decd] bound to thread [main] (TransactionSynchronizationManager.java:140)
DEBUG 01-04 16:16:16,173 Removed value [org.springframework.jdbc.datasource.ConnectionHolder@54eb2b70] for key [org.apache.commons.dbcp.BasicDataSource@6cb6decd] from thread [main] (TransactionSynchronizationManager.java:243)
DEBUG 01-04 16:16:16,173 Returning JDBC Connection to DataSource (DataSourceUtils.java:327)
DEBUG 01-04 16:16:16,173 Triggering afterCommit synchronization (AbstractPlatformTransactionManager.java:952)
DEBUG 01-04 16:16:16,173 Triggering afterCompletion synchronization (AbstractPlatformTransactionManager.java:968)
DEBUG 01-04 16:16:16,173 Clearing transaction synchronization (TransactionSynchronizationManager.java:331)
DEBUG 01-04 16:16:16,173 Role [id=110, roleCode=110, roleName=绠$悊鍛?, createdBy=null, creationDate=Sun Dec 17 12:26:00 CST 2017, modifyBy=null, modifyDate=null] (RoleServiceImplTest.java:29)
DEBUG 01-04 16:16:16,174 -------3------- (RoleServiceImplTest.java:31)
DEBUG 01-04 16:16:16,174 Creating new transaction with name [com.smbms.service.RoleServiceImpl.addNewRole]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT (AbstractPlatformTransactionManager.java:367)
DEBUG 01-04 16:16:16,175 Acquired Connection [jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8, UserName=Administrator@localhost, MySQL Connector Java] for JDBC transaction (DataSourceTransactionManager.java:206)
DEBUG 01-04 16:16:16,175 Switching JDBC Connection [jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8, UserName=Administrator@localhost, MySQL Connector Java] to manual commit (DataSourceTransactionManager.java:223)
DEBUG 01-04 16:16:16,176 Bound value [org.springframework.jdbc.datasource.ConnectionHolder@1838ccb8] for key [org.apache.commons.dbcp.BasicDataSource@6cb6decd] to thread [main] (TransactionSynchronizationManager.java:193)
DEBUG 01-04 16:16:16,176 Initializing transaction synchronization (TransactionSynchronizationManager.java:272)
DEBUG 01-04 16:16:16,176 Getting transaction for [com.smbms.service.RoleServiceImpl.addNewRole] (TransactionAspectSupport.java:466)
DEBUG 01-04 16:16:16,176 Creating a new SqlSession (JakartaCommonsLoggingImpl.java:54)
DEBUG 01-04 16:16:16,176 Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6c2ed0cd] (JakartaCommonsLoggingImpl.java:54)
DEBUG 01-04 16:16:16,177 Bound value [org.mybatis.spring.SqlSessionHolder@7d9e8ef7] for key [org.apache.ibatis.session.defaults.DefaultSqlSessionFactory@5b7a8434] to thread [main] (TransactionSynchronizationManager.java:193)
DEBUG 01-04 16:16:16,177 Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@1838ccb8] for key [org.apache.commons.dbcp.BasicDataSource@6cb6decd] bound to thread [main] (TransactionSynchronizationManager.java:140)
DEBUG 01-04 16:16:16,177 Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@1838ccb8] for key [org.apache.commons.dbcp.BasicDataSource@6cb6decd] bound to thread [main] (TransactionSynchronizationManager.java:140)
DEBUG 01-04 16:16:16,178 JDBC Connection [jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8, UserName=Administrator@localhost, MySQL Connector Java] will be managed by Spring (JakartaCommonsLoggingImpl.java:54)
DEBUG 01-04 16:16:16,178 Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@1838ccb8] for key [org.apache.commons.dbcp.BasicDataSource@6cb6decd] bound to thread [main] (TransactionSynchronizationManager.java:140)
DEBUG 01-04 16:16:16,178 ==> Preparing: insert into smbms_role (id,roleCode,roleName,createBy,creationDate) values (?,?,?,?,?) (JakartaCommonsLoggingImpl.java:54)
DEBUG 01-04 16:16:16,180 ==> Parameters: 100(Integer), null, tour(String), null, null (JakartaCommonsLoggingImpl.java:54)
DEBUG 01-04 16:16:16,207 <== Updates: 1 (JakartaCommonsLoggingImpl.java:54)
DEBUG 01-04 16:16:16,208 Retrieved value [org.mybatis.spring.SqlSessionHolder@7d9e8ef7] for key [org.apache.ibatis.session.defaults.DefaultSqlSessionFactory@5b7a8434] bound to thread [main] (TransactionSynchronizationManager.java:140)
DEBUG 01-04 16:16:16,208 Retrieved value [org.mybatis.spring.SqlSessionHolder@7d9e8ef7] for key [org.apache.ibatis.session.defaults.DefaultSqlSessionFactory@5b7a8434] bound to thread [main] (TransactionSynchronizationManager.java:140)
DEBUG 01-04 16:16:16,208 Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6c2ed0cd] (JakartaCommonsLoggingImpl.java:54)
DEBUG 01-04 16:16:16,208 Completing transaction for [com.smbms.service.RoleServiceImpl.addNewRole] (TransactionAspectSupport.java:495)
DEBUG 01-04 16:16:16,208 Triggering beforeCommit synchronization (AbstractPlatformTransactionManager.java:926)
DEBUG 01-04 16:16:16,208 Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6c2ed0cd] (JakartaCommonsLoggingImpl.java:54)
DEBUG 01-04 16:16:16,209 Triggering beforeCompletion synchronization (AbstractPlatformTransactionManager.java:939)
DEBUG 01-04 16:16:16,209 Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6c2ed0cd] (JakartaCommonsLoggingImpl.java:54)
DEBUG 01-04 16:16:16,209 Removed value [org.mybatis.spring.SqlSessionHolder@7d9e8ef7] for key [org.apache.ibatis.session.defaults.DefaultSqlSessionFactory@5b7a8434] from thread [main] (TransactionSynchronizationManager.java:243)
DEBUG 01-04 16:16:16,209 Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6c2ed0cd] (JakartaCommonsLoggingImpl.java:54)
DEBUG 01-04 16:16:16,209 Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@1838ccb8] for key [org.apache.commons.dbcp.BasicDataSource@6cb6decd] bound to thread [main] (TransactionSynchronizationManager.java:140)
DEBUG 01-04 16:16:16,209 Initiating transaction commit (AbstractPlatformTransactionManager.java:755)
DEBUG 01-04 16:16:16,210 Committing JDBC transaction on Connection [jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8, UserName=Administrator@localhost, MySQL Connector Java] (DataSourceTransactionManager.java:269)
DEBUG 01-04 16:16:16,258 Triggering afterCommit synchronization (AbstractPlatformTransactionManager.java:952)
DEBUG 01-04 16:16:16,259 Triggering afterCompletion synchronization (AbstractPlatformTransactionManager.java:968)
DEBUG 01-04 16:16:16,259 Clearing transaction synchronization (TransactionSynchronizationManager.java:331)
DEBUG 01-04 16:16:16,260 Removed value [org.springframework.jdbc.datasource.ConnectionHolder@1838ccb8] for key [org.apache.commons.dbcp.BasicDataSource@6cb6decd] from thread [main] (TransactionSynchronizationManager.java:243)
DEBUG 01-04 16:16:16,264 Releasing JDBC Connection [jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8, UserName=Administrator@localhost, MySQL Connector Java] after transaction (DataSourceTransactionManager.java:327)
DEBUG 01-04 16:16:16,265 Returning JDBC Connection to DataSource (DataSourceUtils.java:327)
DEBUG 01-04 16:16:16,265 testAddRole result :true (RoleServiceImplTest.java:36)
--------*****------------
(1)这是Mybatis和Spring整合练习的工程;
(2)实际使用有3个包:dao、entities、service;
(3)Mybatis配置文件内容很简洁,Spring完成大部分配置管理;
(4)通过SQLSessionTemplate的实现类对数据库进行操作;
(5)配置DAO组件并进入SqlSessionTemplate实例;
(6)配置业务Bean并注入DAO实例 ;
(7)完成的功能是:查询provider的列表,模糊查询供应商信息;
(8)与smbms05MybatisSpring的区别:去掉了实现类ProviderMapperImpl;仅仅保留ProviderMapper
接口和相关SQL映射文件,通过MapperFactoryBean注入给业务组件。
(9)此外,也新增了一个User查询,照壶画瓢;
(10)smbms06是使用MapperFactoryBean注入映射器,
而smbms07是更加方便的使用MapperScannerConfigurer注入映射器。
(11)smbms08增加新功能,实现按条件查询订单表Bill;使用resultMap做显示列表字段的自定义映射,
使用Map传参,
采用MapperFactoryBean注册映射器实现。
[bill 和 provider 表]
(12) smbms09 在 smbms08 的基础上,进行拓展,用MapperScannerConfigurer注入映射器。
(13) smbms10,声明式事务,提高在XML配置文件注册org.springframework.jdbc.datasource.DataSourceTransactionManager,
然后利用AOP切面对事务进行注入时。
(14) smbms11,使用注解去实现声明式事务,@Transaction。
(15) smbms12,新增功能:1.实现对角色表smbms_role 的查询和添加操作。
要求:1.角色名称模糊查询 角色信息列表;2.实现角色信息添加,使用事务切面实现声明式事务管理。
3.使用属性文件配置数据源(database.properties)
4.使用xml-aop标签配置事务切面。
【12】还有一些提高空间:使用注解在业务类中配置事务切面增强,那样的话需要使用@Transaction;同时在Spring配置文件添加以下内容:
<!-- 事务管理器组件,以提供对事务处理的全面支持和统一管理,在切面中相当于增强处理的角色 ,需要注入数据源组件-->
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 事务管理器注解配置 -->
<tx:annotation-driven transaction-manager="txManager"/>
以上是博客的全部内容。