Spring-07-整合MyBatis
十、整合MyBatis
准备工作
-
导入Maven依赖,配置静态资源过滤
<dependencies> <!--Spring框架--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.1</version> </dependency> <!--MyBatis--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <!--MySQL驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.22</version> </dependency> <!--Spring数据库组件--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.1</version> </dependency> <!--Spring整合MyBatis--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version> </dependency> <!--AOP--> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.6</version> </dependency> <!--测试组件--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> <!--配置静态文件过滤--> <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
-
创建实体类
public class User { private int id; private String name; private String pwd; }
10.1 旧方式使用MyBatis
-
配置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.pbx.pojo"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis? useSSL=true&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!--注册映射器--> <mappers> <package name="com.pbx.mapper"/> </mappers> </configuration>
-
Mapper接口
public interface UserMapper { public List<User> getAllUser(); }
-
Mapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.pbx.mapper.UserMapper"> <select id="getAllUser" resultType="com.pbx.pojo.User"> select * from mybatis.user </select> </mapper>
-
测试
@Test public void test1() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> allUser = mapper.getAllUser(); for (User user : allUser) { System.out.println(user); } }
-
小结:传统使用MyBatis的步骤
- 编写MyBatis配置文件
- 制作Mapper接口和Mapper.xml映射文件
- 按照配置文件创建SqlSessionFactory
- 使用
10.2 MyBatis-Spring
- MyBatis-Spring 是什么
- MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和
SqlSession
并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的DataAccessException
。 最终,可以做到应用代码不依赖于 MyBatis,Spring 或 MyBatis-Spring。 - 简单来说,这个东西可以帮助我们将MyBatis快速整合到Spring中
- MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和
- 重要组件:
SqlSessionFactoryBean
和SqlSessionTemplate
、SqlSessionDaoSupport
SqlSessionFactoryBean
- 他是用来创建
SqlSessionFactory
的
- 他是用来创建
10.3 使用 SqlSessionTemplate 整合
-
使用Spring配置数据源
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="url" value="jdbc:mysql://localhost:3306/mybatis? useSSL=true&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8"/> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="username" value="root"/> <property name="password" value="123456"/> </bean>
-
使用 SqlSessionFactoryBean 创建 SqlSessionFactory
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!--关联MyBatis配置文件,使得配置文件和Spring文件可以同时生效--> <property name="configLocation" value="classpath:mybatis-config.xml"/> <!--注册mapper.xml文件--> <property name="mapperLocations" value="classpath:com/pbx/mapper/*.xml"/> </bean>
-
注入SqlSessionTemplate
- SqlSessionTemplate没有setter方法,所以只能通过构造器注入
<!--SqlSessionTemplate--> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory"/> </bean>
-
实现一个数据映射器类,并将它交由Spring托管
- 它会实现mapper接口。这么做是为了给Spring提供可供管理的对象,我们使用MyBatis的时候,就是使用这个对象
public class UserMapperImpl implements UserMapper { private SqlSessionTemplate sqlSession; public void setSqlSession(SqlSessionTemplate sqlSession) { this.sqlSession = sqlSession; } @Override public List<User> getAllUser() { return sqlSession.getMapper(UserMapper.class).getAllUser(); } }
-
测试
@Test public void test2() { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserMapper mapper = context.getBean("userMapperImpl", UserMapper.class); List<User> allUser = mapper.getAllUser(); for (User user : allUser) { System.out.println(user); } }
-
注意:在被Spring管理之后,记得删除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.pbx.pojo"/> </typeAliases> </configuration>
10.4 使用 SqlSessionDaoSupport 整合
-
SqlSessionDaoSupport
是一个抽象的支持类,用来为你提供SqlSession
。调用getSqlSession()
方法你会得到一个SqlSessionTemplate
,之后可以用于执行 SQL 方法,就像下面这样:public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao { public User getUser(String userId) { return getSqlSession().selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId); } }
-
在这个类里面,通常更倾向于使用
MapperFactoryBean
,因为它不需要额外的代码。但是,如果你需要在 DAO 中做其它非 MyBatis 的工作或需要一个非抽象的实现类,那么这个类就很有用了。 -
SqlSessionDaoSupport
需要通过属性设置一个sqlSessionFactory
或SqlSessionTemplate
。如果两个属性都被设置了,那么SqlSessionFactory
将被忽略。 -
假设类
UserMapperImpl
是SqlSessionDaoSupport
的子类,可以编写如下的 Spring 配置来执行设置:<bean id="userDao" class="org.mybatis.spring.sample.dao.UserDaoImpl"> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean>