Spring-Mybatis(整合的兩種方式,聲明式事務)

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&amp;useUnicode=true&amp;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.
時間不等人,珍惜你所擁有的每分每秒吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章