C语言 c++ php mysql nginx linux lnmp lamp lanmp memcache redis 面试 笔记 ppt 设计模式 问题 远程连接

mybatis

 

作用域 生命周期

 

  依赖注入框架可以创建线程安全的、基于事务的 SqlSession 和映射器,并将它们直接注入到你的 bean 中,因此可以直接忽略它们的生命周期。

SqlSessionFactoryBuilder

  局部变量,用于创建SqlSessionFactory
SqlSessionFactory

   应用运行期间
SqlSession

  每个线程应该有自己的SqlSession,非线程安全,不能共享,所以它的最佳的作用域是请求或方法作用域
  如果你现在正在使用一种 Web 框架,要考虑 SqlSession 放在一个和 HTTP 请求对象相似的作用域中
  换句话说,每次收到的 HTTP 请求,就可以打开一个 SqlSession,返回一个响应,就关闭它。

  try (SqlSession session = sqlSessionFactory.openSession()) {
  // 你的应用逻辑代码 确保资源可以关闭
  }

 

映射器实例(mapper)

映射器接口的实例是从 SqlSession 中获得的,因此从技术层面讲,映射器实例的最大作用域是和请求它们的 SqlSession 相同的。
最佳作用域是方法作用域
用过之后,无需显式关闭,在整个请求作用域内也没有问题

 

日志 

  默认检测顺序

SLF4J
Apache Commons Logging
Log4j 2
Log4j
JDK logging

你也可以调用如下任一方法来使用日志工具,需要保证该日志包已经加装,否则无效

org.apache.ibatis.logging.LogFactory.useSlf4jLogging();
org.apache.ibatis.logging.LogFactory.useLog4JLogging();
org.apache.ibatis.logging.LogFactory.useJdkLogging();
org.apache.ibatis.logging.LogFactory.useCommonsLogging();
org.apache.ibatis.logging.LogFactory.useStdOutLogging();

 

MyBatis-Spring

  1. 它将允许 MyBatis 参与到 Spring 的事务管理之中
  2. 创建映射器 mapper 和 SqlSession 并注入到 bean 中
  3. 以及将 Mybatis 的异常转换为 Spring 的 DataAccessException
  4. 最终,可以做到应用代码不依赖于 MyBatis,Spring 或 MyBatis-Spring。

 

SqlSessionTemplate

<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
  <property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />
  <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

MapperFactoryBean 将会负责 SqlSession 的创建和关闭。如果使用了 Spring 的事务功能,那么当事务完成时,session 将会被提交或回滚。最终任何异常都会被转换成 Spring 的 DataAccessException 异常。

spring-mybatis中会忽略mybatis配置文件中的environments、DataSource、transactionManager ,SqlSessionFactoryBean 会创建它自有的 MyBatis 环境配置(Environment),并按要求设置自定义环境的值

如果 MyBatis 在映射器类对应的路径下找不到与之相对应的映射器 XML 文件,那么也需要配置文件
  第一种是手动在 MyBatis 的 XML 配置文件中的 <mappers> 部分中指定 XML 文件的类路径;
  第二种是设置工厂 bean 的 mapperLocations 属性。


<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="mapperLocations" value="classpath*:sample/config/mappers/**/*.xml" /> //支持递归查找
</bean>

注入一个sqlSession的bean 

@Bean
public SqlSessionTemplate sqlSession() throws Exception {
  return new SqlSessionTemplate(sqlSessionFactory());
}

  

在事务处理期间,一个单独的 SqlSession 对象将会被创建和使用。当事务完成时,这个 session 会以合适的方式提交或回滚

SqlSessionTemplate 是线程安全的,可以被多个 DAO 或映射器所共享使用。

 

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);
  }
}

 

posted on 2019-08-11 20:19  思齐_  阅读(227)  评论(0编辑  收藏  举报