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

文章目录

  • 项目特点
  • 一:框架集成
    • 1.引入核心依赖
    • 2.使用Mybatis-plus-join能力
  • 二:使用示例
  • 三:typeHandler
    • 1.加密
    • 2.","连接格式
    • 3.json
    • 4.默认值忽略

开源地址:
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.引入核心依赖

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


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

2.使用Mybatis-plus-join能力


<dependency><groupId>com.github.yulichang</groupId><artifactId>mybatis-plus-join-boot-starter</artifactId>
</dependency>

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

二:使用示例

@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继承,规范数据库审计相关字段,其中包括:

    /*** 基础实体对象** @author suyoulinag*/@Setterpublic 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:已删除")@TableLogicprivate Boolean deleted;}

审计字段配合security模块自动填充.
特殊的"当上下文用户信息为空时,将使用默认的审计字段.

三:typeHandler

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/725728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习笔记】计算机视觉——FCN(全卷积网络

全卷积网络 sec_fcn 如 :numref:sec_semantic_segmentation中所介绍的那样&#xff0c;语义分割是对图像中的每个像素分类。 全卷积网络&#xff08;fully convolutional network&#xff0c;FCN&#xff09;采用卷积神经网络实现了从图像像素到像素类别的变换 :cite:Long.Sh…

校招中的“熟悉linux操作系统”一般是指达到什么程度?

校招中的“熟悉linux操作系统”一般是指达到什么程度&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Linux的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&am…

归并排序总结

1.归并排序 归并排序的步骤如下&#xff1a; ①枚举中点&#xff0c;将区间分为左右两段&#xff1b; ②对左右两段区间分别排序&#xff1b; 这个过程以递归的方式进行。 ③合并两段区间。 是一个模拟的过程。用两个指针分别指向左右区间&#xff0c;判断当前哪个数小&…

基于机器学习的垃圾分类

1绪论 1.1问题背景 垃圾分类有减少环境污染、节省土地资源、再生资源的利用、提高民众价值观念等的好处&#xff0c;在倡导绿色生活&#xff0c;注重环境保护的今天&#xff0c;正确的垃圾分类和处理对我们的生态环境显得尤为重要。 在国外很多国家&#xff0c;经过了几十年…

MySQL CTEs通用表表达式:进阶学习-递归查询

MySQL CTEs通用表表达式&#xff1a;进阶学习-递归查询 递归通用表表达式是其会引用自身的通用表表达式。 CTEs 递归通用表表达式补上了MySQL8之前无法使用递归查询的空白。在之前&#xff0c;递归查询需要使用函数等方法实现。 基础使用&#xff0c;请参考前文&#xff1a; …

VTK的编译和部署,配合c++和visual studio2022,VTK开发环境的配置

1.下载 在官网选择最新的版本 Download | VTK 下载之后进行解压&#xff0c;然后再里面创建build目录&#xff0c;方便后面使用cmake进行编译 2.对源码进行编译 打卡Cmake&#xff0c;如图操作 可以看到点击configure之后&#xff0c;cmake对我们的代码在进行处理 处理完成之…

基于SpringBoot+Vue+ElementUI+Mybatis前后端分离管理系统超详细教程(二)

学习后端CRUD操作 书接上文&#xff0c;我们学习了前后端分离项目的基础环境配置和用户管理模块的前后端基础搭建&#xff0c;以下链接是上一节教程内容详细步骤&#xff0c;友友们可以跟着步骤实操。本节课程我们在前面项目的基础上接着学习后端CRUD操作&#xff0c;真正打通数…

【C++ Primer Plus学习记录】读取数字的循环

假设要编写一个将一系列数字读入到数组中的程序&#xff0c;并允许用户在数组填满之前结束输入。一种方法是利用cin。请看下面的代码&#xff1a; int n; cin >> n; 如果用户输入一个单词&#xff0c;而不是一个数字&#xff0c;情况将如何呢&#xff1f;发生这种类型不…

阿里云一键登录(号码认证服务)

前言 用户登录原来的登录方式如下 1. 手机号验证码 2. 账号密码 运营觉得操作过于复杂, 因此想引入阿里自动登录的逻辑, 也就是号码认证服务,所以才有了这篇问文章 注: 本文只是记录Java端的实现, app端的请自行查询文档实现 官方资料 文档 : 什么是号码认证服务_号码认证服务(…

SpringBoot中集成LiteFlow(轻量、快速、稳定可编排的组件式规则引擎)实现复杂业务解耦、动态编排、高可扩展

场景 在业务开发中&#xff0c;经常遇到一些串行或者并行的业务流程问题&#xff0c;而业务之间不必存在相关性。 使用策略和模板模式的结合可以解决这个问题&#xff0c;但是使用编码的方式会使得文件太多, 在业务的部分环节可以这样操作&#xff0c;在项目角度就无法一眼洞…

Java中的反射机制

Java中的反射机制 一、反射机制之Class1.获取Class 二、反射机制之Constructor1.获取Constructor2.使用Constructor实例化对象 三、实例化对象四、反射机制之Method1.获取Method2.调用方法&#xff08;1&#xff09;调用私有方法&#xff08;2&#xff09;调用静态方法&#xf…

【洛谷 P9240】[蓝桥杯 2023 省 B] 冶炼金属 题解(二分答案)

[蓝桥杯 2023 省 B] 冶炼金属 题目描述 小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X。这个炉子有一个称作转换率的属性 V V V&#xff0c; V V V 是一个正整数&#xff0c;这意味着消耗 V V V 个普通金属 O 恰好可以冶炼出一个特殊金属 X&#xff0c;当普…

【Python2】---Jmeter工具的项目实战

环境:jdk ---1.8、1.11 Jmeter的安装视频在Jmeter入门已经写过 接口自动化前置条件:接口通了----才可以进入到接口自动化不需要做功能测试,但是做自动化测试前,务必要把单接口调试通(使用Jmeter或者Postman)接口自动化流程: 测试流程----…

产业园区如何实现数字化运营管理?

​在数字化浪潮席卷全球的今天&#xff0c;产业园区正经历着前所未有的变革&#xff0c;数字化运营管理成为各个园区转型升级的发力方向&#xff0c;它不仅能够提升园区的运营管理效率&#xff0c;还能够帮助园区提高服务效能、实现精准招商、增强决策效率&#xff0c;从而全面…

Redis实战—商户查询缓存

本博客为个人学习笔记&#xff0c;学习网站&#xff1a;黑马程序员Redis入门到实战 实战篇之商户查询缓存 目录 什么是缓存 添加Redis缓存 缓存更新策略 数据库缓存不一致解决方案 案例&#xff1a;给查询商铺的缓存添加超时剔除和主动更新策略 缓存穿透 案例&#xff1…

奇富科技:大数据任务从诊断到自愈的实践之路

一、为什么要做诊断引擎 毓数平台是奇富科技公司自主研发的一站式大数据管理、开发、分析平台&#xff0c;覆盖大数据资产管理、数据开发及任务调度、自助分析及可视化、统一指标管理等多个数据生命周期流程&#xff0c;让用户使用数据的同时&#xff0c;挖掘数据最大的价值。…

打造高效、安全的交易平台:开发流程与关键要素解析

在数字化时代&#xff0c;大宗商品交易平台开发/搭建已成为连接买家与卖家的桥梁&#xff0c;为无数企业和个人提供了便捷、高效的交易机会。然而&#xff0c;随着市场的竞争日益激烈&#xff0c;如何打造一个既符合用户需求又具备竞争力的交易平台&#xff0c;成为了众多开发者…

AUTOSAR汽车电子嵌入式编程精讲300篇-基于 CAN 总线的多 ECU 通信系统设计

目录 前言 国内外研究现状 国外研究现状 国内研究现状 2 CAN 总线技术

AIGC笔记--条件自回归Transformer的搭建

1--概述 1. 自回归 TransFormer 规定Token只能看到自身及前面的Token&#xff0c;因此需生成一个符合规定的Attention Mask&#xff1b;&#xff08;代码提供了两种方式自回归Attention Mask的定义方式&#xff09;&#xff1b; 2. 使用Cross Attention实现条件模态和输入模态之…

【GIT】git合并分支

假如目前我们处于dev分支 一、重点&#xff1a;我们在开发前必须养成pull的习惯 git pull origin dev二、开发完毕后执行以下命令&#xff0c;即可将代码push到远程仓库 git add . git commit -m 提交的备注信息 git push origin dev三、此时想将dev分支合并到master分支…