【Spring】学习笔记009--Spring整合Mybatis
学习完了Mybatis和Spring,一定要将它们串联起来才能够发挥最大的作用,下面我们来看看如何将Spring和Mybatis整合起来
前期准备
首先导入我们需要的maven依赖
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.3</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
</dependencies>
1.方式一
方式一比较繁琐,需要利用到SqlSession,有点绕,需要我们多去理解一下,我们来看一下
mybatis配置(mybatis-config.xml、spring-dao.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.aircl.domain"/> </typeAliases> </configuration>
<?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/testdatabase001"/> <property name="username" value="root"/> <property name="password" value="mySQL12138"/> </bean> <!--配置sqlSessionFactory--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="datasource"/> <!--绑定mybatis核心配置文件--> <property name="configLocation" value="classpath:mybatis-config.xml"/> <!--绑定mapper.xml--> <property name="mapperLocations" value="classpath:com/aircl/dao/*.xml"/> </bean> <!--配置sqlSession--> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory"/> </bean> </beans>
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"> <import resource="spring-dao.xml"/> <bean id="user" class="com.aircl.domain.User"/> <bean id="userDao" class="com.aircl.dao.UserDaoImpl"> <property name="sqlSession" ref="sqlSession"/> </bean> <bean id="userService" class="com.aircl.service.UserServiceImpl"> <property name="userDao" ref="userDao"/> </bean> </beans>
domain层
@Alias("user")
public class User implements Serializable {
private int id;
private String userName;
private Date birthday;
private String sex;
private String address;
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 Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", userName='" + userName + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}
dao层
在这种方式中需要使用到DaoImpl来通过注入SqlSession拿到Mapper.xml
public interface UserDao { public List<User> selectUser(); }
public class UserDaoImpl implements UserDao { private SqlSessionTemplate sqlSession; public void setSqlSession(SqlSessionTemplate sqlSession) { this.sqlSession = sqlSession; } public List<User> selectUser() { UserDao userDao = sqlSession.getMapper(UserDao.class); return userDao.selectUser(); } }
<?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.aircl.dao.UserDao"> <select id="selectUser" resultType="com.aircl.domain.User"> select * from user </select> </mapper>
service层
public interface UserService { public List<User> selectUser(); }
public class UserServiceImpl implements UserService { private UserDaoImpl userDao; public void setUserDao(UserDaoImpl userDao) { this.userDao = userDao; } public List<User> selectUser() { return userDao.selectUser(); } }
测试
测试时我们直接拿到applicationContext.xml就可以跑起来
public class MyTest { @Test public void testUser(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService = (UserService) context.getBean("userService"); for (User user : userService.selectUser()) { System.out.println(user.toString()); } } }

2.方式二
第二种方式很简单,是我常用的方式,我们不需要使用SqlSession去拿Mapper.xml,我们使用MapperScanner去扫描我们的dao包,自动将mapper注册到spring中,简单快捷,下边我们来看一看
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.aircl.domain"/> </typeAliases> </configuration>
<?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/testdatabase001"/> <property name="username" value="root"/> <property name="password" value="mySQL12138"/> </bean> <!--配置sqlSessionFactory--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="datasource"/> <!--绑定mybatis核心配置文件--> <property name="configLocation" value="classpath:mybatis-config.xml"/> <!--绑定mapper.xml--> <property name="mapperLocations" value="classpath:com/aircl/dao/*.xml"/> </bean> <bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.aircl.dao"/> </bean> </beans>
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 http://www.springframework.org/schema/beans/spring-beans.xsd"> <import resource="spring-dao.xml"/> <bean id="user" class="com.aircl.domain.User"/> <bean id="userService" class="com.aircl.service.UserServiceImpl"> <property name="userDao" ref="userDao"/> </bean> </beans>
domain层
package com.aircl.domain; import org.apache.ibatis.type.Alias; import java.io.Serializable; import java.util.Date; /** * Description : * * @author : AirCL * Date : 2021/2/6 * Time : 14:11 */ @Alias("user") public class User implements Serializable { private int id; private String userName; private Date birthday; private String sex; private String address; 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 Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User{" + "id=" + id + ", userName='" + userName + '\'' + ", birthday=" + birthday + ", sex='" + sex + '\'' + ", address='" + address + '\'' + '}'; } }
dao层
这种方式的dao层不需要DaoImpl去拿SqlSession取Mapper.xml,直接一个dao接口+Mapper.xml即可
public interface UserDao { public List<User> selectUser(); }
<?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.aircl.dao.UserDao"> <select id="selectUser" resultType="com.aircl.domain.User"> select * from user </select> </mapper>
service层
service层也不需要使用DaoImpl对象,直接使用Dao接口对象即可,mapperscanner会将dao接口注册到spring中,以供我们使用
public interface UserService { public List<User> selectUser(); }
public class UserServiceImpl implements UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public List<User> selectUser() { return userDao.selectUser(); } }
测试
public class MyTest { @Test public void testUser(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService = (UserService) context.getBean("userService"); for (User user : userService.selectUser()) { System.out.println(user.toString()); } } }


浙公网安备 33010602011771号