Spring-Mybatis整合
一、整合的内容
1、SqlSessionFactory将放入Spring容器中作为单例存在
2、Mapper代理,将从Spring容器中直接获取mapper代理对象
3、数据源和数据库连接池的事务管理都将有由Spring进行管理
二、整合操作
数据源:ApplicationContext.xml中加载数据库配置文件db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8&useSSL=false
jdbc.username=root
jdbc.password=123456
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:db.properties" />
<!-- 数据库连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="maxActive" value="10" />
<property name="maxIdle" value="5" />
</bean>
</beans>
将SqlSessionFactory归于Spring管理
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 指定Mybatis核心配置文件 凡是Spring配置文件都得加classpath -->
<property name="configLocation" value="classpath:SqlMapConfig.xml"></property>
<!-- 指定回话工厂使用的数据源 -->
<property name="dataSource" ref="dataSource"/>
</bean>
三、 简单的实现
简单的Dao实现
<!-- 原生dao实现
注意:class必须指定Dao的实现类的全路径 -->
<bean id="userDao" class="org.lier.dao.UserDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
这种方式下实现的条件:
1、有dao借口,并且还要有相关的实现类,实现类需要继承org.mybatis.spring.support.SqlSessionDaoSupport类。
2、class的值必须指定dao的实现类的全路径
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
@Override
public List<User> selectUsersByName(String username) {
// session线程不安全,放入放入方法体中,随用随毁
SqlSession session = this.getSqlSession();
List<User> users =session.selectList("test.findByName",username);
session.commit();
session.close();
return users;
}
}
测试方法;
private ApplicationContext ctx;
@Before
public void setUp() throws Exception{
String configLocation = "ApplicationContext.xml";
ctx = new ClassPathXmlApplicationContext(configLocation);
}
@Test
public void selectUsersByNameTest() {
// 获取UserDao对象,getBean中的字符串是在ApplicationContext.xml中声明的
UserDao userdao = (UserDao) ctx.getBean("userDao");
List<User> users = userdao.selectUsersByName("王五");
System.out.println(users.toString());
}
问题以及注意:
上面的实现类中手动的commit了,但是报错了
java.lang.UnsupportedOperationException:Manual commit is not allowed over a Spring managed SqlSession
大致意思是在和Spring整合之后,是不允许手动的Commit的。将手动commit的语句去掉就可以正常的执行了。完美!加油W~!W
Mapper代理的方式:单个以及扫描方式
Mapper动态代理的方式
<!-- 动态代理方式Mapper方式实现 -->
<bean id="userDaoMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<!-- 配置Mapper接口的全路径 -->
<property name="mapperInterface" value="org.lier.mapper.UserDaoMapper"></property>
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
<!-- 使用包扫描的方式批量引入Mapper -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 指定要扫描的包的全路径,如果有多个包,用英文状态下的逗号进行分割 -->
<property name="basePackage" value="org.lier.mapper"></property>
</bean>
@Test
public void findOrderToUser2Test() {
// 获取UserDao对象,getBean中的字符串是在ApplicationContext.xml中声明的
UserDaoMapper mapper = (UserDaoMapper) ctx.getBean("userDaoMapper");
List<Orders> orders = mapper.findOrderToUser2();
System.out.println(orders.toString());
}
总结下啊!
1、整合中数据源不在mybatis控制,内容大概一致,不难理解。
2、重要的一点SqlSessionFactory由Spring进行注入(单例),在Mybatis中,必须获取了这个factory才能获取session对象,执行sql。
3、实现方式:
在单个Mybatis中dao实现手动加载配置文件,创建factory,获取session,执行,然后提交关闭,整合的时候,提供实现类,通过获取bean获取相关的实现类进行操作,这其中,SQLSessionFactory已经被Spring接管了注入了,直接获取session,执行,不需要commit。
代理模式下:都省去了实现类了,Mybatis指定Mapper接口两者在同一目录下,在整合版中指定mapper接口、会话工厂。综上就是说就是将Mybatis中需哟啊手工创建的factory让Spring接管了。然后在Spring中指定相关的mapper接口,就可以通过bean获取相关的接口的代理类了。