自研cloud框架专题–mybatis-puls模块(一)

文章目录

开源地址:
https://github.com/2892824942/ty-cloud/blob/main/ty-framework/ty-framework-mybatis-plus

项目特点

  1. 自动集成Mybatis-plus,提供统一的ORM层代码格式,同时支持Mybatis-plus-join(可选)
  2. 提供父类Mapper,简化开发.支持连表查询,分页查询,简化非空判断,查询结果Map
  3. 基于Mybatis TypeHandler,提供数据加密,json格式解析,连接符解析等能力

一:框架集成

1.引入核心依赖

暂时未发到中央仓库(准备中)...

xml 复制代码
<dependency>
    <groupId>com.ty</groupId>
    <artifactId>ty-framework-mybatis-plus-starter</artifactId>
    <version>${最新版本}</version>
</dependency>

2.使用Mybatis-plus-join能力

xml 复制代码
<dependency>
  <groupId>com.github.yulichang</groupId>
  <artifactId>mybatis-plus-join-boot-starter</artifactId>
</dependency>

如不使用代码连表能力无需依赖

二:使用示例

java 复制代码
@Mapper
public interface UserMapper extends BaseMapperX<User, Long> {
  /**
   * 分页查询
   * @param userQuery
   * @return
   */
  default PageResult<User> selectPage(@Param("userPageQuery") UserQuery userQuery) {
    LambdaQueryWrapperX<User> wrapper = new LambdaQueryWrapperX<User>()
            .eqIfPresent(User::getId, userQuery.getId())
            .likeIfPresent(User::getName, userQuery.getName())
            .eqIfPresent(User::getAge, userQuery.getAge())
            .eqIfPresent(User::getAddrCode, userQuery.getAddrCode());

    return selectPage(userQuery, wrapper);
  }

  /**
   * 连表查询
   * @param userQuery
   * @return
   */
  default PageResult<UserFullBO> selectJoinPage(@Param("userPageQuery") UserQuery userQuery) {
    MPJLambdaWrapperX<User> wrapper = new MPJLambdaWrapperX<User>()
            .selectAll(User.class)
            .selectAs(Address::getName, UserFullBO::getAddrName)
            .leftJoin(Address.class, "addr", on -> on
                    .eq(Address::getCode, User::getAddrCode))
            .eqIfPresent(User::getCreator, userQuery.getId())
            .likeIfPresent(User::getName, userQuery.getName())
            .eqIfPresent(User::getAge, userQuery.getAge());

    return selectJoinPage(UserFullBO.class, userQuery, wrapper);
  }

}


/**
 * 实体DO
 */
@EqualsAndHashCode(callSuper = true)
@TableName(value = "address", autoResultMap = true)
@Data
public class Address extends BaseDO {
  /**
   * 地址名称
   */
  private String name;
  /**
   * 地址标识
   */
  private String code;


}

1.Mapper需要继承BaseMapperX,同时需要指定泛型,泛型1为数据库表对应的实体类,泛型2为主键类型

BaseMapperX提供快速分页查询,简单条件查询list,简单条件查询Map,list转Map等工具,简化开发

2.查询时提供三个Wrapper:

(1)LambdaQueryWrapperWrapperX:支持lambda数据拼接

(2)QueryWrapperWrapperX:支持原生sql数据拼接

(3)MPJLambdaWrapperX:支持连表查询(基于mybatis-plus-join)

3.数据库实体提供统一的BaseDO继承,规范数据库审计相关字段,其中包括:

java 复制代码
    /**
    * 基础实体对象
    *
    * @author suyoulinag
    */
  @Setter
  public abstract class BaseDO implements Auditable<Long>, Serializable {

      /**
       * 用户id
       */

      @Schema(description = "主键ID")
      @TableId(type = IdType.AUTO)
      private Long id;

      /**
       * 创建者
       */
      @Schema(description = "创建者")
      @TableField(fill = FieldFill.INSERT, jdbcType = JdbcType.VARCHAR)
      private Long creator;
      /**
       * 更新者
       */
      @Schema(description = "更新者")
      @TableField(fill = FieldFill.INSERT_UPDATE, jdbcType = JdbcType.VARCHAR)
      private Long updater;

      /**
       * 创建时间
       */
      @Schema(description = "创建时间")
      @TableField(fill = FieldFill.INSERT)
      private LocalDateTime createTime;
      /**
       * 最后更新时间
       */
      @Schema(description = "最后更新时间")
      @TableField(fill = FieldFill.INSERT_UPDATE)
      private LocalDateTime updateTime;

      /**
       * 是否删除 0:未删除 1:已删除
       * @see com.ty.mid.framework.common.constant.DeletedEnum
       */
      @Schema(description = "是否删除 0:未删除 1:已删除")
      @TableLogic
      private Boolean deleted;
  }

审计字段配合security模块自动填充.

特殊的"当上下文用户信息为空时,将使用默认的审计字段.

三:typeHandler

java 复制代码
public class User extends BaseDO {

    private static final long serialVersionUID = 1L;

    @Schema(description = "姓名")
    @TableField("`name`")
    private String name;

    @Schema(description = "密码")
    @TableField(value = "`password`", typeHandler = EncryptTypeHandler.class)
    private String password;

    @Schema(description = "角色id列表,多个使用,号隔开")
    @TableField(value = "`role_ids`", typeHandler = LongListTypeHandler.class)
    private List<Long> roleIds;

    @Schema(description = "年龄")
    @TableField(value = "`age`", typeHandler = DefaultTypeHandler.class)
    private Integer age;

    @Schema(description = "邮箱")
    private String email;

    @Schema(description = "用户地址code")
    @TableField(value = "`addr_code`")
    private String addrCode;
}

1.加密

可通过@TableField(typeHandler = EncryptTypeHandler.class)注解将数据库字段加密,目前仅支持AES加密

秘钥可通过配置mybatis-plus.encryptor.password设置

2.","连接格式

通过@TableField(typeHandler = LongListTypeHandler.class)注解将数据库字段映射为List<Long>,同时支持

IntegerListTypeHandler及StringListTypeHandler,分别将数据库字段映射为List<Integer>List<String>

3.json

通过@TableField(typeHandler = JsonLongSetTypeHandler.class)注解将数据库字段映射为 Set<?>

4.默认值忽略

数据库一般不建议使用null值, 因此一般数据库都会使用notNull的配置,在此前提下,部分非varchar的字段可能需要默认值,但是无论设置那种默认值,在数据查询的时候,

默认值总是让使用者困惑(比如age字段默认值为0).

如需要忽略默认值, 可通过@TableField(typeHandler = DefaultTypeHandler.class)将默认值转化为null.

系统全局默认值见:DefaultTypeConstants

更详细的使用案例,见:https://github.com/2892824942/framework-demo

相关推荐
小小虫码4 小时前
项目中用的网关Gateway及SpringCloud
spring·spring cloud·gateway
一缕叶9 小时前
mybatis(78/134)
mybatis
拾忆,想起13 小时前
如何选择Spring AOP的动态代理?JDK与CGLIB的适用场景
spring boot·后端·spring·spring cloud·微服务
安清h18 小时前
【基于SprintBoot+Mybatis+Mysql】电脑商城项目之用户注册
数据库·后端·mysql·spring·mybatis
yang_shengy1 天前
【JavaEE】Spring(5):Mybatis(上)
spring·java-ee·mybatis
程序猿零零漆1 天前
SpringCloud系列教程:微服务的未来(十九)请求限流、线程隔离、Fallback、服务熔断
java·spring cloud·微服务
字节全栈_PVK2 天前
Flask数据的增删改查(CRUD)_flask删除数据自动更新
数据库·flask·mybatis
花心蝴蝶.2 天前
MyBatis 入门
java·spring boot·后端·mybatis
2的n次方_2 天前
Eureka 服务注册和服务发现的使用
spring boot·spring cloud·云原生·eureka·服务发现
or77iu_N2 天前
SpringBoot 中的测试jar包knife4j(实现效果非常简单)
java·开发语言·spring boot·后端·mybatis·jar