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
- 它将允许 MyBatis 参与到 Spring 的事务管理之中
- 创建映射器 mapper 和 SqlSession 并注入到 bean 中
- 以及将 Mybatis 的异常转换为 Spring 的 DataAccessException
- 最终,可以做到应用代码不依赖于 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); } }