Spring全解-08-整合Mybatis
整合Mybatis
pom.xml里导入相关jar包,添加静态资源过滤
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.1.10.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.1.10.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.4</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.2</version> </dependency> <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources> </build>
要和Spring一起使用Mybatis,需要在Spring应用上下文中定义至少两样东西:
1.SqlSessionFactory
2.数据映射器类
在Spring中使用SqlSessionFactoryBean来创建SqlSessionFactory
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> </bean>
SqlSessionFactory需要一个DataSource(数据源),这可以是任意的,只需要和配置其它Spring数据库连接一样配置它就可以了。
在之前的Mybatis中,是通过SqlSessionFactoryBuild来创建SqlSessionFactory的,但是在Spring中是使用SqlSessionFactoryBean来创建的。
在Mybatis中,你可以使用SqlSeseionFactory来创建SqlSession。一旦以获得一个session后,你可以使用它来执行映射了的语句,提交或者回滚,最后不需要的时候,关闭资源。
SqlSessionFactory有一个唯一的必要属性,那就是用于JDBC的DataSource。这可以是任意的DataSource对象,它的配置方法和其他Spring数据库是一样的。
一个常用的属性是configLocation,它用来指定Mybatis的xml配置文件路径。
SqlSessionTemplate是Mybatis-Spring的核心。作为SqlSession的一个实现,这意味着可以使用它无缝代替代码中已经在使用的SqlSession。
可以使用 SqlSessionFactory 作为构造方法的参数来创建 SqlSessionTemplate 对象。使用构造器方式进行注入。
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory" /> </bean>
现在,这个 bean 就可以直接注入到你的 DAO bean 中了。你需要在你的 bean 中添加一个 SqlSession 属性,就像下面这样:
public class UserDaoImpl implements UserDao { private SqlSession sqlSession; public void setSqlSession(SqlSession sqlSession) { this.sqlSession = sqlSession; } public User getUser(String userId) { return sqlSession.getMapper...; } }
按下面这样,注入 SqlSessionTemplate:
<bean id="userDao" class="org.mybatis.spring.sample.dao.UserDaoImpl"> <property name="sqlSession" ref="sqlSession" /> </bean>
整合
有两种整合方式,区别在于一个是通过SqlSessionTemplate来生成SqlSession,另一个是直接通过继承Spring里的类SqlSessionDaoSupport直接调用里面的方法来得到SqlSession。
第一种方式:通过SqlSessionTemplate来生成SqlSession
1.引入Spring配置文件beans.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
2.配置数据源替换mybatis数据源
<!--配置数据源:数据源有非常多,可以使用第三方的,也可使使用Spring的--> <bean id="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </bean>
3.配置SqlSessionFactory,关联Mybatis
configLocation关联mybatis-config.xml
mapperLocation关联mapper.xml文件
<!--配置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" value="classpath:com/li/dao/*.xml"/> </bean>
4.注册SqlSessionTemplate,关联SqlSessionFactory
<!--注册sqlSessionTemplate , 关联sqlSessionFactory--> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <!--利用构造器注入--> <constructor-arg index="0" ref="sqlSessionFactory"/> </bean>
5.增加Dao接口的实现类,私有化SqlSessionTemplate
public class UserDaoImpl implements UserMapper { //sqlSession不用我们自己创建了,Spring来管理 private SqlSessionTemplate sqlSession; public void setSqlSession(SqlSessionTemplate sqlSession) { this.sqlSession = sqlSession; } public List<User> selectUser() { UserMapper mapper = sqlSession.getMapper(UserMapper.class); return mapper.selectUser(); } }
6.注册bean
<bean id="userDao" class="com.li.dao.UserDaoImpl"> <property name="sqlSession" ref="sqlSession"/> </bean>
7.测试
@Test public void test2(){ ApplicationContext context = newClassPathXmlApplicationContext("beans.xml"); UserMapper mapper = (UserMapper) context.getBean("userDao"); List<User> user = mapper.selectUser(); System.out.println(user); }
Mybatis配置文件的状态
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <typeAliases> <package name="com.li.pojo"/> </typeAliases> </configuration>
第二种方式:通过继承Spring里的类SqlSessionDaoSupport直接调用里面的方法来得到SqlSession
dao继承Support类,直接利用 getSqlSession()获得,然后直接注入SqlSessionFactory。比起方式1 ,不需要管理SqlSessionTemplate,而且对事务的支持更加友好,可跟踪源码查看。
public class UserDaoImpl extends SqlSessionDaoSupport implements UserMapper { public List<User> selectUser() { UserMapper mapper = getSqlSession().getMapper(UserMapper.class); return mapper.selectUser(); } }
<bean id="userDao" class="com.li.dao.UserDaoImpl"> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean>
@Test public void test2(){ ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); UserMapper mapper = (UserMapper) context.getBean("userDao"); List<User> user = mapper.selectUser(); System.out.println(user); }
两者的区别,即继承类可以直接注入SqlSessionFactory,注入SqlSessionTemplate的一步被封装起来了。