Mybatis与springBoot的融合
/**
博主使用的springBoot版本为1.5.8.RELEASE
@Configuration注解标识该类为一个配置文件
@MapperScan注解属性:
1. basePackages可以设置多个mapper.xml所在的全限定包名
2. annotationClass = Mapper.class (过滤的作用,只有包含注解的mybatis接口才会被扫描进去,一般不用)
3. sqlSessionFactoryRef="xxxSqlSessionFactory"
4. sqlSessionTemplateRef = "xxxSqlSessionTemplate"
注意: 其中3,4属性在使用的时候,可以只保留3的属性,不需要3,4两个属性全都注入,
原因如下:
1. 我们注入的sqlSessionFactory最后在SqlSessionDaoSupport.setSqlSessionFactory被使用,并且内建了一个sqlSessionTemplate对象
2. 如果我们上面的注解是sqlSessionTemplateRef,那么会走SqlSessionDaoSupport.setSqlSessionTemplate
3. 如果两个注解都有,优先使用sqlSessionTemplateRef
*/
@Configuration
@MapperScan(basePackages = {RdsDataSourceConfig.PACKAGE},
sqlSessionFactoryRef = "rdsSqlSessionFactory")
public class RdsDataSourceConfig {
static final String PACKAGE = "xxxMapper.xml的所在路径(全限定包名)";
static final String MAPPER_LOCATION = "classpath:sqlmap/rds/*Mapper.xml(一般位于resource路径下)";
static final String CONFIG_LOCATION = "classpath:sqlmap/mybatis-config.xml(一般位于resource路径下)";
// 读取数据源配置属性,生成DruidDataSource对象
@ConfigurationProperties(prefix = "application.yml文件中的数据源配置信息地址")
@Bean(name = "自定义bean名称(建议与方法名一致)")
public DruidDataSource rdsDruidDataSource() {
return new DruidDataSource();
}
// springBoot中的事务管理器
// 1. spring-boot-starter-jdbc 依赖,框架默认注入DataSourceTransactionManager 实例。
// 2. spring-boot-starter-data-jpa 依赖,框架会默认注入 JpaTransactionManager 实例。
@Bean(name = "自定义bean名称(建议与方法名一致)")
public DataSourceTransactionManager rdsTransactionManager() throws SQLException {
return new DataSourceTransactionManager(rdsDruidDataSource());
}
// 1. mybatis设置
// 生成SqlSessionFactory对象
@Bean(name = "自定义bean名称(建议与方法名一致)")
@Primary // 优先注入的意思
public SqlSessionFactory rdsSqlSessionFactory(
@Qualifier("rdsDruidDataSource") DataSource dataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
// SqlSessionFactory设置数据源信息
sessionFactory.setDataSource(dataSource);
// SqlSessionFactory设置需要被扫描到的Mapper所在路径(全限定包名)
sessionFactory.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION));
// SqlSessionFactory设置mybatis的配置信息
sessionFactory.setConfigLocation(new PathMatchingResourcePatternResolver().getResource(CONFIG_LOCATION));
// SqlSessionFactory设置返回结果为map集合时,字段名由下划线转换为驼峰
sessionFactory.setObjectWrapperFactory(new MapWrapperFactory());
// 返回设置好的SqlSessionFactory对象
return sessionFactory.getObject();
}
// 2. jdbcTemble设置
// 是spring对 jdbc操作数据库进行的封装,使得开发者可以直接在java文件中 编写sql,无需配置xml文件。
@Bean(name = "自定义bean名称(建议与方法名一致)")
public JdbcTemplate rdsJdbcTemplate(
@Qualifier("rdsDruidDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
// mybatis进行驼峰转换涉及的MapWrapperFactory类
public class MapWrapperFactory implements ObjectWrapperFactory {
@Override
public boolean hasWrapperFor(Object object) {
return object != null && object instanceof Map;
}
@Override
public ObjectWrapper getWrapperFor(MetaObject metaObject, Object object) {
return new CameCaseMapWrapper(metaObject, (Map) object);
}
}
// mybatis进行驼峰转换涉及的CameCaseMapWrapper类
public class CameCaseMapWrapper extends MapWrapper {
public CameCaseMapWrapper(MetaObject metaObject, Map<String, Object> map) {
super(metaObject, map);
}
@Override
public String findProperty(String name, boolean useCamelCaseMapping) {
if (useCamelCaseMapping) {
return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, name);
}
return name;
}
}
<!-- mybatis-config.xml的参数配置 -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 全局参数 -->
<settings>
<!-- 使全局的映射器启用或禁用缓存。 -->
<setting name="cacheEnabled" value="true"/>
<!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。 -->
<setting name="aggressiveLazyLoading" value="true"/>
<!-- 是否允许单条sql 返回多个数据集 (取决于驱动的兼容性) default:true -->
<setting name="multipleResultSetsEnabled" value="true"/>
<!-- 是否可以使用列的别名 (取决于驱动的兼容性) default:true -->
<setting name="useColumnLabel" value="true"/>
<!-- 允许JDBC 生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。 default:false -->
<setting name="useGeneratedKeys" value="true"/>
<!-- 指定 MyBatis 如何自动映射 数据基表的列 NONE:不隐射 PARTIAL:部分 FULL:全部 -->
<setting name="autoMappingBehavior" value="PARTIAL"/>
<!-- 这是默认的执行类型 (SIMPLE: 简单; REUSE: 执行器可能重复使用prepared statements语句;BATCH: 执行器可以重复执行语句和批量更新) -->
<setting name="defaultExecutorType" value="SIMPLE"/>
<!-- 使用驼峰命名法转换字段。 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 设置本地缓存范围 session:就会有数据的共享 statement:语句范围 (这样就不会有数据的共享 ) defalut:session -->
<setting name="localCacheScope" value="SESSION"/>
<!-- 设置但JDBC类型为空时,某些驱动程序 要指定值,default:OTHER,插入空值时不需要指定类型 -->
<setting name="jdbcTypeForNull" value="NULL"/>
<setting name="callSettersOnNulls" value="true"/>
</settings>
</configuration>
注意
1.mybatis框架主要是围绕着SqlSessionFactory进行的,创建过程大概如下:
(1)、定义一个Configuration对象,其中包含数据源、事务、mapper文件资源以及影响数据库行为属性设置settings
(2)、通过配置对象,则可以创建一个SqlSessionFactoryBuilder对象
(3)、通过 SqlSessionFactoryBuilder 获得SqlSessionFactory 的实例。
(4)、SqlSessionFactory 的实例可以获得操作数据的SqlSession实例,通过这个实例对数据库进行操作
文章借鉴处