文章目录

  • 【README】
  • 【1】基于MyBatisPlus的代码生成器
  • 【2】MyBatisPlus-DB静态工具
    • 【2.1】使用MyBatisPlus的DB静态工具查询单个及多个用户地址
      • 【查询单个用户的访问效果】
      • 【查询多个用户的访问效果】
  • 【3】逻辑删除
    • 【3.1】代码实现
  • 【4】枚举处理器
    • 【4.1】代码实现
  • 【5】JSON处理器
    • 【5.1】代码实现

【README】

本文代码参见: https://github.com/TomJourney/mybatis-plus-test

本文介绍MyBatisPlus扩展功能,如下;

  • 代码生成;
  • 静态工具;
  • 逻辑删除;
  • 枚举处理器;
  • json处理器;


【1】基于MyBatisPlus的代码生成器

方法1:使用代码生成代码,官方文档:https://baomidou.com/guides/new-code-generator/

或者使用MyBatisGenerator插件:https://www.cnblogs.com/marEstrelado/articles/15930280.html



【2】MyBatisPlus-DB静态工具

1)引入DB静态工具的原因:

  • 原因1:IService仅用于spring单例bean,若是工具类,则无法使用IService或ServiceImpl的接口;
  • 原因2:若存在一个请求需要查询多张表,则可能存在IService实现类的springbean相互引用的问题;

所以引入DB静态工具,使得工具类也可以使用MyBatisPlus提供的增删改查api;

2)业务需求:

  • 需求1:改造根据id查询用户的接口,查询用户的同时,也查询用户对应地址;
  • 需求2:改造根据id批量查询用户的接口,查询用户的同时,查询批量用户对应的地址;


【2.1】使用MyBatisPlus的DB静态工具查询单个及多个用户地址

【UseStaticApiRestfulUserController】

@RestController
@RequestMapping("/staticdb/restful/user")
@RequiredArgsConstructor
public class UseStaticApiRestfulUserController {private final MyBatisPlusUserService myBatisPlusUserService;private final UserConverter userConverter;// 查询单个 @GetMapping(path = "/queryUserById/{id}", consumes = "application/json")public UserVO queryUserById(@PathVariable("id") Long id) {return myBatisPlusUserService.queryUserAndAddrById(id);}// 查询多个 @GetMapping(path = "/queryUserByIds", consumes = "application/json")public List<UserVO> queryUserByIds(@RequestParam("ids") List<Long> ids) {return myBatisPlusUserService.queryUserAndAddrById(ids);}
}

【MyBatisPlusUserService】

@Service
@RequiredArgsConstructor
public class MyBatisPlusUserService extends ServiceImpl<UserMapper, UserPO> {private final UserConverter userConverter;private final UserAddrConverter userAddrConverter;    // 使用MyBatisPlus的DB工具查询单个用户地址public UserVO queryUserAndAddrById(Long id) {// 1 查询用户UserPO userPO = getById(id);// 2 查询地址List<UserAddrPO> userAddrPOList = Db.lambdaQuery(UserAddrPO.class).eq(UserAddrPO::getUserId, id).list();UserVO userVO = userConverter.toUserVO(userPO);// 3 封装地址到用户if (!CollectionUtils.isEmpty(userAddrPOList)) {userVO.setUserAddrVOList(userAddrConverter.toUserAddrVOList(userAddrPOList));}return userVO;}// 使用MyBatisPlus的DB工具查询多个用户地址 public List<UserVO> queryUserAndAddrById(List<Long> ids) {// 1 查询用户列表List<UserVO> userVOList = userConverter.toUserVOList(listByIds(ids));// 2 查询地址列表List<Long> dbUserIdList = userVOList.stream().map(UserVO::getId).collect(Collectors.toList());List<UserAddrPO> userAddrPOList = Db.lambdaQuery(UserAddrPO.class).in(UserAddrPO::getUserId, dbUserIdList).list();// 转为map,其中key为用户id,value为地址vo列表Map<Long, List<UserAddrVO>> userIdToUserAddrVOsMap =userAddrConverter.toUserAddrVOList(userAddrPOList).stream().collect(Collectors.groupingBy(UserAddrVO::getUserId));// 3 封装地址到用户if (!CollectionUtils.isEmpty(userVOList)) {userVOList.forEach(userVO->{userVO.setUserAddrVOList(userIdToUserAddrVOsMap.getOrDefault(userVO.getId(), Collections.emptyList()));});}return userVOList;}
}

【查询单个用户的访问效果】

地址:get localhost:8081/staticdb/restful/user/queryUserById/1

{"id": 1,"name": "user1","mobilePhone": "17612342701","addr": "成都锦城三街101号","balance": 1.00,"userState": "1","userAddrVOList": [{"id": 1,"userId": 1,"addrInfo": "成都高新区大学路1号","addrType": "UNVS"},{"id": 3,"userId": 1,"addrInfo": "成都高新区大学路学府家园","addrType": "HOME"}]
}

【查询多个用户的访问效果】

地址:get localhost:8081/staticdb/restful/user/queryUserByIds?ids=1,2

[{"id": 1,"name": "user1","mobilePhone": "17612342701","addr": "成都锦城三街101号","balance": 1.00,"userState": "1","userAddrVOList": [{"id": 1,"userId": 1,"addrInfo": "成都高新区大学路1号","addrType": "UNVS"},{"id": 3,"userId": 1,"addrInfo": "成都高新区大学路学府家园","addrType": "HOME"}]},{"id": 2,"name": "user2","mobilePhone": "110","addr": "成都锦城四街401号","balance": 2.00,"userState": "0","userAddrVOList": [{"id": 4,"userId": 2,"addrInfo": "成都高新区大学路学府家园201号","addrType": "HOME"},{"id": 5,"userId": 2,"addrInfo": "成都高新区大学路学府家园202号","addrType": "HOME"}]}
]


【3】逻辑删除

使用文档参见: https://baomidou.com/guides/logic-delete/

1)业务背景: 逻辑删除不会真正删除数据,而是用一个字段标记数据的删除状态;实现如下:

  • 在表中添加一个字段deleted标记数据是否被删除;逻辑删除时,deleted=1,否则等于0;
  • 查询时仅查询deleted=0的数据;

2)相关sql:

  • 逻辑删除: update table set deleted=1 where deleted=0 and id = #{id}
  • 查询: select * from table where deleted=0


【3.1】代码实现

1)MyBatisPlus提供了逻辑删除,但需要以下配置。

【application.yml】

mybatis-plus:global-config:db-config:logic-delete-field: deleted # 全局逻辑删除字段名logic-delete-value: 1 # 逻辑已删除值。可选,默认值为 1logic-not-delete-value: 0 # 逻辑未删除值。可选,默认值为 0

步骤1:为user_tbl表新增逻辑删除字段 deleted;

alter table mywarn.user_tbl add column `deleted` varchar(1) default '0' COMMENT '逻辑删除标记(1-已删除,0-未删除)';

【新增字段后的ddl】

CREATE TABLE `user_tbl` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户名称',`mobile_phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '移动电话',`addr` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '地址',`user_state` char(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户状态/ON-在线/OFF-离线',`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,`last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,`balance` decimal(18,2) DEFAULT '0.00' COMMENT '余额',`deleted` varchar(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '逻辑删除标记(1-已删除,0-未删除)',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=123003 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户表'

步骤2:为UserPO新增字段 deleted,否则逻辑删除丕生效(非常重要)

@Data
@TableName("user_tbl")
public class UserPO {@TableId("id")private Long id;@TableField("name")private String name;private String mobilePhone;private String addr;private BigDecimal balance;private String userState;private String deleted;
}

步骤3:编写测试用例

@SpringBootTest
public class MyBatisPlusUserServiceTest {@Autowiredprivate MyBatisPlusUserService userService;@Testvoid testLogicDelete() {Long id = 103L;// 删除userService.removeById(id);// 查询UserPO userPO = userService.getById(id);System.out.println(userPO);}
}

【sql执行日志】

==>  Preparing: UPDATE user_tbl SET deleted='1' WHERE id=? AND deleted='0'
==> Parameters: 103(Long)
<==    Updates: 1==>  Preparing: SELECT id,name,mobile_phone,addr,balance,user_state,deleted FROM user_tbl WHERE id=? AND deleted='0'
==> Parameters: 103(Long)
<==      Total: 0


【4】枚举处理器

官方文档参见: https://baomidou.com/guides/auto-convert-enum/

1)业务场景:把user_tbl表中的用户状态user_state字段在po中用枚举类表示;

  • 具体的,MyBatisPlus的属性类型处理器MybatisEnumTypeHandler可以把属性值转为枚举类型,如把varchar转为enum类型;

【MybatisEnumTypeHandler定义】

public final class MybatisEnumTypeHandler<E extends Enum<E>> extends BaseTypeHandler<E> {// ...   
}
// 其中 BaseTypeHandler是 ibatis定义的类型处理器基类


【4.1】代码实现

步骤1:新增用户状态枚举类

【UserStateEnum】

@Getter
@AllArgsConstructor
public enum UserStateEnum {ON("1", "在线"),OFF("0", "离线");@EnumValueprivate final String value;private final String desp;}

步骤2:配置枚举处理器:

【application.yml】

mybatis-plus:global-config:db-config:logic-delete-field: deleted # 全局逻辑删除字段名logic-delete-value: 1 # 逻辑已删除值。可选,默认值为 1logic-not-delete-value: 0 # 逻辑未删除值。可选,默认值为 0configuration:default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler # 基于枚举常量属性的处理器

步骤3:修改UserPO,把userState类型从string修改为 UserStateEnum;

@Data
@TableName("user_tbl")
public class UserPO {@TableId("id")private Long id;@TableField("name")private String name;private String mobilePhone;private String addr;private BigDecimal balance;//    private String userState;private UserStateEnum userState;private String deleted;
}

【测试案例】

@SpringBootTest
public class MyBatisPlusUserServiceTest {@Autowiredprivate MyBatisPlusUserService userService;@Testvoid testUserStateEnum() {UserPO userPO = userService.getById(104L);if (userPO.getUserState() == UserStateEnum.ON) {System.out.println("用户在线");} else {System.out.println("用户离线");}// 用户在线}
}


【5】JSON处理器

1)业务场景:user_tbl表有一个info字段是json字符串,在查询user时,需要把info转为UserInfo这种Bean;

修改UserPO,为UserInfoPO字段新增注解(表明使用Jackson来做json解析为javabean),且UserPO的@TableName注解新增autoResultMap属性;

在这里插入图片描述

【5.1】代码实现

步骤1:为user_tbl新增info字段,默认值设置为 {“age”:11,“nikeName”:“zhangsan11”}

alter table mywarn.user_tbl add column `info` varchar(512) default '{}' COMMENT '用户信息';

步骤2:新增UserInfoPO类,修改UserPO,新增UserInfoPO属性,并为@TableName注解新增属性autoResultMap=true;

@Data
@TableName(value = "user_tbl", autoResultMap = true)
public class UserPO {@TableId("id")private Long id;@TableField("name")private String name;private String mobilePhone;private String addr;private BigDecimal balance;//    private String userState;private UserStateEnum userState;private String deleted;@TableField(typeHandler = JacksonTypeHandler.class)private UserInfoPO info;
}

【UserInfoPO】

@Data
@NoArgsConstructor
@AllArgsConstructor(staticName = "of") // 设置静态生成器方法
public class UserInfoPO {private int age;private String nikeName;
}

在这里插入图片描述

【运行结果】

[{"id": 1,"name": "user1","mobilePhone": "17612342701","addr": "成都锦城三街101号","balance": 1.00,"userState": "ON","userAddrVOList": null,"info": {"age": 11,"nikeName": "zhangsan11"}}
]


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

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

相关文章

初识Neo4j之Cypher(三)

目录 一、介绍 二、语法 1、节点 2、关系 3、属性 4、模式 一、介绍 Cypher 是 Neo4j 的声明式查询语言&#xff0c;兼容 GQL 标准。通过 openCypher 项目&#xff0c;Cypher 以开源方式提供。它类似于 SQL&#xff0c;但专为图数据优化。 Cypher 直观且接近自然语言&…

19-C#静态方法与静态类

C#静态方法与静态类 1.static-静态方法animal.eat&#xff08;&#xff09;;//直接调用 public class animal {public static void eat()//定义静态方法{messagebox.show("animal eat");} }2.static-静态类animal.eat&#xff08;&#xff09;;//直接调用public stat…

基于YOLO的足球检测Web应用:从训练到部署的完整实战

用Python和深度学习技术打造一个完整的足球检测系统&#xff0c;支持图片检测、视频分析和实时监控。本文带你从零开始构建一个专业的Web应用。&#x1f3af; 项目背景 在体育赛事分析和足球训练中&#xff0c;准确识别和定位足球是一个重要需求。本项目利用YOLO深度学习算法&a…

npm 切换 node 版本 和npm的源

在开发过程中&#xff0c;不同项目可能需要不同版本的 Node.js&#xff0c;同时 于由XX原因&#xff0c;我们需要切换npm的源。这时如果需要切换node版本或者npm的源&#xff0c;我们可以使用以下方法。 使用 nvm 切换 Node 版本 1、安装 npm install nvm -g2、使用 # 列出所有…

Java学习第二十部分——EasyMock

目录 一.概述 二.作用 三.工作原理 四.使用示例 五.主要特点 六.适用场景 七.其他模拟框架比较 八.idea简单项目实战 1.打开idea创建Java项目&#xff0c;注意构建系统选“Maven” 2.为pom.xml文件添加如下依赖&#xff0c;并重新加载Maven依赖&#xff0c;直至不报错…

机器学习模型在C++平台的部署

一、概述机器学习模型的训练通常在Python环境下完成&#xff0c;而现实生产环境的复杂性和多样性使得模型的部署成为一个值得关注的重点。不同应用场景下有不同适应的实现方式&#xff0c;这里主要介绍通过一种通用中间格式——ONNX&#xff08;Open Neural Network Exchange&a…

保姆级安装 Ruby 环境下载及安装教程, RubyInstaller下载及安装教程

一、下载安装 RubyInstaller 1.打开 RubyInstaller 官网&#xff1a;https://rubyinstaller.org/ 点击跳转, 官网界面如下图&#xff1a; 点击下载最新的 RubyDevkit 版本&#xff08;如 RubyDevkit 3.4.X (x64) &#xff09;。如下图所示&#xff1a; 注意点&#xff1a;如果…

SQL 一键生成 Go Struct!支持字段注释、类型映射、结构体命名规范

SQL 一键生成 Go Struct&#xff01;支持字段注释、类型映射、结构体命名规范 在 Golang 开发中&#xff0c;尤其是操作数据库时&#xff0c;我们经常会遇到这种场景&#xff1a; ✅ 拿到数据库建表 SQL&#xff0c;却要手动写 Go struct✅ 字段几十个、类型复杂&#xff0c;…

Web 前端框架选型:React、Vue 和 Angular 的对比与实践

Web 前端框架选型&#xff1a;React、Vue 和 Angular 的对比与实践 选择前端框架就像选择一个长期合作伙伴。错误的选择可能会让你的项目在未来几年内背负沉重的技术债务&#xff0c;而正确的选择则能让开发效率飞速提升。 经过多年的项目实践&#xff0c;我发现很多新人在框架…

C# 值拷贝、引用拷贝、浅拷贝、深拷贝

值拷贝定义&#xff1a;直接复制变量的值&#xff0c;适用于基本数据类型&#xff08;如int, float, char等&#xff09;。在 C# 中&#xff0c;值类型&#xff08;基本数据类型和结构体&#xff09;默认使用值拷贝。特点&#xff1a;创建原始值的完全独立副本&#xff0c;修改…

深度学习图像分类数据集—百种鸟类识别分类

该数据集为图像分类数据集&#xff0c;适用于ResNet、VGG等卷积神经网络&#xff0c;SENet、CBAM等注意力机制相关算法&#xff0c;Vision Transformer等Transformer相关算法。 数据集信息介绍&#xff1a;525种鸟类识别分类 训练数据集总共有84635张图片&#xff0c;每个文件夹…

零基础 “入坑” Java--- 八、类和对象(一)

文章目录一、初识面向对象二、类的定义和使用1.认识类2.类的定义格式三、类的实例化四、this引用五、对象的构造及初始化1.有关初始化2.构造方法3.就地初始化一、初识面向对象 Java是一门纯面向对象的语言&#xff08;OOP&#xff09;&#xff0c;在面向对象的世界里&#xff…

数字孪生技术引领UI前端设计新篇章:智能物联网的深度集成

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言&#xff1a;数字孪生与物联网的共生革命在智能设备爆发式增长的今天&#xff0c;传统…

代码审计-shiro漏洞分析

一、关于shiro介绍 简单讲&#xff0c;shiro是apache旗下的一个Java安全框架&#xff0c;轻量级简单易上手&#xff0c;框架提供很多功能接口&#xff0c;常见的身份认证 、权限认证、会话管理、Remember 记住功能、加密等等。 二、漏洞分析 1.CVE-2019-12422-shiro550 漏洞原理…

EF提高性能(查询禁用追踪)(关闭延迟加载)

EF默认是支持延迟加载的&#xff0c;在加载一个表的数据时&#xff0c;会把关联表的数据一并加载&#xff0c;这样会影响性能。 一般建议关闭延迟加载可以提高EF加载的性能。还有其他方法提高性能&#xff08;查询禁用追踪&#xff09; 如果要实现延迟加载&#xff0c;必须满足…

Leetcode+JAVA+贪心III

134.加油站在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;开始时油箱为空。给定两个整数数组 gas 和 …

Qt信号与槽机制及动态调用

Qt信号与槽机制及动态调用一、信号与槽1、Qt信号与槽机制概述2、信号与槽的基本使用3、信号与槽的特性4、使用Lambda表达式作为槽5、信号与槽的参数传递6、注意事项二、动态调用机制1、基本用法2、示例代码3、带参数的调用4、返回值处理5、信号与槽的动态连接6、动态方法调用7、…

K8s系列之:Kubernetes 的 OLM

K8s系列之:Kubernetes 的 OLM 什么是 Kubernetes 的 OLM什么是Kubernetes中的OperatorOLM 的功能OLM 的核心组件OLM优势OLM 的工作原理OLM 与 OperatorHub 的关系OLM示例场景什么是CRDoperator 和 CRD的关系为什么需要 CRD 和 OperatorCRD定义资源类型DebeziumServer如何使用d…

前端-HTML-day2

目录 1、无序列表 2、有序列表 3、定义列表 4、表格-基本使用 5、表格-结构标签 6、表格-合并单元格 7、表单-input基本使用 8、表单-input占位文本 9、表单-单选框 10、表单-上传多个文件 11、表单-多选框 12、表单-下拉菜单 13、表单-文本域 14、表单-label标签…

两种方式清除已经保存的git账号密码

方式一随便选择一个文件夹&#xff0c;然后鼠标右键-》TortoiseGit ->设置选择已保存的数据-》认证数据-》清除-》点击确定方式二 控制面板\用户帐户\凭据管理器-》windows凭据普通凭据-》找到git信息-》选择删除