第5章 使用 SqlSession

第五章 使用 SqlSession

原稿链接; http://www.mybatis.org/spring/zh/sqlsession.html

在 MyBatis 中,你能够运用 SqlSessionFactory 来创建SqlSession。一旦您赚取2个 session
之后,你可以动用它来施行映射语句,提交或回滚连接,最终,当不再供给它的时 候,
你能够关闭 session。 使用 MyBatis-Spring 之后, 你不再须要一贯运用
SqlSessionFactory 了,因为您的 bean 可以透过3个线程安全的 SqlSession
来注入,基于 Spring 的事体配置 来自动提交,回滚,关闭 session。

留意日常不必直接使用 SqlSession。 在大很多景况下 MapperFactoryBean,
将会在 bean 中注入所必要的映射器。下一章节中的 MapperFactoryBean(6.一节)会分解那些细节。

SqlSessionTemplate

SqlSessionTemplate 是 MyBatis-Spring 的为主。 这几个类负责管理 MyBatis 的
SqlSession, 调用 MyBatis 的 SQL 方法, 翻译非常。 SqlSessionTemplate
是线程安全的, 能够被两个 DAO 所共享应用。

当调用 SQL 方法时, 包罗从映射器 getMapper()方法重回的法子,
SqlSessionTemplate 将会确定保障使用的 SqlSession 是和近期 Spring
的作业相关的。其余,它管理 session 的生命
周期,包罗要求的关闭,提交或回滚操作。

SqlSessionTemplate 完毕了 SqlSession 接口,那便是说,在代码中无需对
MyBatis 的 SqlSession 进行沟通。 SqlSessionTemplate
平日是被用来取代私下认可的 MyBatis 达成的 DefaultSqlSession ,
因为模板能够插足到 Spring 的事体中而且被三个注入的映射器类所使
用时也是线程安全的。一样应用程序中五个类之间的更动大概会挑起数据一致性的题目。

SqlSessionTemplate 对象足以行使 SqlSessionFactory
作为构造方法的参数来成立。

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
  <constructor-arg index="0" ref="sqlSessionFactory" />
</bean>

这一个 bean 未来能够一直注入到 DAO bean 中。你需求在 bean 中增添一个SqlSession 属性,就像上边包车型大巴代码:

public class UserDaoImpl implements UserDao {

  private SqlSession sqlSession;

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

  public User getUser(String userId) {
    return (User) sqlSession.selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId);
  }
}

如下注入 SqlSessionTemplate:

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

SqlSessionTemplate 有八个应用 ExecutorType
作为参数的构造方法。那允许你用来 成立对象,比如,四个批量
SqlSession,可是选用了下列 Spring 配置的 XML 文件:

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
  <constructor-arg index="0" ref="sqlSessionFactory" />
  <constructor-arg index="1" value="BATCH" />
</bean>

后天您有所的言语能够批量操作了,上边包车型客车言辞就能够在 DAO 中动用了。

public void insertUsers(User[] users) {
   for (User user : users) {
     sqlSession.insert("org.mybatis.spring.sample.mapper.UserMapper.insertUser", user);
   }
 }

留意,纵然所需的施行情势和暗许的 SqlSessionFactory
设置不一致,那种布置风格才 能选拔。

对那种方式供给表达的是当那些方法被调用时,不可能有三个存在利用不一致ExecutorType 运维的事体。也要确认保证在分化的政工中,使用不一样试行器来调用
SqlSessionTemplate 时, (比如
PROPAGATION_REQUIRES_NEW)或完全在几个业务外面。

SqlSessionDaoSupport

SqlSessionDaoSupport 是 1 个 抽象 的支 持 类, 用来 为您 提供 SqlSession
。 调 用 getSqlSession()方法你会赢得一个SqlSessionTemplate,之后能够用于施行 SQL 方法, 就像上面那样:

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

习以为常 MapperFactoryBean
是以此类的首选,因为它不必要万分的代码。然而,如果你 要求在 DAO 中做任何非
MyBatis 的干活或索要现实的类,那么这些类就很有用了。

SqlSessionDaoSupport 须要贰个 sqlSessionFactory 或 sqlSessionTemplate
属性来 设 置 。 这 些 被 明 确 地 设 置 或 由 Spring 来 自 动 装 配 。
如 果 两 者 都 被 设 置 了 , 那 么 SqlSessionFactory 是被忽略的。

假设类 UserMapperImpl 是 SqlSessionDaoSupport 的子类,它能够在 Spring
中张开如 下的计划:

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

 

网站地图xml地图