Skip to content

database

sika-code edited this page Jul 20, 2019 · 3 revisions

database【数据库组件】

What

  • 封装与数据库交互的组件

Why

  • 屏蔽访问数据库的细节
  • 降低接入复杂度
  • 提高开发效率

How

  • 提供默认的数据操作方法
  • 提供基础实体类
  • 提供主键生成器
  • 提供sql分析器
  • 提供数据填充组件

Database组件使用说明

名称 备注
common 基础配置和实体集合
interceptor sql拦截分析器
primarikey 主键组件

common

名称 备注
BaseMapper 基础Mapper、该Mapper不能被MappScan扫描到
DataBaseConfig 数据源配置类
BaseEntity 基础实体类、定义模板属性
BaseMetaObjectHandler  基础的实体填充助手类
DefaultMetaObjectHandler 默认的实体填充助手类

interceptor

名称 备注
SqlLogInterceptor sql分析拦截器、打印sql、记录执行时间
SqlLogInterceptorProperties sql分析拦截器属性

primarikey

名称 备注
PrimaryKeyConfig 主键配置类
BaseKeyGenerator 基础Key的生成者、所有key生成者的父接口
KeyGeneratorForSnowflake 雪花算法主键生成器
SnowflakeIdAlgorithm 雪花算法

示例

common

BaseMapper

/**
 * 示例Mapper
 *
 * @author daiqi
 * @create 2018-12-03 16:42
 */
public interface DemoMapper extends BaseMapper<DemoEntity> {
    /**
     * <p>
     * 根据查询条件获取继承BaseEntity的实体列表数据
     * </p>
     *
     * @param query
     * @return java.manager.List<T>
     * @author daiqi
     * @date 2018/12/3 16:45
     */
    <DemoQuery> List<DemoEntity> listByQuery(@Param(value = "query") Query query);
}

DataBaseConfig

  • 配置开关
  • 配置mapper-locations
sika:
  code:
    jdbc:
      fire: true
mybatis:
  mapper-locations: classpath*:mapper/*.xml
  
spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    dynamic:
      enable: true
    hikari:
      # JDBC 配置(驱动类自动从url的mysql识别,数据源类型自动识别)
      core:
        minimum-idle: 10
        maximum-pool-size: 20
        auto-commit: true
        idle-timeout: 600000
        pool-name: DatebookHikariCP
        max-lifetime: 1800000
        connection-timeout: 30000
        connection-test-query: SELECT 1
        jdbc-url: jdbc:mysql://rm-wz9632z95v9v65458o.mysql.rds.aliyuncs.com:3306/dq_easy_cloud?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
        username: dq_easy_cloud
        password: Easy-cloud
        driver-class-name:  com.mysql.jdbc.Driver

BaseEntity

@Data
public class BaseEntity<PRIMARY extends Serializable, BY> {
    /** 主键 */
    @TableId(type = IdType.ID_WORKER)
    private PRIMARY id;
    /** 创建者 若为空则保存的时候会自动根据规则填充 */
    @TableField(fill = FieldFill.INSERT)
    private BY createBy;
    /** 创建时间 若为空则保存的时候自动填充 */
    @TableField(fill = FieldFill.INSERT)
    private Date createDate;
    /** 更新者 若为空则更新的时候会自动根据规则填充*/
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private BY updateBy;
    /** 更新时间 若为空更新的时候会自动填充 */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateDate;
    /** 版本号 乐观锁的基础支持 */
    @Version
    private Integer version;
    /**
     * 删除标志
     */
    @TableLogic
    private Integer isDeleted;
    /**
     * 可用标志
     */
    private Integer available;
    /**
     * 备注
     */
    private String remark;

}
/**
 * 示例实体类
 *
 * @author daiqi
 * @create 2018-08-03 14:59
 */
@Data
public abstract class DemoEntity extends BaseEntity<Long, String> {
    private String userName;
}

BaseMetaObjectHandler、DefaultMetaObjectHandler

  1. Entity需要自动填充的属性添加@TableField(fill = FieldFill.INSERT_UPDATE),详细用法
  2. 自定义填充类并继承DefaultMetaObjectHandler或BaseMetaObjectHandler
  3. 配置填充Bean实例
public class User {

    // 注意!这里需要标记为填充字段
    @TableField(.. fill = FieldFill.INSERT)
    private String fillField;

    ....
}


/**
 * 示例的填充助手类
 *
 * @author daiqi
 * @create 2019-05-29 17:40
 */

@Slf4j
public class DemoMetaObjectHandler extends StandardMetaObjectHandler {
    /**
     * <p>
     * 保存的时候触发 填充方式根据具体需求2选1
     * </p>
     *
     * @param metaObject
     * @return void
     * @author daiqi
     * @date 2019/7/15 9:29
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        super.insertFill(metaObject);
        // 方式一: 自动填充创建者、该方法只有createBy的值为空时才会进行填充
        super.setFieldValByNameCustomer("createBy", "zhangsan", metaObject);
        // 方式二: 自动填充创建者、该方法无论createBy的值是否为空都会进行填充
        super.setFieldValByName("createBy", "zhangsan", metaObject);
    }

    /**
     * <p>
     * 更新的时候触发 填充方式根据具体需求2选1
     * </p>
     *
     * @param metaObject
     * @return void
     * @author daiqi
     * @date 2019/7/15 9:30
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        super.updateFill(metaObject);
        // 方式一: 自动填充更新者、该方法只有updateBy的值为空时才会进行填充
        super.setFieldValByNameCustomer("updateBy", "zhangsan", metaObject);
        // 方式二: 自动填充更新者、该方法无论updateBy的值是否为空都会进行填充
        super.setFieldValByName("updateBy", "zhangsan", metaObject);
    }

}

/**
 * 填充者配置类
 */
@Configuration
public class FillConfig {

    @Bean
    @ConditionalOnMissingBean
    public DefaultMetaObjectHandler defaultMetaObjectHandler() {
        return new DemoMetaObjectHandler();
    }
}
Clone this wiki locally