Mybatis-Spring

80 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情

Mybatis-spring

官方文档

MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession 并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的 DataAccessException。 最终,可以做到应用代码不依赖于 MyBatis,Spring 或 MyBatis-Spring。

版本要求:

MyBatis-SpringMyBatisSpring FrameworkSpring BatchJava
2.03.5+5.0+4.0+Java 8+
1.33.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方法已经被执行了,所以就引入了声明式事务来确保操作要么完全执行,要么完全不执行。

声明式事务

mybatis-spring –

此时添加事务声明配置文件,之后在执行当遇到错误时,就会直接终止完全不执行