微服务1 -- MybatisPlus

一、导学

微服务是一种软件架构风格,以专注于很多单一职责的小项目为基础,组合出复杂的大型应用。

服务拆分、远程调用、服务治理、请求路由、身份认证、配置管理、服务保护、分布式事务、异步通信、消息可靠性、延迟消息、分布式搜索、倒排索引、数据聚合


二、MybatisPlus快速入门

1. 准备

(1)导入MP依赖(兼容了Mybatis,可直接把Mybatis依赖注掉)

(2)Mapper层接口继承BaseMapper<对应实体类>

2. 常见注解

  1. MP通过扫描实体类 ,基于反射获取实体类信息作为数据库表信息

(约定:)

  • 类名驼峰转下划线作为表名
  • 名为id的字段(属性)作为主键
  • 属性名驼峰转下划线作为字段名

(若不符合约定,需手动添加注解:)

  1. @TableName("name"):指定表名

  2. @TableId(value="id",type=IdType.xxx):指定主键信息

  • value:若属性名和字段名不一致,需手动指定
  • type:指定主键的属性(自增AUTO,手动指定INPUT,雪花算法ASSIGN_ID),若不指定,默认雪花
  1. @TableField:指定普通字段信息
  • 使用场景:
    • 属性名和字段名不一致
    • 属性名is开头且为布尔值(反射会自动去掉is,导致和数据库字段名不一致)
    • 属性名为数据库的关键字(拼凑sql语句时会产生错误,需加转义++"`order`"++)
    • 属性不是数据库字段(@TableField(exist=false))

3. 常见配置


三、MybatisPlus核心功能

1. 条件构造器Wrapper

用来支持一些复杂的where语句

(1)**QueryWrapper:**通常用来构建select,update,delete的where部分

(2)**UpdateWrapper:**通常只有在set语句比较特殊时才用(set a=a+2)

(3)LambdaQuery/UpdateWrapper: 不能使用硬编码,修改字段值时需使用反射的方式获取字段名,不能用字符串直接传。建议使用

实例:

(1)(select id,username,info,balance from user where username like "o" and balance >=1000)

(1)(update user set balance=2000 where username="jack")

(2)(update user set balance=balance-20 where id in (1,2,4))

(3)

2. 自定义sql

**场景:**有些复杂场景的where之外的语句需要手动编写(如上例2),而MP代码是写在service层的,这样就将数据库操作的语句写在了service层,不符合代码规范,这时就可以用自定义sql。

**即:**利用MP的Wrapper构造复杂的where条件,然后自己定义sql剩下的部分

步骤:

(1)根据Wrapper构造where条件

(2)调用自定义的mapper层接口,将Wrapper和相关参数传进去

  • Wrapper参数加注解@Param("ew")

(3)在mapper层或.xml中自定义sql语句,拼接Wrapper

  • ${ew.customSqlSegment}

实例:

3. Service接口

提供了常见的增删改查的service层接口,继承后可在controller层直接调用

步骤:

(1)service层接口继承IService接口

(2)service层实现类继承service层接口和IService接口的实现类

(1)IService开发基础业务接口

如简单的根据id增删改查,可直接在controller层调用IService提供好的

!!@Autowired注入spring不推荐,他推荐用构造函数注入,但是比较繁琐

可以在类上加lombok的@RequiredArgsConstructor注解,配合要注入的属性加final关键字,即可实现注入。
拷贝列表:BeanUtil.copyToList(users,UserVO.class);

! copy的参数,如果是已经new好了的,直接穿new出来的;如果还没new呢,就要传.class

(2)IService开发复杂业务接口

在service层写逻辑(比如多次查表),调数据库可以直接调用自己的,也可以调用mapper层的(自定义:例如set a=a-20)

在service层调用service自己方法的方式:

(1)this.getById(id);

(2)getById(id);

(3)baseMapper.selectById(id);(在继承的时候给ServiceImpl传递了自己的mapper泛型,所以不用再次注入UserMapper)

(3)IService的Lambda方法

lambdaQuery:查询,当条件(where)比较复杂的时候,可以使用lambda

前四行为构造条件:根据第一个参数的条件是否成立,决定是否添加本条语句到sql

.list是调用方法:返回一个user类型列表

lambdaUpdate:根据条件更新

(4)IService的批量新增

批处理方案:

(1)for循环逐条插入:性能极差,一条一条发给mysql服务器,mysql一条条执行

(2)MP的批量新增(saveBatch):性能不错,使用了预编译的批处理,一次性发送给mysql服务器,但mysql还是一条条执行(很多条sql语句)

(3)配置JDBC参数rewriteBatchedStatements=true(yaml中):性能较好,一次性发送,一次性执行(只有一条sql语句)


四、MybatisPlus扩展功能

1. 代码生成器(插件)

**功能:**自动生成基础的各个模块都有的代码(根据数据库表生成实体类/controller/mapper/service类和基础代码)

**用法:**可以再官方文档导入依赖,写代码生成;也可以再idea中下载插件

**插件:**MybatisPlus

**用法:**下载后在工具栏的other中连接数据库和生成代码

2. 静态工具Db(类)

**功能:**提供了和IService差不多的方法,但不需要继承

**应用场景:**在一个类中要调用另一个类的数据库表操作时,如果使用@Autowried注入可能会产生循环依赖,为避免循环依赖,可以使用静态工具

**用法:**Db.lambdaQuery(另一个类.class).eq(另一个类::getName,name).one();

**注:**最新版的MP才有

将list集合中的对象按照某一个属性值分组,该属性值相同的在一个list集合

Map<Long,List<VO>> li=VOList.stream().collect(Collectors.groupingBy(VO.getName());

3. 逻辑删除(配置)

**功能:**前端点击删除后,数据在数据库中仍保留,只是不传递给前端

**用法:**数据库表中添加"是否删除"的字段,所有的删除操作都变成修改该字段为已删除

MP提供了逻辑删除功能,无需改变方法的调用方式,底层会自动修改语句,只需进行相关配置:

4. 枚举处理器(配置)

用来实现java中的枚举类和数据库数据的相互转换

**用法:**进行MP的配置,Java中对应数据库数据的枚举类属性加注解@EnumValue,Java中对应返回给前端的枚举类属性加注解@JsonValue(默认返回枚举名字)

5. JSON处理器(注解)

进行数据库的JSON 类型和**java属性(是个类)**的相互转换

**用法:**在属性上加注解@TableField(typeHandler=JacksonTypeHandler.class);在实体类上加注解@TableName(value="user",autoResultMap=true)


五、MybatisPlus插件功能

分页插件

相关推荐
糖炒栗子03262 小时前
后端异步任务编排:基于 RabbitMQ 的“中控-工人”模式
java·rabbitmq
梦梦代码精2 小时前
Dify + 扣子 + n8n + BuildingAI:从零搭建写作自动化平台,踩坑与实战全记录
运维·人工智能·架构·gitee·开源·自动化
沐风清扬2 小时前
微服务-进阶与底层原理学习备忘录
微服务·若依
SimonKing2 小时前
紧急自查!Apifox被投毒,使用者速看:你的Git、SSH、云密钥可能已泄露
java·后端·程序员
Yupureki2 小时前
《Linux系统编程》18.线程概念与控制
java·linux·服务器·c语言·jvm·c++
帅得不敢出门2 小时前
Android Framework中调用由java编译成的jar接口
android·java·framework·jar
Mintopia2 小时前
企业落地 AI-Coding 的“权限与数据红线”简单版:能用到什么程度
人工智能·架构
传感器与混合集成电路2 小时前
从拉曼散射到相位解调:分布式光纤测井技术解析
分布式·架构
国医中兴2 小时前
边缘计算中的存储挑战与解决方案
微服务·云原生·容器·kubernetes·k8s