我们先来看看Mybatis的几个核心类SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession之间的关系;
大致流程是这个样子的,mybatis通过SqlSessionFactoryBuilder类的build方法和配置文件生成SqlSessionFactory对象,而SqlSession对象是通过SqlSessionFactory的open方法获取到的,这里我们说下这三个对象的生命周期,对于SqlSessionFactoryBuilder来说,他是为了创建SqlSessionFactory而存在的,SqlSessionFactory创建完成后就可以丢弃不要了,而SqlSessionFactory是创建SqlSession的基础,只要程序在运行,则SqlSessionFactory必须存在,所以SqlSessionFactory可以做成单例存在程序运行期间,而SqlSession由于是线程不安全的,所以存在方法体内或者一次请求的对象更合适;
生成SqlSession的代码如下:
public void getSqlSession(){
Reader reader = null;
try {
reader = Resources.getResourceAsReader("com/xxx/config.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession sqlSession =sessionFactory.openSession();
} catch (IOException e) {
e.printStackTrace();
}
}
而springboot整合mybatis时做了一些改变,SqlSessionFactoryBean代替了SqlSessionFactoryBuilder的用,SqlSessionTemplate代替了Sqlsession,看下面的代码我们通过注解的方式自定义了SqlSessionFactory和SqlSessionTemplate,接下来我们从注入看起,看看spring是如何整合mybatis的;
package com.spring.mybatis.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
import java.io.IOException;
import java.util.Properties;
@Configuration
@EnableTransactionManagement //开启注解事物管理
@MapperScan(basePackages = "com.spring.mybatis.mapper" ,sqlSessionFactoryRef