持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情
Mybatis-spring
MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession 并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的 DataAccessException。 最终,可以做到应用代码不依赖于 MyBatis,Spring 或 MyBatis-Spring。
版本要求:
| MyBatis-Spring | MyBatis | Spring Framework | 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是3.4以下就用1.3版本
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
SqlSessionTemplate
Usermapper实现类
由于Spring通过bean来管理,所以这里的sqlSeesionFactory的创建等都集成在了bean中,只留下的最后的getMapper,用类来实现
package com.sentiment.mapper;
import com.sentiment.pojo.User;
import org.mybatis.spring.SqlSessionTemplate;
import java.util.List;
public class UserMapperImpl implements UserMapper{
private SqlSessionTemplate sqlSession;
public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
@Override
public List<User> selectUser() {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
return mapper.selectUser();
}
}
配置文件
下边主要是通过管理bean的方式创建sqlSeesion
<?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/Mybatis"></property>
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
</bean>
<!--sqlSeesionFactory: 使用 SqlSessionFactoryBean来创建 SqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!--绑定Mybatis配置文件-->
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<property name="mapperLocations" value="classpath:com/sentiment/mapper/*.xml"></property>
</bean>
<!--SqlSeesionTemplate:相当于Mybatis中的sqlSession-->
<bean id="sqlSeesion" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactory"></constructor-arg>
</bean>
<!--给sqlSeesion属性赋值,并通过mapper获取我们要执行的方法-->
<bean id="userMapper" class="com.sentiment.mapper.UserMapperImpl">
<property name="sqlSession" ref="sqlSeesion"></property>
</bean>
</beans>
总体流程:
查询语句首先要定义对应的类(User.java)
之后就要定义实现查询语句的接口(UserMapper.java)
有了接口后就要有对应实现语句的配置文件(UserMapper.xml)
之后是总的mybatis配置文件(而由于结合spring,所以用了spring配置文件代替—spring-mybatis.xml)
最后添加一个接口实现类来获取配置文件中创建的sqlSeesion对象并实现对应的查询方法(UserMapperImpl.java)
SqlSessionDaoSupport
除SqlSeesionTemplate外,官方还给出了另一种方法—SqlSessionDaoSupport,这种方法的本质其实还是SqlSeesionTemplate只是对他进行了一些简化,所以使用起来更方便一些。
使用该种方式配置文件中就不在需要获取sqlSeesion,只需要获取到SQLSessionFactory处即可。
public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper {
@Override
public List<User> selectUser() {
SqlSession sqlSession = getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
return mapper.selectUser();
}
}
执行语句也可精简成一句
return getSqlSession().getMapper(UserMapperImpl2.class).selectUser();
事务管理
可以把一系列要执行的操作称为事务,而事务管理就是管理这些操作要么完全执行,要么完全不执行
在UsermapperImpl.java实现添加和删除方法
@Override
public List<User> selectUser() {
User user = new User(5, "Sentiment", "123456", 20, "男", "123@qq.com");
UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
mapper.insertUser(user);
mapper.deleteUser(5);
return getSqlSession().getMapper(UserMapper.class).selectUser();
}
@Override
public int insertUser(User user) {
return getSqlSession().getMapper(UserMapper.class).insertUser(user);
}
@Override
public int deleteUser(int id) {
return getSqlSession().getMapper(UserMapper.class).deleteUser(id);
}
并且将mapper的配置文件中delete特意写错
此时执行后发现报错,但查询表后发现insert方法已经被执行了,所以就引入了声明式事务来确保操作要么完全执行,要么完全不执行。
声明式事务
此时添加事务声明配置文件,之后在执行当遇到错误时,就会直接终止完全不执行