SpringBoot 配置及加载 Mybatis


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实例,通过这个实例对数据库进行操作


文章借鉴处


文章作者: Huowy
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Huowy !
评论
  目录