Spring整合Mybatis(方式一)
12 整合Mybatis
所需依賴
<dependencies> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.7</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.17</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.17</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.9</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.9</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.22</version> </dependency> </dependencies>
12.1 回憶mybatis
1.編寫實體類
import lombok.Data;
@Data
public class User {
private int id;
private String name;
private String pwd;
}
- 2.實現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.zhang.pojo"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" 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="6113081"/> </dataSource> </environment> </environments> <mappers> <package name="com.zhang.mapper"/> </mappers> </configuration>
-
3.編寫介面
UserDao介面編寫
public interface UserMapper { List<User> selectUser(); }
4.編寫相應介面的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.zhang.mapper.UserMapper"> <select id="selectUser" resultType="User"> select * from user </select> </mapper>
5.測試
@Test
public void selectUser() 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> userList = mapper.selectUser();
for (User user: userList){
System.out.println(user);
}
sqlSession.close();
}
12.2 Mybatis-spring
引入Spring之前需要了解mybatis-spring包中的一些重要類;
http://www.mybatis.org/spring/zh/index.html
什麼是 MyBatis-Spring?
MyBatis-Spring 會幫助你將 MyBatis 程式碼無縫地整合到 Spring 中。
知識基礎
在開始使用 MyBatis-Spring 之前,你需要先熟悉 Spring 和 MyBatis 這兩個框架和有關它們的術語。這很重要
MyBatis-Spring 需要以下版本:
MyBatis-Spring | MyBatis | Spring 框架 | Spring Batch | Java |
---|---|---|---|---|
2.0 | 3.5+ | 5.0+ | 4.0+ | Java 8+ |
1.3 | 3.4+ | 3.2.2+ | 2.1+ | Java 6+ |
如果使用 Maven 作為構建工具,僅需要在 pom.xml 中加入以下程式碼即可:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>
要和 Spring 一起使用 MyBatis,需要在 Spring 應用上下文中定義至少兩樣東西:一個 SqlSessionFactory 和至少一個數據對映器類即DataSource。
在 MyBatis-Spring 中,可使用SqlSessionFactoryBean來建立 SqlSessionFactory。要配置這個工廠 bean,只需要把下面程式碼放在 Spring 的 XML 配置檔案中:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
注意:SqlSessionFactory需要一個 DataSource(資料來源)。這可以是任意的 DataSource,只需要和配置其它 Spring 資料庫連線一樣配置它就可以了。
在基礎的 MyBatis 用法中,是通過 SqlSessionFactoryBuilder 來建立 SqlSessionFactory 的。而在 MyBatis-Spring 中,則使用 SqlSessionFactoryBean 來建立。
在 MyBatis 中,你可以使用 SqlSessionFactory 來建立 SqlSession。一旦你獲得一個 session 之後,你可以使用它來執行映射了的語句,提交或回滾連線,最後,當不再需要它的時候,你可以關閉 session。
SqlSessionFactory有一個唯一的必要屬性:用於 JDBC 的 DataSource。這可以是任意的 DataSource 物件,它的配置方法和其它 Spring 資料庫連線是一樣的。
一個常用的屬性是 configLocation,它用來指定 MyBatis 的 XML 配置檔案路徑。它在需要修改 MyBatis 的基礎配置非常有用。通常,基礎配置指的是 < settings> 或 < typeAliases>元素。
需要注意的是,這個配置檔案並不需要是一個完整的 MyBatis 配置。確切地說,任何環境配置(),資料來源()和 MyBatis 的事務管理器()都會被忽略。SqlSessionFactoryBean 會建立它自有的 MyBatis 環境配置(Environment),並按要求設定自定義環境的值。
SqlSessionTemplate 是 MyBatis-Spring 的核心。作為 SqlSession 的一個實現,這意味著可以使用它無縫代替你程式碼中已經在使用的 SqlSession。
模板可以參與到 Spring 的事務管理中,並且由於其是執行緒安全的,可以供多個對映器類使用,你應該總是用 SqlSessionTemplate 來替換 MyBatis 預設的 DefaultSqlSession 實現。在同一應用程式中的不同類之間混雜使用可能會引起資料一致性的問題。
可以使用 SqlSessionFactory 作為構造方法的引數來建立 SqlSessionTemplate 物件。
目前,我們需要將spring和mybatis進行整合,那麼首先我們需要考慮 mybatis做了什麼,mybaits通過讀取配置檔案的資訊,然後生成sqlSessionFactory 進一步生成sqlsession,然後進行操作。
因此我們新建一個spring xml檔案
這段程式碼相當於之前的mybaits-config 中資料庫資訊
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?userSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="6113081"/>
</bean>
這段程式碼相當於配置好sqlsessionFactory,
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!--繫結mybatis配置檔案-->
<property name="configuration" value="classpath:mybatis-config.xml"/>
<property name="mapperLocations" value="classpath:com/zhang/mapper/*.xml"/>
</bean>
如何生成sqlsession呢,我們需要在spring中進行配置。
<!--就是我們使用的sqlsession-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!--只能使用構造器注入,因為沒有set方法-->
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
在之前的mybatis中,我們的sqlsession是通過在實現類生成sqlsession來執行的,那麼在spring中,我們是通過注入進行的。
在具體的實現類中,我們生成set方法,以便spring進行注入。
package com.zhang.mapper;
import com.zhang.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.SqlSessionTemplate;
import java.util.List;
public class UserMapperImpl implements UserMapper{
//我們所有的操作,在原來我們的操作都使用sqlsession來執行,現在我們使用sqlsessionTemplate進行
private SqlSessionTemplate sqlSessionTemplate;
public void setSqlSession(SqlSessionTemplate sqlSession){
this.sqlSessionTemplate=sqlSession;
}
@Override
public List<User> selectUser() {
UserMapper mapper=sqlSessionTemplate.getMapper(UserMapper.class);
return mapper.selectUser();
}
}
SqlSessionTemplate你不可以手動關閉。SqlSessionTemplate是一個代理類,內部他會為每次請求建立執行緒安全的sqlsession,並與Spring進行整合.在你的方法呼叫完畢以後他會自動關閉的。
在xml中進行註冊
<bean id="userMapper" class="com.kuang.mapper.UserMapperImpl">
<property name="sqlSession" ref="sqlSession"/>
</bean>
具體的步驟:
1 編寫資料來源配置
2 sqlSessionFactory
3 sqlSessionTemplate
4 需要給介面加實現類
5 將自己寫的實現類,注入到Spring中
6 測試使用即可
SqlSessionTemplate是mybatis-Spring 的核心。作為SqlSession的一個實現,這意味著可以使用它無縫代替程式碼中已經存在使用的SqlSession ,SqlSessionTemplate是執行緒安全的。可以被多個DAO對映器使用。