目录

MybatisPlus

MybatisPlus

1.增删改查入门案例:

首先导入依赖:

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3.1</version>
        </dependency>

然后这些增删改查的方法就可以删掉了 (注意这里只能是单表查询,多表查询不适用)

Mapper层:

https://i-blog.csdnimg.cn/direct/5c7f6d7a197c481ea3ea1a2e58c2c9d7.png

xml文件:

https://i-blog.csdnimg.cn/direct/9596cf4424cf430184a6edc87a273a03.png

删完之后,在测试方法中找到提示词提示的方法进行填充就好了

比如这个查询方法

https://i-blog.csdnimg.cn/direct/ee3511610adb45998c227c0e3cc059eb.png

运行一下方法:

https://i-blog.csdnimg.cn/direct/dead2e22bb584e86ab5f7d52cec12c3c.png

1.2:常用注解:

https://i-blog.csdnimg.cn/direct/cda05bb6116044e5aef80698dd438c9a.jpeg

MybatisPlus 中比较常用的几个注解如下:

  • @TableName:用来指定表名
  • @TableId:用来指定表中的主键字段信息
  • @TableField:用来指定表中的普通字段信息

IdType 枚举:

  • AUTO:数据库自增长
  • INPUT:通过 set 方法自行输入
  • ASSIGN_ID:分配 ID,按 IdentifierGenerator 的方法 nextId 来生成 id,默认实现类为 DefaultIdentifierGenerator 雪花算法

使用 @TableField 的常见场景:

  • 成员变量名与数据库字段名不一致
  • 成员变量名以 is 开头,且是布尔值
  • 成员变量名与数据库关键字冲突
  • 成员变量不是数据库字段

代码示例:

@TableName("tb_user")
public class User {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @TableField("username")
    private String name;
    @TableField("is_married")
    private Boolean isMarried;
    @TableField("order")
    private Integer order;
    @TableField(exist = false)
    private String address;
}

表结构信息:

名称数据类型注释默认值
idBIGINT用户 idAUTO_INCREMENT
usernameVARCHAR用户名无默认值
is_marriedBIT密码0
orderTINYINT序号NULL

2.条件构造器

https://i-blog.csdnimg.cn/direct/1361336b46fc4cd5b17b9c6fed9017c3.png

QueryWrapper和UpdateWrapper的用法

这是原来的mybatis查询语句:

https://i-blog.csdnimg.cn/direct/7dd63185137543fbb0a24bd2abf5acdd.png

这是mybatis-plus的查询语句:

https://i-blog.csdnimg.cn/direct/36019978243a4820b1cf63d2f19bc5f0.png

查询结果:

https://i-blog.csdnimg.cn/direct/932bf10f0cab416e97d39b8723ee18d5.png https://i-blog.csdnimg.cn/direct/33c7d3500ea04eadb1c3d1b14e0aa7cc.png

查询结果:

https://i-blog.csdnimg.cn/direct/8d2c62e4f0924d5eb8e0ff3bbadbc9ac.png

问题:可是刚才的更新操作是把更新的值给写死了,碰到下面的问题那我们就要用一种新的方法

https://i-blog.csdnimg.cn/direct/256504fb7a594a1a80af7b6cb122f135.png

https://i-blog.csdnimg.cn/direct/bdb3f0510c5e4f4bbedab7d03cdab357.png

问题:上面的那些其实都是把字段写死的硬编码,我们就用到了lambdaQueryWeapper

https://i-blog.csdnimg.cn/direct/cbd56f7f74a04e21955e93731904c1ae.png

https://i-blog.csdnimg.cn/direct/2c13fad95b0c490492c8654679585373.png

3.自定义Sql

https://i-blog.csdnimg.cn/direct/d45a6a6e50304085a10b9c6f7282eeac.png

https://i-blog.csdnimg.cn/direct/850cf80f9cd44e92b86498971a0199ca.png

4.Service接口

service接口的继承关系

https://i-blog.csdnimg.cn/direct/d3f51fe65a6548869e779f5d6f16f49b.png

https://i-blog.csdnimg.cn/direct/ddca112e41df4992bf144d286b9b18b3.png https://i-blog.csdnimg.cn/direct/2be6bc0a903f4f7fb0435ee17b03ca28.png

用Sevice就可以做到对数据库的操作,非常的厉害,他的底层就是去调了userMapper的接口

5.代码生成

在使用MybatisPlus以后,基础的 MapperServicePO 代码相对固定,重复编写也比较麻烦。因此MybatisPlus官方提供了代码生成器根据数据库表结构生成 POMapperService 等相关代码。只不过代码生成器同样要编码使用,也很麻烦。

这里推荐大家使用一款 MybatisPlus 的插件,它可以基于图形化界面完成 MybatisPlus 的代码生成,非常简单。

3.1.1.安装插件

Idea 的plugins市场中搜索并安装 MyBatisPlus 插件:

3.1.2.使用

刚好数据库中还有一张address表尚未生成对应的实体和mapper等基础代码。我们利用插件生成一下。 首先需要配置数据库地址,在Idea顶部菜单中,找到 other ,选择 Config Database

https://i-blog.csdnimg.cn/direct/c18e93a49e4447acaca645ae69e231f8.png

3.3. 逻辑删除

对于一些比较重要的数据,我们往往会采用逻辑删除的方案,即:

  • 在表中添加一个字段标记数据是否被删除
  • 当删除数据时把标记置为true
  • 查询时过滤掉标记为true的数据

一旦采用了逻辑删除,所有的查询和删除逻辑都要跟着变化,非常麻烦。

为了解决这个问题,MybatisPlus就添加了对逻辑删除的支持。

注意 ,只有MybatisPlus生成的SQL语句才支持自动的逻辑删除,自定义SQL需要自己手动处理逻辑删除。

例如,我们给 address 表添加一个逻辑删除字段:

alter table address add deleted bit default b'0' null comment '逻辑删除';

然后给 Address 实体添加 deleted 字段:

https://i-blog.csdnimg.cn/direct/ccf9c1bf5a584c7895d38e5ef8b3aa2d.png

接下来,我们要在 application.yml 中配置逻辑删除字段:

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: deleted # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

测试: 首先,我们执行一个删除操作:

@Test
void testDeleteByLogic() {
    // 删除方法与以前没有区别
    addressService.removeById(59L);
}

方法与普通删除一模一样,但是底层的SQL逻辑变了:

https://i-blog.csdnimg.cn/direct/8c4411a6e38c4c4e8e9d88178b39173a.png

综上, 开启了逻辑删除功能以后,我们就可以像普通删除一样做CRUD,基本不用考虑代码逻辑问题。还是非常方便的。

注意 : 逻辑删除本身也有自己的问题,比如:

  • 会导致数据库表垃圾数据越来越多,从而影响查询效率
  • SQL中全都需要对逻辑删除字段做判断,影响查询效率

因此,我不太推荐采用逻辑删除功能,如果数据不能删除,可以采用把数据迁移到其它表的办法。