mybatis-spring:SqlSessionTemplate和SqlSessionDaoSupport的说明和使用(源码版)

2023-05-16

文章目录

  • 前言➰官网
  • 分析源码
  • SqlSessionTemplate
  • 使用
  • SqlSessionDaoSupport
    • 玩源码

前言➰官网

还是补一下这个知识点比较好🧡

🔺SqlSessionTemplate 是 MyBatis-Spring 的核心。作为 SqlSession 的一个实现,这意味着可以使用它无缝代替你代码中已经在使用的 SqlSession。 SqlSessionTemplate 是线程安全的,可以被多个 DAO 或映射器所共享使用。

🔷当调用 SQL 方法时(包括由 getMapper() 方法返回的映射器中的方法),SqlSessionTemplate 将会保证使用的 SqlSession 与当前 Spring 的事务相关。 此外,它管理 session 的生命周期,包含必要的关闭、提交或回滚操作。另外,它也负责将 MyBatis 的异常翻译成 Spring 中的 DataAccessExceptions。

🔷由于模板可以参与到 Spring 的事务管理中,并且由于其是线程安全的,可以供多个映射器类使用,你应该总是用 SqlSessionTemplate 来替换 MyBatis 默认的 DefaultSqlSession 实现。在同一应用程序中的不同类之间混杂使用可能会引起数据一致性的问题。

🔺可以使用 SqlSessionFactory 作为构造方法的参数来创建 SqlSessionTemplate 对象

分析源码

先来看看我们在配置文件中的简单使用:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
      <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC"/>
      <property name="username" value="root"/>
      <property name="password" value="123456"/>
  </bean>
  
      <!--sqlSessionFactory-->
  <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:com/xmonster/mapper/*.xml"/>
  </bean>

  <bean id="sqlsession" class="org.mybatis.spring.SqlSessionTemplate">
<!--       只能使用构造方法注入sqlSessionFactory,因为它没有set方法!  -->
      <constructor-arg index="0" ref="sqlSessionFactory"/>
  </bean>

SqlSessionTemplate

来简单看它的部分源码

public class SqlSessionTemplate implements SqlSession, DisposableBean {

  private final SqlSessionFactory sqlSessionFactory;

  private final ExecutorType executorType;

  private final SqlSession sqlSessionProxy;

  private final PersistenceExceptionTranslator exceptionTranslator;

  /**
   * Constructs a Spring managed SqlSession with the {@code SqlSessionFactory} provided as an argument.
   *
   * @param sqlSessionFactory
   *          a factory of SqlSession
   */
  public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
    this(sqlSessionFactory, sqlSessionFactory.getConfiguration().getDefaultExecutorType());
  }
}

由于它继承了SqlSession,所以一般就利用它来创建SqlSession的实例

使用

下面是我练习的部分代码,主要是看看它怎么用,直接定义就可以了,别忘了写set方法

package com.xmonster.mapper;

import com.xmonster.pojo.User;
import org.mybatis.spring.SqlSessionTemplate;

import java.util.List;

public class UserMapperImpl implements UserMapper{
//    我们的所有操作都使用sqlSession来执行,在原来,现在都使用sqlSessionTemplate;
    private SqlSessionTemplate sqlSession;

    public void setSqlSession(SqlSessionTemplate sqlSession) {
        this.sqlSession = sqlSession;
    }

    @Override
    public List<User> select() {
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        return mapper.select();
    }

    @Override
    public int addUser(User user) {
        return 0;
    }

    @Override
    public int delete(int id) {
        return 0;
    }
}

再来看这个类给我们提供了哪些方法:
在这里插入图片描述
可以看到它帮我们把增删改查以及事务的提交都写好了!💜

SqlSessionDaoSupport

前面我们可以看到我想用一个SqlSession,有点麻烦,我又要定义出来,还要写set方法,不舒服,我想直接就使用SqlSession,然后直接getMapper这样子,在这里spring中有一个抽象类叫做SqlSessionDaoSupport,帮助我们完成了这部分工作,来看看它的部分源码

玩源码

➰由以下源码可以看到,它继承了DaoSupport,也可以看到他帮我们定义好了SqlSessionTemplate

public abstract class SqlSessionDaoSupport extends DaoSupport {

  private SqlSessionTemplate sqlSessionTemplate;

  /**
   * Set MyBatis SqlSessionFactory to be used by this DAO. Will automatically create SqlSessionTemplate for the given
   * SqlSessionFactory.
   *
   * @param sqlSessionFactory
   *          a factory of SqlSession
   */
  public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
    if (this.sqlSessionTemplate == null || sqlSessionFactory != this.sqlSessionTemplate.getSqlSessionFactory()) {
      this.sqlSessionTemplate = createSqlSessionTemplate(sqlSessionFactory);
    }
  }
 }

在这里插入图片描述
我们直接调用getSqlSession这个方法即可
源码不长,感兴趣的朋友可以自己去看看,这里不再展示源码
🔺看实战

package com.xmonster.mapper;

import com.xmonster.pojo.User;
import org.mybatis.spring.support.SqlSessionDaoSupport;

import java.util.List;

public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper {
    @Override
    public int addUser(User user) {
        return getSqlSession().getMapper(UserMapper.class).addUser(user);
    }

    @Override
    public int delete(int id) {
        return getSqlSession().getMapper(UserMapper.class).delete(id);
    }

很舒服🥂

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mybatis-spring:SqlSessionTemplate和SqlSessionDaoSupport的说明和使用(源码版) 的相关文章

随机推荐