关于spring整合mybatis的步骤

版权声明:本篇文章由IT_CREATE整理 https://blog.csdn.net/IT_CREATE/article/details/85329007

编写applicationContext.xml完成框架的整合
   第1步:开启spring容器的自动扫描功能
   第2步:引入外部的数据库配置描述文件
   第3步:配置数据源连接池:C3P0,DBCP2,DRUID
   第4步:配置SessionFactory
   第5步:配置MapperScanner
   第6步:配置事务管理器
   第7步:配置spring管理事务的2种方式:编程式事务管理,声明式事务管理(一般用声明式)
   第8步:开启切面动态代理支持

代码如下:

<?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:p="http://www.springframework.org/schema/p"
	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.0.xsd
						http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop.xsd
         http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">

	<!-- 第1步:开启spring容器的自动扫描功能 -->
	<context:component-scan base-package="com.ali.sm"></context:component-scan>

	<!-- 第2步:引入外部的数据库配置描述文件 -->
	<context:property-placeholder location="classpath:mysql.properties" />

	<!-- 第3步:配置数据源连接池:C3P0,DBCP2,DRUID -->
	<!-- destroy-method="close" 该方法代表spring容器在销毁时,需要调用close(),关闭掉所有的数据库连接对象 -->
	<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
		destroy-method="close">
		<!-- 配置4个最基本的连接属性 -->
		<property name="driverClassName" value="${jdbc.driver}"></property>
		<property name="url" value="${jdbc.url}"></property>
		<property name="username" value="${jdbc.username}"></property>
		<property name="password" value="${jdbc.password}"></property>

		<!-- 配置扩展属性 -->
		<property name="defaultAutoCommit" value="false"></property>
		<property name="defaultReadOnly" value="false"></property>

		<!-- 在数据库中,隔离级别:8代表可串行化,4代表可重复读,2代表读已提交 ,1代表读未提交 -->
		<property name="defaultTransactionIsolation" value="4"></property>
		<!-- 创建连接池时,需要初始化的连接数量 -->
		<property name="initialSize" value="15"></property>
		<!-- 配置连接池中,最大能存放的连接数量 -->
		<property name="maxTotal" value="50"></property>
		<!-- 配置连接池中,允许存在的最大空闲状态的连接数量 -->
		<property name="maxIdle" value="35"></property>
		<property name="minIdle" value="0"></property>
		<!-- 设置连接池中,连接处理SQL语句的超时时间,不可能无限制的等 -->
		<property name="defaultQueryTimeout" value="5"></property>
		<!-- 设置数据库查询校验语句 -->
		<property name="validationQuery" value="select now() from dual"></property>

		<!-- 设置当连接在创建时,或者是在借出时,都需要执行SQL验证,用于确保连接是可用的 -->
		<property name="testOnCreate" value="true"></property>
		<property name="testOnBorrow" value="true"></property>
		<!-- 设置数据查询校验失败超时时间 -->
		<property name="validationQueryTimeout" value="5"></property>
		<!-- 代表连接池允许存放,SQL预编译对象 -->
		<property name="poolPreparedStatements" value="true"></property>
		<!-- 允许存放120个预编译对象 -->
		<property name="maxOpenPreparedStatements" value="120"></property>

	</bean>

	<!-- 第4步,配置SessionFactory -->
	<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
		<!-- typeAliasesPackage 以包为单位,批量给包中的类取类别名 如果存在多个包同时需要取类别名,包和包之间,采用;或者,间隔 -->
		<property name="typeAliasesPackage" value="com.ali.sm.bean"></property>
	</bean>

	<!-- 第5步,配置MapperScanner -->
	<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">

		<!-- basePackage 以包为单位,批量扫描包中的映射关系 如果存在多个包同时需要扫描,包和包之间,采用;或者,间隔 -->
		<property name="basePackage" value="com.ali.sm.usermag.mapper;
		com.ali.sm.logmag.mapper"></property>
		<property name="sqlSessionFactoryBeanName" value="sessionFactory"></property>
	</bean>

	<!-- 第6步,配置事务管理器 -->
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>

	<!-- 第7步,配置spring管理事务的2种方式:编程式事务管理,声明式事务管理 -->
	<!-- 编程式事务管理 需要在业务类中,借助TransactionTemplate,PlatformTransactionManager 完成对业务逻辑 
		的逻辑事务管理 -->
	<!-- 声明式事务管理,第1种方式,采用AOP管理业务逻辑事务 -->
	<!-- <tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			
			<tx:method name="*" read-only="true" propagation="SUPPORTS" />

			<tx:method name="save*" read-only="false" rollback-for="java.lang.Exception"
				propagation="REQUIRED" />
			<tx:method name="add*" read-only="false" rollback-for="java.lang.Exception"
				propagation="REQUIRED" />
			<tx:method name="insert*" read-only="false" rollback-for="java.lang.Exception"
				propagation="REQUIRED" />
			<tx:method name="create*" read-only="false" rollback-for="java.lang.Exception"
				propagation="REQUIRED" />

			<tx:method name="update*" read-only="false" rollback-for="java.lang.Exception"
				propagation="REQUIRED" />
			<tx:method name="modify*" read-only="false" rollback-for="java.lang.Exception"
				propagation="REQUIRED" />
			<tx:method name="change*" read-only="false" rollback-for="java.lang.Exception"
				propagation="REQUIRED" />

			<tx:method name="delete*" read-only="false" rollback-for="java.lang.Exception"
				propagation="REQUIRED" />
			<tx:method name="remove*" read-only="false" rollback-for="java.lang.Exception"
				propagation="REQUIRED" />

		</tx:attributes>
	</tx:advice>
	
	<aop:config>
		<aop:pointcut id="txMagPoint"
			expression="execution(* com.ali.sm.*mag.service.impl.*.*(..))" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="txMagPoint" />
	</aop:config> -->

	<!-- 声明式事务管理,第2种方式,使用@Transactional管理业务逻辑事务 -->
	<!-- 开启事务的注解支持 -->
	<tx:annotation-driven transaction-manager="transactionManager"/>



	<!-- 第8步,开启切面动态代理支持 -->
	<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>

如果用了第二种声明式@Transactional的方式,那么需要在业务层的方法上加上@Transactional注解,如下:

/**
 * @Service 表示该Java类是一个需要被spring容器管理起来的业务层的组件
 * 默认情况下,spring容器扫描到该组件之后,将会将该类的类名 “首字母小写后的字符串”,作为该组件在容器中的ID
 * 当然你也可以通过@Service("sb")这种方式去改
 * @author Administrator
 *
 */
@Transactional(readOnly=true,propagation=Propagation.SUPPORTS)
@Service
public class UserServiceImpl implements IUserService {
	
	/**
	 * @Resource 约== @Autowired + @Qualifier
	 * 默认情况下,@Resource将先按照byName装配方式进行精准装配,如果装配失败,将回退到byType装配方式
	 * 
	 * 如果你指定了name="userDaoImpl3" ,那么将严格按照byName的装配方式,不会回退
	 */
	@Resource
	private IUserDao userDaoImpl;
	
	@Transactional(readOnly=false,propagation=Propagation.REQUIRED,rollbackFor=Exception.class)
	@MyLog(value="用户管理",type=LogEnum.ADD)
	@Override
	public UserBean saveUserBean(UserBean user) {
		// TODO Auto-generated method stub
		userDaoImpl.addUserBean(user);
		return user;
	}

	@Transactional(readOnly=false,propagation=Propagation.REQUIRED,rollbackFor=Exception.class)
	@MyLog(value="用户管理",type=LogEnum.ADD)
	@Override
	public int addBatchUserBean(List<UserBean> users) {
		// TODO Auto-generated method stub
		return userDaoImpl.addBatchUserBean(users);
	}

	@Transactional(readOnly=false,propagation=Propagation.REQUIRED,rollbackFor=Exception.class)
	@MyLog(value="用户管理",type=LogEnum.UPDATE)
	@Override
	public int updateUserBean(UserBean user) {
		// TODO Auto-generated method stub
		return userDaoImpl.updateUserBean(user);
	}

	@Transactional(readOnly=false,propagation=Propagation.REQUIRED,rollbackFor=Exception.class)
	@MyLog(value="用户管理",type=LogEnum.DELETE)
	@Override
	public int deleteUserBean(UserBean user) {
		// TODO Auto-generated method stub
		return userDaoImpl.deleteUserBean(user);
	}

	@Transactional(readOnly=false,propagation=Propagation.REQUIRED,rollbackFor=Exception.class)
	@MyLog(value="用户管理",type=LogEnum.DELETE)
	@Override
	public int deleteBatchUserBean(int[] ids) {
		// TODO Auto-generated method stub
		return userDaoImpl.deleteBatchUserBean(ids);
	}

	@Transactional(readOnly=false,propagation=Propagation.REQUIRED,rollbackFor=Exception.class)
	@MyLog(value="用户管理",type=LogEnum.DELETE)
	@Override
	public int deleteUserBean(Integer id) {
		// TODO Auto-generated method stub
		return userDaoImpl.deleteUserBean(id);
	}

	@Override
	public UserBean getUserBeanById(Integer id) {
		// TODO Auto-generated method stub
		return userDaoImpl.getUserBeanById(id);
	}

	@Override
	public Map<String, Object> queryUserBeanById(Integer id) {
		// TODO Auto-generated method stub
		return userDaoImpl.queryUserBeanById(id);
	}

	@Override
	public List<Map<String, Object>> findUserBeanMapByObject(UserBean user) {
		// TODO Auto-generated method stub
		return userDaoImpl.findUserBeanMapByObject(user);
	}

	@Override
	public UserBean findUserBeanByLoginNameAndPwd(String loginName, String pwd) {
		// TODO Auto-generated method stub
		return userDaoImpl.findUserBeanByLoginNameAndPwd(loginName, pwd);
	}

	@Override
	public List<UserBean> findUserBeanByObject(UserBean user) {
		// TODO Auto-generated method stub
		return userDaoImpl.findUserBeanByObject(user);
	}

	@Override
	public List<UserBean> findUserBeanByMap(Map map) {
		// TODO Auto-generated method stub
		return userDaoImpl.findUserBeanByMap(map);
	}

	@Override
	public PageBean findUserBeanList2PageBean(PageBean page, UserBean user) {
		// TODO Auto-generated method stub
		int totalRows = userDaoImpl.countUserBeanList2PageBean(user);
		List<?> datas = null;
		if(totalRows > 0) {
			datas = userDaoImpl.findUserBeanList(page, user);
		}
		page.setTotalRows(totalRows);	
		page.setData(datas);
		return page;
	}

	

}

要做事务提交和回滚的只有增删改操作,所以查询我们就不用去加这个注解,那个@Mylog注解不用管,这个是我自己写的,主要是用AOP来做日志记录的。

猜你喜欢

转载自blog.csdn.net/IT_CREATE/article/details/85329007