在學習之前,我們先了解一個網站mybatis-spring,這是mybatis-spring整合的官方檔案,里面有詳細的教程,網址如下:
https://mybatis.org/spring/zh/index.html
一、什么是mybatis-spring
以下是mybatis-spring官方給出的介紹:
MyBatis-Spring 會幫助你將 MyBatis 代碼無縫地整合到 Spring 中,它將允許 MyBatis 參與到 Spring 的事務管理之中,創建映射器 mapper 和 SqlSession 并注入到 bean 中,以及將 Mybatis 的例外轉換為 Spring 的 DataAccessException, 最終,可以做到應用代碼不依賴于 MyBatis,Spring 或 MyBatis-Spring,
二、需要匯入的包
<dependencies> <!-- https://mvnrepository.com/artifact/junit/junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.23</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.9.1</version> </dependency> <!-- mysql驅動--> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.30</version> </dependency> <!-- mybatis--> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.10</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.7</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.23</version> </dependency> </dependencies>
三、方式一:SqlSessionTemplate
SqlSessionTemplate,官方檔案中有這樣一段說明:
SqlSessionTemplate 是 MyBatis-Spring 的核心,作為 SqlSession 的一個實作,這意味著可以使用它無縫代替你代碼中已經在使用的 SqlSession, SqlSessionTemplate 是執行緒安全的,可以被多個 DAO 或映射器所共享使用,
當呼叫 SQL 方法時(包括由 getMapper() 方法回傳的映射器中的方法),SqlSessionTemplate 將會保證使用的 SqlSession 與當前 Spring 的事務相關, 此外,它管理 session 的生命周期,包含必要的關閉、提交或回滾操作,另外,它也負責將 MyBatis 的例外翻譯成 Spring 中的 DataAccessExceptions,
由于模板可以參與到 Spring 的事務管理中,并且由于其是執行緒安全的,可以供多個映射器類使用,你應該總是用 SqlSessionTemplate 來替換 MyBatis 默認的 DefaultSqlSession 實作,在同一應用程式中的不同類之間混雜使用可能會引起資料一致性的問題,
1.建立物體類User
package com.jms.pojo; public class User { private int id; private String username; private String password; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + '}'; } }
2.建立Mapper介面UserMapper
package com.jms.mapper; import com.jms.pojo.User; import java.util.List; public interface UserMapper { List<User> selectUsers(); }
3.建立Mapper.xml組態檔UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.jms.mapper.UserMapper"> <select id="selectUsers" resultType="user"> select * from mybaties.user </select> </mapper>
4.建立MyBatis組態檔mybatis-config.xml
<?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.jms.pojo"/> </typeAliases> </configuration>
現在的MyBatis組態檔中我們只需要配置別名(typeAlias)和設定(set)的內容,至于愿意,在下面進行解釋,
5.建立一個spring組態檔,用于配置MyBatis的內容
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 資料源DataSource 使用Spring的資料源代替Mybatis的配置,Spring提供的JDBC:org.springframework.jdbc.datasource.DriverManagerDataSource --> <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/MyBaties?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </bean> <!--SqlSessionFactor--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!--系結MyBatis組態檔--> <property name="configLocation" value="mybatis-config.xml"/> <property name="mapperLocations" value="classpath:com/jms/mapper/*.xml"/> </bean> <!--SqlSessionTemplate:實作了SqlSession介面,具有SqlSession的功能--> <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory"/> </bean> </beans>
這里有三個Bean,一個是資料源,一個是工廠,一個是SqlSessionTemplate;SqlSessionTemplate實作了SqlSession介面,也是我們一會要用到的東西,
SqlSessionFactory,官方檔案中有這樣一段說明:
SqlSessionFactory 有一個唯一的必要屬性:用于 JDBC 的 DataSource,這可以是任意的 DataSource 物件,它的配置方法和其它 Spring 資料庫連接是一樣的,
一個常用的屬性是 configLocation,它用來指定 MyBatis 的 XML 組態檔路徑,它在需要修改 MyBatis 的基礎配置非常有用,通常,基礎配置指的是 <settings> 或 <typeAliases> 元素,
需要注意的是,這個組態檔并不需要是一個完整的 MyBatis 配置,確切地說,任何環境配置(<environments>),資料源(<DataSource>)和 MyBatis 的事務管理器(<transactionManager>)都會被忽略, SqlSessionFactoryBean 會創建它自有的 MyBatis 環境配置(Environment),并按要求設定自定義環境的值,
如果 MyBatis 在映射器類對應的路徑下找不到與之相對應的映射器 XML 檔案,那么也需要組態檔,這時有兩種解決辦法:第一種是手動在 MyBatis 的 XML 組態檔中的 <mappers> 部分中指定 XML 檔案的類路徑;第二種是設定工廠 bean 的 mapperLocations 屬性,
也就是說我們僅需要在MyBatis的組態檔中配置別名或設定,其他都在SqlSessionFactory的Bean中進行配置即可,
6.建立一個實作類UserMapperImpl
實作UserMapper介面
package com.jms.mapper; import com.jms.pojo.User; import org.mybatis.spring.SqlSessionTemplate; import java.util.List; public class UserMapperImpl implements UserMapper{ private SqlSessionTemplate sqlSessionTemplate; public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) { this.sqlSessionTemplate = sqlSessionTemplate; } @Override public List<User> selectUsers() { UserMapper userMapper = sqlSessionTemplate.getMapper(UserMapper.class); return userMapper.selectUsers(); } }
可以看到,我們把原來SqlSession的操作封裝到了一個實作類里,也就是說,此時我們只需要呼叫實作類的方法就可以呼叫需要的方法,
7.將實作類注入Bean
這里我們建立一個新的Spring組態檔applicationContext.xml,并且參考剛剛配置了Mybatis內容的組態檔
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd"> <import resource="spring-mybatis.xml"/> <bean id="userMapperImpl" class="com.jms.mapper.UserMapperImpl"> <property name="sqlSessionTemplate" ref="sqlSessionTemplate"/> </bean> </beans>
8.測驗
@Test public void test01() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); UserMapperImpl userMapper = applicationContext.getBean("userMapperImpl", UserMapperImpl.class); List<User> userList = userMapper.selectUsers(); for (User user : userList) System.out.println(user); }
測驗結果如下:

沒有問題,
四、方式二:SqlSessionDaoSupport
官方檔案說明如下:
SqlSessionDaoSupport 是一個抽象的支持類,用來為你提供 SqlSession,呼叫 getSqlSession() 方法你會得到一個 SqlSessionTemplate,
在這個類里面,通常更傾向于使用 MapperFactoryBean,因為它不需要額外的代碼,但是,如果你需要在 DAO 中做其它非 MyBatis 的作業或需要一個非抽象的實作類,那么這個類就很有用了,
SqlSessionDaoSupport 需要通過屬性設定一個 sqlSessionFactory 或 SqlSessionTemplate,如果兩個屬性都被設定了,那么 SqlSessionFactory 將被忽略,
前四步與方式一相同,我們直接從第五步開始:
5.配置MyBatis內容的Spring組態檔
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 資料源DataSource 使用Spring的資料源代替Mybatis的配置,Spring提供的JDBC:org.springframework.jdbc.datasource.DriverManagerDataSource --> <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/MyBaties?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </bean> <!--SqlSessionFactor--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!--系結MyBatis組態檔--> <property name="configLocation" value="mybatis-config.xml"/> <property name="mapperLocations" value="classpath:com/jms/mapper/*.xml"/> </bean> </beans>
此時我們不用再去注入SqlSessionTemplate,因為我們能通過getsession()方法直接獲取,
6.建立一個實作類UserMapperImpl2
package com.jms.mapper; import com.jms.pojo.User; import org.mybatis.spring.support.SqlSessionDaoSupport; import java.util.List; public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper { @Override public List<User> selectUsers() { return getSqlSession().getMapper(UserMapper.class).selectUsers(); } }
這個實作類需要繼承SqlSessionDaoSupport抽象類
7.將實作類注入Bean
<bean id="userMapperImpl2" class="com.jms.mapper.UserMapperImpl2"> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean>
這里屬性sqlSessionFactory和sqlSessionTemplate二選一即可,由于我們沒有注入SqlSessionTemplate,所以這里選擇工廠屬性,
8.測驗
@Test public void test01() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); UserMapperImpl2 userMapper = applicationContext.getBean("userMapperImpl2", UserMapperImpl2.class); List<User> userList = userMapper.selectUsers(); for (User user : userList) System.out.println(user); }
測驗結果:

沒有問題
(本文僅作個人學習記錄用,如有紕漏敬請指正)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/510663.html
標籤:Java
