mybatis在项目中需要三类文件
1. 配置文件
· 配置和数据连接的相关信息,例如事务管理、数据库连接池等信息。
· 加载映射文件
2. 映射文件
定义如何操作数据库(增删改查等),指定sql输出结果所映射的java类型对象
3. model类
----------------------------------------------------------------
常用配置
datasource
数据源
说明:数据源基于数据库连接池技术,方便连接数据库及管理连接。
sqlSessionFactory
简介: 字面上可以理解为一个创建sqlSession的工厂,基本mybatis中,sqlSessionFactory可以通过sqlSessionFactoryBuilder类创建,而在 MyBatis-Spring 中,则使用 SqlSessionFactoryBean 来替代。
内容:
1. 设置数据源
2. 设置model
3. 设置mapper
4. 设置插件(分页插件等)
dataSourceTransactionManager
MyBatis-Spring利用spring的DataSourceTransactionManager,允许MyBatis参与到Spring的事务管理中,而不是给MyBatis创建一个新的特定的事务管理器。
配置完成后可以在Spring中你通常的做法来配置事务。如@Transactional注解和AOP样式的配置都是支持的。在事务处理期间,一个单独的SqlSession对象将会被创建和使用。当事务完成时,这个session会以合适的方式提交或回滚。
一旦事务创建之后,MyBatis-Spring 将会透明的管理事务。在你的 DAO 类中就不需要额 外的代码了。
内容:
1. 设置数据源
sessionTemplate
简介: sqlSession用来执行映射语句,提交或回滚操作,(sqlSession是一个接口)
在MyBatis中, 我们可以使用SqlSessionFactory来创建SqlSession。
而使用MyBatis-Spring之后, 你不再需要直接使用SqlSessionFactory, 因为你的bean可以通过一个线程安全的SqlSession来注入,基于Spring的事务配置来自动提交,回滚,关闭session,
SqlSessionTemplate实现了SqlSession接口并保证使用的 SqlSession 是和当前Spring的事务相关的。此外,它管理session的生命周期,包含必要的关闭,提交或回滚操作。
这就是说,在代码中无需对MyBatis的 SqlSession 进行替换。 SqlSessionTemplate 通常是被用来替代默认的 MyBatis 实现的 DefaultSqlSession ,
内容:
1. sqlSessionFactory
---------------------
映射mapper到service,有两种方式:
1. MapperFactoryBean
直接将数据映射器接口(mapper)到你的service层中(就像给类加上@Service), 需要时直接调用即可,省去不少调用mapper的代码
内容:
1. 设置mapper地址
2. 设置SqlSessionFactory
2. MapperScannerConfigurer
MapperScannerBean每次只能注册一个映射器,而他能注册一个包底下的所有mapper
内容: 1、设置mapper路径
备注:
sqlSession
sqlSession是应用程序与持久层进行交互的一个单线程对象,也是mybatis执行持久化操作的关键对象。
包含以数据库为背景的,所有SQL操作的方法
原理: 底层封装JDBC连接
特点: 不是线程安全的,因此决不能将sqlSession实例的引用放在类的静态字段(多实例公用)甚至是实例字段,使用完sqlSession后关闭Session很重要
实例:
package com.sunland.apollo.configurer; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder; import com.github.pagehelper.PageHelper; import org.apache.ibatis.plugin.Interceptor; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; 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.core.io.support.ResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import tk.mybatis.spring.annotation.MapperScan; import tk.mybatis.spring.mapper.MapperScannerConfigurer; import javax.sql.DataSource; import java.util.Properties; import static com.sunland.apollo.configurer.ProjectConstant.*; @Configuration @MapperScan(basePackages = MASTER_MAPPER_PACKAGE, sqlSessionTemplateRef = "masterSqlSessionTemplate") //指定扫描的mapper包及所用sqlSessionTemplate public class MasterMybatisConfigurer { //配置数据源,这里用DruidDataSource @Bean(name = "masterDataSource", destroyMethod = "close", initMethod = "init") @ConfigurationProperties("spring.datasource.druid.master") //数据源配置 @Primary public DruidDataSource druidDataSource() { return DruidDataSourceBuilder.create().build(); //数据源初始化 }
//配置事务管理 @Bean(name = "masterTransactionManager") @Primary public DataSourceTransactionManager masterTransactionManager(@Qualifier("masterDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); }
//配置SqlSession工厂 @Bean(name = "masterSqlSessionFactory") @Primary public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean factory = new SqlSessionFactoryBean(); factory.setDataSource(dataSource); factory.setTypeAliasesPackage(MASTER_MODEL_PACKAGE); //配置分页插件,详情请查阅官方文档 PageHelper pageHelper = new PageHelper(); Properties properties = new Properties(); properties.setProperty("pageSizeZero", "true");//分页尺寸为0时查询所有纪录不再执行分页 properties.setProperty("reasonable", "true");//页码<=0 查询第一页,页码>=总页数查询最后一页 properties.setProperty("logImpl", "STDOUT_LOGGING"); properties.setProperty("supportMethodsArguments", "true");//支持通过 Mapper 接口参数来传递分页参数 properties.setProperty("autoDialect", "false"); properties.setProperty("dialect", "mysql"); pageHelper.setProperties(properties); //添加插件 factory.setPlugins(new Interceptor[]{pageHelper}); //添加XML目录 ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); factory.setMapperLocations(resolver.getResources(MASTER_MAPPER_LOCAL)); return factory.getObject(); }
//配置sqlSession模板 @Bean(name = "masterSqlSessionTemplate") @Primary public SqlSessionTemplate masterSqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory factory) { return new SqlSessionTemplate(factory); } //扫描、配置包下所有mapper @Bean(name = "masterMapperScannerConfigurer") public MapperScannerConfigurer masterMapperScannerConfigurer() { MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer(); mapperScannerConfigurer.setSqlSessionFactoryBeanName("masterSqlSessionFactory"); mapperScannerConfigurer.setBasePackage(MASTER_MAPPER_PACKAGE); //配置通用Mapper,详情请查阅官方文档 Properties properties = new Properties(); properties.setProperty("mappers", MAPPER_INTERFACE_REFERENCE); properties.setProperty("notEmpty", "false");//insert、update是否判断字符串类型!='' 即 test="str != null"表达式内是否追加 and str != '' properties.setProperty("IDENTITY", "MYSQL"); mapperScannerConfigurer.setProperties(properties); return mapperScannerConfigurer; } }