Spring5入門-12-整合Mybatis
一、前言
- 參考視訊:遇見狂神說-Spring5
- 參考文件:mybatis-spring
環境:
- mysql8.0.21
- Spring 5.2.9
- mybaits 3.5.5
- mybatis-spring 2.0.5
- aspectj 1.9.4
- junit 4.12
要注意的事情:
在開始使用 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+
二、環境-回顧mybatis
2.1 依賴
<!--mysql8--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.21</version> </dependency> <!--Spring--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.9.RELEASE</version> </dependency> <!--Mybatis--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency> <!--Mybaits-Spring--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.5</version> </dependency> <!--AOP織入--> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.4</version> </dependency> <!--JUnit--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
2.2 資料庫
2.3 pojo
package com.duzhuan.pojo; /** * @Autord: HuangDekai * @Date: 2020/10/11 15:35 * @Version: 1.0 * @since: jdk11 */ public class User { private int id; private String name; private String pwd; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", pwd='" + pwd + '\'' + '}'; } }
2.4 mybatis配置檔案
路徑
程式碼
mybaits-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>
<properties resource="db.properties"/>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<typeAliases>
<package name="com.duzhuan.pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper class="com.duzhuan.mapper.UserMapper"/>
</mappers>
</configuration>
這裡已經預先配好了mapper,請選擇合適自己路徑的mapper。
db.properties
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF8&serverTimezone=UTC
username = root
password = qq123456
2.5 mapper
路徑
注意事項
在此處的xml
檔案等配置檔案,由於是Maven專案的原因,很有可能不能複製到target目錄下,即真正執行的路徑下沒有UserMapper.xml
,因此需要在pom.xml的根標籤中加入以下配置:
<build>
<resources>
<resource>
<directory>src/main/resource/</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java/</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
程式碼
UserMapper:
package com.duzhuan.mapper;
import com.duzhuan.pojo.User;
import java.util.List;
/**
* @Autord: HuangDekai
* @Date: 2020/10/11 20:06
* @Version: 1.0
* @since: jdk11
*/
public interface UserMapper {
List<User> getUserList();
}
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="com.duzhuan.mapper.UserMapper">
<select id="getUserList" resultType="User">
select * from mybatis.user
</select>
</mapper>
2.6 測試類
路徑
程式碼
UserMapperTest:
package com.duzhuan.mapper;
import com.duzhuan.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @Autord: HuangDekai
* @Date: 2020/10/11 20:16
* @Version: 1.0
* @since: jdk11
*/
public class UserMapperTest {
@Test
public void userMapperTest() throws IOException {
String config = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(config);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
}
}
結果
三、Mybatis-Spring SqlSessionTemplate
基於以上環境,對其進行修改。
-
建立spring-dao.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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <context:property-placeholder location="db.properties"/> <!--使用spring的資料來源替換Mybatis的配置 這裡使用spring提供的JDBC--> <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&serverTimezone=UTC"/> <property name="username" value="root"/> <property name="password" value="qq123456"/> </bean> </beans>
這樣就可以刪掉mybatis-config.xml相關的部分:
<properties resource="db.properties"/> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments>
-
設定mybatis配置和匯入mybatis配置。其實可以完全由Spring配置,但我習慣將
<settings>
和typeAliases
放在mybatis的配置檔案中,因此會用到匯入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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <context:property-placeholder location="db.properties"/> <!--使用spring的資料來源替換Mybatis的配置 這裡使用spring提供的JDBC--> <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&serverTimezone=UTC"/> <property name="username" value="root"/> <property name="password" value="qq123456"/> </bean> <!--sqlSessionFactory--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!-- 匯入mybatis的配置 其實可以純spring配置mybatis,無需匯入。 --> <property name="configLocation" value="mybatis-config.xml"/> <!--比如這個,繫結UserMapper--> <property name="mapperLocations" value="classpath:com/duzhuan/mapper/UserMapper.xml"/> </bean> </beans>
由於有
<property name="mapperLocations" value="classpath:com/duzhuan/mapper/UserMapper.xml"/>
,因此可以刪掉mybatis-config.xml
中的:<mappers> <mapper class="com.duzhuan.mapper.UserMapper"/> </mappers>
-
配置
sqlSession
:-
spring-mybatis中,是沒有
sqlSession
的,sqlSessionTemplate
等價於sqlSession
。開啟org.mybatis.spring.SqlSessionTemplate
可以看到的是:它沒有Setter方法,只能構造器注入。
-
在spring-dao.xml中新增:
<!--sqlSession--> <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean>
-
-
有了
sqlSession
,下一步就應該getMapper
了。建立UserMapperImpl:
程式碼:
package com.duzhuan.mapper; import com.duzhuan.pojo.User; import org.mybatis.spring.SqlSessionTemplate; import java.util.List; /** * @Autord: HuangDekai * @Date: 2020/10/12 15:29 * @Version: 1.0 * @since: jdk11 */ public class UserMapperImpl implements UserMapper{ private SqlSessionTemplate sqlSessionTemplate; public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) { this.sqlSessionTemplate = sqlSessionTemplate; } @Override public List<User> getUserList() { UserMapper userMapper = sqlSessionTemplate.getMapper(UserMapper.class); return userMapper.getUserList(); } }
在spring-dao.xml中新增:
<!--Mapper--> <bean id="userMapper" class="com.duzhuan.mapper.UserMapperImpl"> <property name="sqlSessionTemplate" ref="sqlSessionTemplate"/> </bean>
-
修改UserMapperTest:
package com.duzhuan.mapper; import com.duzhuan.pojo.User; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import java.io.IOException; import java.util.List; /** * @Autord: HuangDekai * @Date: 2020/10/11 20:16 * @Version: 1.0 * @since: jdk11 */ public class UserMapperTest { @Test public void userMapperTest() throws IOException { ApplicationContext context = new ClassPathXmlApplicationContext("spring-dao.xml"); UserMapper userMapper = context.getBean("userMapper", UserMapper.class); List<User> userList = userMapper.getUserList(); for (User user : userList) { System.out.println(user); } } }
執行測試樣例結果:
附上spring-dao.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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <context:property-placeholder location="db.properties"/> <!--使用spring的資料來源替換Mybatis的配置 這裡使用spring提供的JDBC--> <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&serverTimezone=UTC"/> <property name="username" value="root"/> <property name="password" value="qq123456"/> </bean> <!--sqlSessionFactory--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!-- 匯入mybatis的配置 其實可以純spring配置mybatis,無需匯入。 --> <property name="configLocation" value="mybatis-config.xml"/> <!--比如這個,繫結UserMapper--> <property name="mapperLocations" value="classpath:com/duzhuan/mapper/UserMapper.xml"/> </bean> <!--sqlSession--> <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean> <!--Mapper--> <bean id="userMapper" class="com.duzhuan.mapper.UserMapperImpl"> <property name="sqlSessionTemplate" ref="sqlSessionTemplate"/> </bean> </beans>
四、SqlSessionDaoSupport
另外一種方法。
建立一個UserMapper的實現類UserMapperDaoSupport:
程式碼:
package com.duzhuan.mapper;
import com.duzhuan.pojo.User;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import java.util.List;
/**
* @Autord: HuangDekai
* @Date: 2020/10/12 17:25
* @Version: 1.0
* @since: jdk11
*/
public class UserMapperDaoSupportImpl extends SqlSessionDaoSupport implements UserMapper {
@Override
public List<User> getUserList() {
return getSqlSession().getMapper(UserMapper.class).getUserList();
}
}
在spring-dao.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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder location="db.properties"/>
<!--使用spring的資料來源替換Mybatis的配置
這裡使用spring提供的JDBC-->
<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&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="qq123456"/>
</bean>
<!--sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--
匯入mybatis的配置
其實可以純spring配置mybatis,無需匯入。
-->
<property name="configLocation" value="mybatis-config.xml"/>
<!--比如這個,繫結UserMapper-->
<property name="mapperLocations" value="classpath:com/duzhuan/mapper/UserMapper.xml"/>
</bean>
<!--sqlSession-->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
<!--Mapper-->
<bean id="userMapper" class="com.duzhuan.mapper.UserMapperImpl">
<property name="sqlSessionTemplate" ref="sqlSessionTemplate"/>
</bean>
<!--====================add===============-->
<bean id="UserMapperDaoSupportImpl" class="com.duzhuan.mapper.UserMapperDaoSupportImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
<!--====================add===============-->
</beans>
執行結果: