1. Mybatis-Spring簡介
MyBatis-Spring 會幫助你將 MyBatis 代碼無縫地整合到 Spring 中。
它將允許 MyBatis 參與到 Spring 的事務管理之中,創建映射器 mapper 和 SqlSession 並注入到 bean 中,以及將 Mybatis 的異常轉換爲 Spring 的 DataAccessException。
最終,可以做到應用代碼不依賴於 MyBatis,Spring 或 MyBatis-Spring。
2.Mybatis-Spring的對應版本
3.Mybatis-Spring的第一種整合方式
(1)導入相關依賴
<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>4.3.24.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.0</version>
</dependency>
(2)編寫實體類
package Pojo;
import lombok.Data;
@Data
public class User {
private int id;
private String name;
private String pwd;
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
}
(3)編寫接口UserMapper
package Mapper;
import Pojo.User;
import java.util.List;
public interface UserMapper {
public List<User> getUserList();
}
(4)編寫UserMapper.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="Mapper.UserMapper">
<select id="getUserList" resultType="Pojo.User">
select * from user;
</select>
</mapper>
(5)編寫Spring配置文件(ApplicationContext.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
">
<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>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath:Mapper/*.xml"></property>
<!--<property name="configLocation" value="classpath:mybatis-config.xml"></property>-->
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
<bean id="UserMapperImpl" class="Mapper.Impl.UserMapperImpl">
<property name="sessionTemplate" ref="sqlSession"></property>
</bean>
</beans>
1.爲什麼使用datasource?
因爲整合時,不能使用Mybatis數據庫,可以使用spring自帶的數據庫
- org.springframework.jdbc.datasource
2.爲什麼要使用SqlSessionTemplate?爲什麼不能採用構造器注入?
- SqlSessionTemplate等同於SqlSession.
- SqlSessionTemplate 是線程安全的,可以被多個 DAO 或映射器所共享使用。
- SqlSessionTemplate 還有一個接收 ExecutorType 參數的構造方法。這允許你使用 Spring 配置來批量創建對象
- 不能採用構造器注入,因爲其沒有set方法。
(6)編寫UserMapperImpl實現類
package Mapper.Impl;
import Mapper.UserMapper;
import Pojo.User;
import org.mybatis.spring.SqlSessionTemplate;
import java.util.List;
public class UserMapperImpl implements UserMapper {
private SqlSessionTemplate sessionTemplate;
public void setSessionTemplate(SqlSessionTemplate sessionTemplate) {
this.sessionTemplate = sessionTemplate;
}
public List<User> getUserList() {
UserMapper mapper = sessionTemplate.getMapper(UserMapper.class);
return mapper.getUserList();
}
}
爲什麼整合必須要編寫實現類?
因爲spring的東西會自動創建,而Mybatis的東西無法創建,只能手動通過實現類中的set方法進行創建。
(7)編寫測試類
import Mapper.Impl.UserMapperImpl;
import Mapper.UserMapper;
import Pojo.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;
public class Text {
@Test
public void Text1(){
ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
UserMapper bean = (UserMapper) context.getBean("UserMapperImpl");
List<User> userList = bean.getUserList();
for (User ser : userList) {
System.out.println(ser);
}
}
}
4.Mybatis-Spring的第二種整合方式
相比第一種整合方式,第二種的方式更加的簡單,步驟代碼與第一種基本相同,只有少量步驟有些差別,更見簡單,代碼量更少
(1)實現類繼承SqlSessionDaoSupport
SqlSessionDaoSupport 是一個抽象的支持類,用來爲你提供 SqlSession。
調用 getSqlSession() 方法你會得到一個 SqlSessionTemplate,之後可以用於執行 SQL 方法
代碼實現:
package Mapper.Impl;
import Mapper.UserMapper;
import Pojo.User;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import java.util.List;
public class UserMapperImpl extends SqlSessionDaoSupport implements UserMapper {
public List<User> getUserList() {
UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
return mapper.getUserList();
}
}
(2)編寫Spring配置文件(ApplicationContext.xml)
因爲 SqlSessionDaoSupport 提供SqlSessionTemplate,所以不需要再注入
代碼實現:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath:Mapper/*.xml"></property>
</bean>
<bean id="UserMapperImpl" class="Mapper.Impl.UserMapperImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
通過兩者相比你懂了嗎?
5.事務管理(聲明式事務)
一個使用 MyBatis-Spring 的其中一個主要原因是它允許 MyBatis 參與到 Spring 的事務管理中。而不是給 MyBatis 創建一個新的專用事務管理器,
MyBatis-Spring 藉助了 Spring 中的 DataSourceTransactionManager 來實現事務管理
配置事務 :
<!-- 配置事務 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<constructor-arg ref="dataSource" />
</bean>
配置事務的通知:(使用Spring的事務命名空間tx)
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!--propagation事務的傳播特性,默認爲REQUIRED-->
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
結合AOP實現事務的切入:
<aop:config>
<aop:pointcut id="txPointCut" expression="execution(* Mapper.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
</aop:config>
Time waits for no one. Treasure every moment you have.
時間不等人,珍惜你所擁有的每分每秒吧!