Spring && Mybatis的整合
整合方式一
创建数据源dataSource 管理连接
destory-method="close" 使用完成当前连接 关闭
Application.xml配制文件
<!--通过org.apache.commons.dbcp.BasicDataSource 创建数据源 管理链接-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!--设置驱动类-->
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<!--连接字符串-->
<property name="url" value="jdbc:mysql://localhost:3306/mybookshop"/>
<!--数据账号-->
<property name="username" value="root"/>
<!--数据库密码-->
<property name="password" value="1234"/>
</bean>
<!--创建sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--传入数据源-->
<property name="dataSource" ref="dataSource"/>
<!--引入Mybatis配制文件中的配置-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="mapperLocations" >
<list>
<value>classpath:org/westos/demo/mapper/**/*.xml</value>
</list>
</property>
</bean>
<!--创建sqlSessionTemplate 注入 sqlSessionFactory-->
<bean id="SqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<!--通过构造函数注入-->
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
创建Mapper接口的实现类,并且声明sqlSessionTemplate 通过注入 注入sqlSessionTemplate
public class UserMapperImpl implements UserMapper {
private SqlSessionTemplate sqlSessionTemplate;
@Override
public List<Users> queryUser() {
return sqlSessionTemplate.selectList("org.westos.demo.mapper.UserMapper.queryUser");
}
public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
this.sqlSessionTemplate = sqlSessionTemplate;
}
}
测试类
public class TestUserService {
@Test
public void testA() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) applicationContext.getBean("UserServiceImpl");
List<Users> usersList = userService.queryUser();
for (Users users : usersList)
System.out.println(users.toString());
}
}
整合方式二
保持数据源与sqlSessionFactory不变
将sqlSessionFactory注入到UserMapperImpl中(UserMapperImpl继承了SqlSessionDaoSupport)
SqlSessionDaoSupport中含有set访问器
SqlSessionDaoSupport:
public abstract class SqlSessionDaoSupport extends DaoSupport {
private SqlSession sqlSession;
private boolean externalSqlSession;
public SqlSessionDaoSupport() {
}
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
if (!this.externalSqlSession) {
this.sqlSession = new SqlSessionTemplate(sqlSessionFactory);
}
}
-------------------------------------------
<bean id="userMapperImpl" class="com.xk.demo.mapper.UserMapperImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
接口的实现类
public class UserMapperImpl extends SqlSessionDaoSupport implements UserMapper {
@Override
public List<Users> queryUser() {
return this.getSqlSession().selectList("org.westos.demo.mapper.UserMapper.queryUser");
}
}
整合方式三
删除了Mapper实现类
保持dataSource
删除sqlSessionFactory节点的mapper映射文件位置
<!-- 创建 sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--传入 数据源-->
<property name="dataSource" ref="dataSource"/>
<!-- 引用 MyBatis 配置文件中的配置-->
<property name="configLocation" value="mybatis-config.xml"/>
</bean>
<!--使用 MapperFactoryBean 整合Spring 和 Mybatis-->
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<!--MapperFactoryBean 继承了 SqlSessionDaoSupport 注入了sqlSessionFactory-->
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
<!--MapperFactoryBean:需要xxxMapper接口-->
<property name="mapperInterface" value="org.westos.demo.mapper.UserMapper"/>
</bean>
<!--将 MapperFactoryBean 注入给 Service 的 userMapper-->
<bean id="userServiceImpl" class="org.westos.demo.service.impl.UserServiceImpl">
<property name="userMapper" ref="userMapper"/>
</bean>
整合方式四
applicationContext.xml配制文件:使用注解完成 @Service(“userServiceImpl”) @Autowired(类型注入)
<!--扫描包-->
<context:component-scan base-package="org.westos.demo"></context:component-scan>
创建数据源
<!-- 通过 org.apache.commons.dbcp.BasicDataSource 创建 数据源 管理连接 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!-- 设置驱动类-->
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<!-- 连接字符串 -->
<property name="url" value="jdbc:mysql://localhost:3306/mybookshop"/>
<!--数据账号-->
<property name="username" value="root"/>
<!-- 数据库密码-->
<property name="password" value="1234"/>
</bean>
<!-- 创建 sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--传入 数据源-->
<property name="dataSource" ref="dataSource"/>
<!-- 引用 MyBatis 配置文件中的配置-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!--配置Dao 使用MapperScaanerConfigurer 整合Spring mybatis 传入mapper所在的包-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--MapperFactoryBean:需要xxxMapper接口-->
<property name="basePackage" value="org.westos.demo.mapper"/>
</bean>
事务
定义事务管理器 JDBC事务
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/><!--注意:这里是ref-->
</bean>
<!--
引入事务的命名空间
xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
-->
<!--事务的传播机制
1、REQUIRED(默认):支持使用当前事务,如果当前事务不存在,创建一个新的事务
2、SUPPORTS:当前事务不存在,则不适用事务
3、MANDATORY(强制):如果当前事务不存在,则抛出异常
4、REQUIRES_NEW;创建一个新的事务,如果事务存在,把当前事务挂起
5、NOT_SUPPORTED:无事务执行,如果当前事务存在,把当前事务挂起
6、NEVER:无事务执行,如果当前有事务,抛出异常
7、NESTED:嵌套事务,如果当前事物存在,那么在嵌套的事务中执行,如果事务不存在,则与REQUIRED一样
-->
<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="query*" propagation="SUPPORTS"/>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="method" expression="execution(* org.westos.demo.service.*.*(..))"></aop:pointcut>
<!-- method: 切入点 advice-ref事务的传播机制 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="method"></aop:advisor>
</aop:config>