
一、导学
微服务是一种软件架构风格,以专注于很多单一职责的小项目为基础,组合出复杂的大型应用。
服务拆分、远程调用、服务治理、请求路由、身份认证、配置管理、服务保护、分布式事务、异步通信、消息可靠性、延迟消息、分布式搜索、倒排索引、数据聚合
二、MybatisPlus快速入门
1. 准备
(1)导入MP依赖(兼容了Mybatis,可直接把Mybatis依赖注掉)

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

2. 常见注解
- MP通过扫描实体类 ,基于反射获取实体类信息作为数据库表信息
(约定:)
- 类名驼峰转下划线作为表名
- 名为id的字段(属性)作为主键
- 属性名驼峰转下划线作为字段名
(若不符合约定,需手动添加注解:)
-
@TableName("name"):指定表名
-
@TableId(value="id",type=IdType.xxx):指定主键信息
- value:若属性名和字段名不一致,需手动指定
- type:指定主键的属性(自增AUTO,手动指定INPUT,雪花算法ASSIGN_ID),若不指定,默认雪花
- @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插件功能
分页插件