MyBatis与Spring中的SqlSession详解

 更新时间:2024年05月25日 17:16:30   作者:你知道“铁甲小宝”吗丶  
在MyBatis中,你可以使用SqlSessionFactory来创建SqlSession,使用MyBatis-Spring之后,你不再需要直接使用SqlSessionFactory了,接下来通过示例代码讲解MyBatis与Spring中的SqlSession,需要的朋友可以参考下

前言

在 MyBatis 中,你可以使用 SqlSessionFactory 来创建 SqlSession。 一旦你获得一个 session 之后,你可以使用它来执行映射了的语句,提交或回滚连接,最后,当不再需要它的时候,你可以关闭 session。 使用 MyBatis-Spring 之后,你不再需要直接使用 SqlSessionFactory 了,因为你的 bean 可以被注入一个线程安全的 SqlSession,它能基于 Spring 的事务配置来自动提交、回滚、关闭 session。

一、SqlSessionTemplate

1. 创建

SqlSessionTemplate 是 MyBatis-Spring 的核心。作为 SqlSession 的一个实现,这意味着可以使用它无缝代替你代码中已经在使用的 SqlSession。 SqlSessionTemplate 是线程安全的,可以被多个 DAO 或映射器所共享使用。
当调用 SQL 方法时(包括由 getMapper() 方法返回的映射器中的方法),SqlSessionTemplate 将会保证使用的 SqlSession 与当前 Spring 的事务相关。 此外,它管理 session 的生命周期,包含必要的关闭、提交或回滚操作。另外,它也负责将 MyBatis 的异常翻译成 Spring 中的 DataAccessExceptions。
由于模板可以参与到 Spring 的事务管理中,并且由于其是线程安全的,可以供多个映射器类使用,你应该总是用 SqlSessionTemplate 来替换 MyBatis 默认的 DefaultSqlSession 实现。在同一应用程序中的不同类之间混杂使用可能会引起数据一致性的问题。
可以使用 SqlSessionFactory 作为构造方法的参数来创建 SqlSessionTemplate 对象。

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
  <constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
@Configuration
public class MyBatisConfig {
  @Bean
  public SqlSessionTemplate sqlSession() throws Exception {
    return new SqlSessionTemplate(sqlSessionFactory());
  }
}

2. 使用

Autowired
SqlSessionTemplate sqlSessionTemplate;

3. 批量操作

3.1 创建SqlSessionTemplate

@Bean
public SqlSessionTemplate sqlSession(SqlSessionFactory sqlSessionFactory) throws Exception {
    return new SqlSessionTemplate(sqlSessionFactory, ExecutorType.BATCH);
}

3.2 service

@Autowired
SqlSession sqlSession;
public void insertUsers(List<User> users) {
    for (User user : users) {
        sqlSession.getMapper(UserMapper.class).insert(user);
    }
}

3.3 controller

@RequestMapping("003")
public void mybatis003() {
    List<User> users=new ArrayList<>();
    for(int i=10;i<20;i++){
        users.add(new User(i));
    }
    userService.insertUsers(users);
}

二、SqlSessionDaoSupport

SqlSessionDaoSupport 是一个抽象的支持类,用来为你提供 SqlSession。调用 getSqlSession() 方法你会得到一个 SqlSessionTemplate,之后可以用于执行 SQL 方法,就像下面这样:

public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
  public User getUser(String userId) {
    return getSqlSession().selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId);
  }
}

在这个类里面,通常更倾向于使用 MapperFactoryBean,因为它不需要额外的代码。但是,如果你需要在 DAO 中做其它非 MyBatis 的工作或需要一个非抽象的实现类,那么这个类就很有用了。

SqlSessionDaoSupport 需要通过属性设置一个 sqlSessionFactory 或 SqlSessionTemplate。如果两个属性都被设置了,那么 SqlSessionFactory 将被忽略。

假设类 UserMapperImpl 是 SqlSessionDaoSupport 的子类,可以编写如下的 Spring 配置来执行设置:

<bean id="userDao" class="org.mybatis.spring.sample.dao.UserDaoImpl">
  <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

总结

到此这篇关于MyBatis与Spring中的SqlSession的文章就介绍到这了,更多相关MyBatis Spring中SqlSession内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java二维数组遍历的2种代码

    java二维数组遍历的2种代码

    这篇文章主要介绍了java二维数组遍历的2种代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Java JVM运行时数据区(Run-Time Data Areas)

    Java JVM运行时数据区(Run-Time Data Areas)

    运行时数据区,是java虚拟机定义的在程序执行期间使用的各种运行时的数据区,通过JVM运行时数据区图例给大家展示的很详细,对JVM 运行时数据区相关知识感兴趣的朋友跟随小编一起看看吧
    2021-06-06
  • Java语言class类用法及泛化(详解)

    Java语言class类用法及泛化(详解)

    这篇文章主要介绍了Java语言class类用法及泛化(详解),大家都知道Java程序在运行过程中,对所有的对象今夕类型标识,也就是RTTI。这项信息记录了每个对象所属的类,需要的朋友可以参考下
    2015-07-07
  • spring @Primary-在spring中的使用方式

    spring @Primary-在spring中的使用方式

    这篇文章主要介绍了spring @Primary-在spring中的使用方式,具有很好的参考价值,希望对大家有所帮助。
    2022-01-01
  • java 定时同步数据的任务优化

    java 定时同步数据的任务优化

    这篇文章主要介绍了java 定时同步数据的任务优化,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-12-12
  • Java 多线程有序执行的几种方法总结

    Java 多线程有序执行的几种方法总结

    这篇文章主要介绍了Java 多线程有序执行的几种方法总结的相关资料,需要的朋友可以参考下
    2017-03-03
  • Java获取泛型实际类型的方法详解

    Java获取泛型实际类型的方法详解

    这篇文章主要介绍了Java获取泛型实际类型的方法详解,泛型,即“参数化类型”,一提到参数,最熟悉的就是定义方法时有形参列表,普通方法的形参列表中,每个形参的数据类型是确定的,而变量是一个参数,需要的朋友可以参考下
    2023-11-11
  • SpringBoot中的@Inherited注解详解

    SpringBoot中的@Inherited注解详解

    这篇文章主要介绍了SpringBoot中的@Inherited注解详解,@Inherited是一个标识,用来修饰注解,如果一个类用上了@Inherited修饰的注解,那么其子类也会继承这个注解,需要的朋友可以参考下
    2023-08-08
  • Java中Request请求转发详解

    Java中Request请求转发详解

    这篇文章主要介绍了Java中Request请求转发详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Java如何处理数据成为树状结构

    Java如何处理数据成为树状结构

    这篇文章主要介绍了Java如何处理数据成为树状结构问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07

最新评论