Spring整合MyBatis
1.导入pom依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<!--mysql数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<!--spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<!--aop织入-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<!--mybatis-spring-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<!--jdbc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.4</version>
</dependency>
</dependencies>
2.spring配置文件
-
SqlSessionFactoryBean
在基础的 MyBatis 用法中,是通过
SqlSessionFactoryBuilder
来创建SqlSessionFactory
的。而在 MyBatis-Spring 中,则使用SqlSessionFactoryBean
来创建。要创建工厂 bean,将下面的代码放到 Spring 的 XML 配置文件中:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> </bean>
需要注意的是
SqlSessionFactoryBean
实现了 Spring 的FactoryBean
接口。 这意味着由 Spring 最终创建的 bean 并不是SqlSessionFactoryBean
本身,而是工厂类(SqlSessionFactoryBean
)的 getObject() 方法的返回结果。这种情况下,Spring 将会在应用启动时为你创建SqlSessionFactory
,并使用sqlSessionFactory
这个名字存储起来。SqlSessionFactory
有一个唯一的必要属性:用于 JDBC 的DataSource
。这可以是任意的DataSource
对象,它的配置方法和其它 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/test"/> <property name="username" value="root"/> <property name="password" value="123456"/> </bean>
一个常用的属性是
configLocation
,它用来指定 MyBatis 的 XML 配置文件路径。<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:mybatis-config.xml"/> </bean>
mapperLocations
属性接受多个资源位置。这个属性可以用来指定 MyBatis 的映射器 XML 配置文件的位置。<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="mapperLocations" value="classpath*:sample/config/mappers/**/*.xml" /> </bean>
另外还可以设置众多属性
-
typeAliases : 设置实体类别名
<property name="typeAliases" value="com.ml.pojo.Book"/>
-
databaseIdProvider : 如果你使用了多个数据库
<bean id="databaseIdProvider" class="org.apache.ibatis.mapping.VendorDatabaseIdProvider"> <property name="properties"> <props> <prop key="SQL Server">sqlserver</prop> <prop key="DB2">db2</prop> <prop key="Oracle">oracle</prop> <prop key="MySQL">mysql</prop> </props> </property> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:mybatis-config.xml"/> <property name="databaseIdProvider" ref="databaseIdProvider"/> </bean>
…
-
-
SqlSessionTemplate
SqlSessionTemplate
是 MyBatis-Spring 的核心。作为SqlSession
的一个实现,这意味着可以使用它无缝代替你代码中已经在使用的SqlSession
。SqlSessionTemplate
是线程安全的,可以被多个 DAO 或映射器所共享使用。可以使用
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.selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId); } }
按下面这样,注入
SqlSessionTemplate
:<bean id="userDao" class="org.mybatis.spring.sample.dao.UserDaoImpl"> <property name="sqlSession" ref="sqlSession" /> </bean>
SqlSessionTemplate
还有一个接收ExecutorType
参数的构造方法。这允许你使用如下 Spring 配置来批量创建对象,例如批量创建一些 SqlSession:<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory" /> <constructor-arg index="1" value="BATCH" /> </bean>
现在所有的映射语句可以进行批量操作了,可以在 DAO 中编写如下的代码
public class UserService { private final SqlSession sqlSession; public UserService(SqlSession sqlSession) { this.sqlSession = sqlSession; } public void insertUsers(List<User> users) { for (User user : users) { sqlSession.insert("org.mybatis.spring.sample.mapper.UserMapper.insertUser", user); } } }
-
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); } }
SqlSessionDaoSupport
需要通过属性设置一个sqlSessionFactory
或SqlSessionTemplate
。如果两个属性都被设置了,那么SqlSessionFactory
将被忽略。假设类
UserMapperImpl
是SqlSessionDaoSupport
的子类,可以编写如下的 Spring 配置来执行设置:<bean id="userDao" class="org.mybatis.spring.sample.dao.UserDaoImpl"> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean>
总结 : 使用 SqlSessionFactoryBean
+ SqlSessionTemplate
或 SqlSessionFactoryBean
| SqlSessionTemplate
+ SqlSessionDaoSupport