Spring整合Mybatis
步骤:
- 导入相关jar包(Maven依赖)
- junit
- mybatis
- mysql数据库
- spring相关的
- spring-jdbc(连接Spring操作数据库的话,还需要一个Spring-jdbc)
- aop织入
- mybatis-spring【new】
- 编写配置文件
- 测试
Maven依赖
xml
<dependencies>
<!--Mysql数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--Mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!--Spring相关的-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<!--Spring-jdbc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!--aop织入-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
<!--mybatis-spring-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.1.2</version>
</dependency>
<!--lobok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
</dependencies>

参考文档:
plain
https://mybatis.org/spring/zh_CN/index.html
回忆Mybatis
- 编写实体类
- 编写核心配置文件
- 编写接口
- 编写Mapper.xml
- 编写Mybatis工具类
- 测试
实体类
java
import lombok.Data;
//@Data //提供该类上所有的属性getter/setter方法,还提供了构造函数,toString(),equals(),hashCode()方法
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;
}
// 查询全部用户的数据,靠toStirng()方法
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}
核心配置文件
xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration核心配置文件-->
<configuration>
<properties resource="config.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>
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
config.properties
properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=123456
接口
java
public interface UserMapper {
List<User> selectUser();
}
Mapper.xml
xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespcae=绑定一个对应的Dao/Mapper接口-->
<mapper namespace="com.cike10.mapper.UserMapper">
<select id="selectUser" resultType="com.cike10.pojo.User">
select * from mybatis.user;
</select>
</mapper>
工具类
java
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
// 获取sqlSessionFacttory对象
String resource= "mybatis-config.xml";
try {
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
// 获取SqlSession 实例
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
测试类
java
public class cike10_test {
@Test
public void test(){
SqlSession sqlSession = new MybatisUtils().getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.selectUser();
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}
}

Mybatis-Spring
什么是Mybatis-Spring
MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 <font style="color:rgb(221, 17, 68);background-color:rgb(247, 247, 249);">SqlSession</font> 并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的 <font style="color:rgb(221, 17, 68);background-color:rgb(247, 247, 249);">DataAccessException</font>。 最终,可以做到应用代码不依赖于 MyBatis,Spring 或 MyBatis-Spring。
方式一
- 建一个数据库、表、列、内容
- 编写实体类JavaBean:对应数据库的字段
- 编写Dao层接口 UserMapper
- 编写绑定Dao层接口的UserMapper.xml配置文件
- 编写Dao层实现类 UserMaapperImpl
- 编写spring配置文件:spring-dao.xml(Spring整合mybatis)
- 配置数据源(使用Spring提供的JDBC、drivername、用户名、密码)
- 创建sqlSessionFactory和Sqlsession,并且绑定UserMapper.xml配置文件
- 使用SqlSessionTemplate,也就是使用SqlSession
- Dao层实现类,注入 sqlSession属性
- 可选(spring配置文件导入)
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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="spring-dao.xml"/>
<!-- <import resource="spring-mvc.xml"/>-->
</beans>
- 测试
User类 JavaBean
java
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 + '\'' +
'}';
}
}
UserMapper接口
java
public interface UserMapper {
List<User> selectUser();
}
UserMapper.xml
xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespcae=绑定一个对应的Dao/Mapper接口-->
<mapper namespace="com.cike10.mapper.UserMapper">
<select id="selectUser" resultType="com.cike10.pojo.User">
select * from mybatis.user;
</select>
</mapper>
UserMapper实现类 SqlSession.getMapper()的操作
java
public class UserMapperImpl implements UserMapper{
// 我们的所有操作,都是用SqlSession来执行,在原来,现在都使用SqlSessionTemplate;
private SqlSessionTemplate sqlSession;
public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
@Override
public List<User> selectUser() {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.getByUserList();
// for (User user : users) {
// System.out.println(user);
// }
return users;
}
}
spring-dao.xml
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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--DataSource:使用Spring的数据源替换Mybatis的配置 c3p0 dbcp druid
我们这里使用Spirng提供的JDBC org.springframework.jdbc.datasource
spring管理数据源了
-->
<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?useUnicode=true&characterEncoding=utf8&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!--sqlSessionFactory
Sqlsession的创建
-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="datasource" />
<!--绑定Mybatis配置文件(可选)-->
<!-- <property name="configLocation" value="classpath:mybatis-config.xml"/>-->
<property name="mapperLocations" value="classpath:UserMapper.xml"/>
</bean>
<!--SqlSessionTemplate:就是我们使用的SqlSession-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!--只能使用构造器注入sqlSessionFactory,因为它没有set方法-->
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
<bean id="userMapper" class="com.cike10.mapper.UserMapperImpl">
<property name="sqlSession" ref="sqlSession"/>
</bean>
</beans>

可以发现这里的class其实指的是Maven依赖中路径对应的

测试类
java
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("spring-dao.xml");
UserMapperImpl userMapperImpl = context.getBean("userMapperImpl", UserMapperImpl.class);
List<User> UserList = userMapperImpl.getByUserList();
for (User user : UserList) {
System.out.println(user);
}
参考文档:
plain
https://mybatis.org/spring/zh_CN/sqlsession.html
方式二(简化写法-SqlSessionDaoSupport)
原理
在 SqlSessionDaoSupport抽象类中,存在可以直接调用SqlSession

可以看到这里返回的就是SqlSessionTemplate类
java
public SqlSession getSqlSession() {
return this.sqlSessionTemplate; //
}
不用去注册SqlSessionTemplate类的bean id了
xml
<!--使用SqlSession-->
<bean id="SqlSession" class="org.mybatis.spring.SqlSessionTemplate ">
<constructor-arg index="0" ref="SqlSessionFactory"/>
</bean>
实现代码
UserMapper实现类(操作SqlSession.getMapper().xx方法())
java
public class UserMapperImp2 extends SqlSessionDaoSupport implements UserMapper {
@Override
public List<User> getByUserList() {
// SqlSession sqlSession = getSqlSession();
// UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// return mapper.getByUserList();
// 相当于下面这行代码;
return getSqlSession().getMapper(UserMapper.class).getByUserList();
}
}
配置Spring容器元数据:Spring-dao.xml
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
https://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?useUnicode=true&characterEncoding=utf8&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
<property name="schema" value="mybatis"/>
</bean>
<!--创建SqlSessionFactory-->
<bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="datasource"/>
<property name="mapperLocations" value="classpath:UserMapper.xml"/>
</bean>
<!--使用SqlSession-->
<!-- <bean id="SqlSession" class="org.mybatis.spring.SqlSessionTemplate ">-->
<!-- <constructor-arg index="0" ref="SqlSessionFactory"/>-->
<!-- </bean>-->
<!--SqlSession实现类
相当于sqlSession.getMapper(User.class)操作
-->
<!-- <bean id="userMapperImpl" class="com.cike11.dao.UserMapperImpl">-->
<!-- <property name="sqlSession" ref="SqlSession"/>-->
<!-- </bean>-->
<bean id="userMapperImpl2" class="com.cike11.dao.UserMapperImp2">
<property name="sqlSessionFactory" ref="SqlSessionFactory"/>
</bean>
</beans>
参考文档:
plain
https://mybatis.org/spring/zh_CN/sqlsession.html