版权声明:本篇文章由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来做日志记录的。