MybatisPlus扩展功能

 更新时间:2026年01月14日 14:20:44   作者:什么都不会的Tristan  
本文介绍了代码生成器的安装和使用步骤,以及DB静态工具的用途,代码生成器可以自动生成PO、Mapper、Service等相关代码,而DB静态工具可以避免循环依赖,提高开发效率,感兴趣的朋友跟随小编一起看看吧

代码生成器

作用:生成相对固定的POMapperService等相关代码

步骤

安装插件

安装好后重启idea

在“工具”一栏里有相关的两个选项

先点击“Config Database”配置数据库

测试连接成功后点击ok

然后点击“Code Generator”,弹窗如下

最上方是选择要对那个表生成代码,可以多选

module栏:如果是聚合工程并且当前模块为子模块,需要填写为该子模块的名字(如果不符合则不用填写这一栏)

package栏:填写代码生成的父级包路径

例:

如图

则填写红框框起来的部分,因为POMapperService都在该包下

author栏:作者

over file选项:勾选上表示生成代码覆盖原来的代码

Entity:勾选上表示要生成实体类,栏里填写要生成在哪一个包下

Mapper、Controller、Service、ServiceImpl类似Entity

TablePrefix栏:前缀,如果表名有前缀并且生成代码的时候想要忽略这个前缀,则填写

最下方一栏选项是注解,勾选上则生成对应的注解

写完后点击右下角“code generator”即可生成代码,亲测有效~

DB静态工具

作用:避免循环依赖

maven坐标:MyBatis-Plus 的 Starter 依赖已经包含,不用单独再导入

案例

需求:

1.改造根据id查询用户的接口,查询用户的同时,查询出用户对应的所有地址

Controller

@GetMapping("{id}")
@ApiOperation("根据id查询用户")
public UserVO queryUserById(@ApiParam("用户ID") @PathVariable Long id){
    return userService.queryUserAndAddressById(id);
}

Service实现类

@Override
public UserVO queryUserAndAddressById(Long id) {
    // 查询用户
    User user = getById(id);
    if (user == null|| user.getStatus() == 2){
        throw new RuntimeException("用户状态异常!");
    }
    // 查询地址
    List<Address> addresses = Db.lambdaQuery(Address.class)
            .eq(Address::getUserId, id)
            .list();
    // 封装VO
    // 转User的PO为VO
    UserVO userVO = BeanUtil.copyProperties(user, UserVO.class);
    // 转地址VO
    if (CollUtil.isNotEmpty(addresses)){
        userVO.setAddresses(BeanUtil.copyToList(addresses, AddressVO.class));
    }
    return null;
}

2.改造根据id批量查询用户的接口,查询用户的同时,查询出用户对应的所有地址

Controller

@GetMapping
@ApiOperation("根据id批量查询用户")
public List<UserVO> queryUserById(@ApiParam("用户ID集合") @RequestParam List<Long> ids){
    return userService.queryUserAndAddressByIds(ids);
}

Service实现类

@Override
public List<UserVO> queryUserAndAddressByIds(List<Long> ids) {
    // 查询用户
    List<User> users = listByIds(ids);
    if (CollUtil.isEmpty(users)) {
        return Collections.emptyList();
    }
    // 查询地址
    // 获取用户id集合
    List<Long> userIds = users.stream().map(User::getId).collect(Collectors.toList());
    // 根据用户id查询地址
    List<Address> addresses = Db.lambdaQuery(Address.class).in(Address::getUserId, userIds).list();
    // 转换地址VO
    List<AddressVO> addressVOS = BeanUtil.copyToList(addresses, AddressVO.class);
    // 用户地址集合分组处理,相同用户的放入一个集合(组)中
    Map<Long, List<AddressVO>> addressVOMap = new HashMap<>();
    if (CollUtil.isEmpty(addresses)) {
        addressVOMap = addressVOS.stream().collect(Collectors.groupingBy(AddressVO::getUserId));
    }
    // 转VO返回
    List<UserVO> list = new ArrayList<>(users.size());
    for (User user : users) {
        // 转User的PO为VO
        UserVO userVO = BeanUtil.copyProperties(user, UserVO.class);
        // 转地址VO
        userVO.setAddresses(addressVOMap.get(user.getId()));
        list.add(userVO);
    }
    return list;
}

逻辑删除

逻辑删除就是基于代码逻辑模拟删除效果,但并不会真正删除数据。思路如下:

  • 在表中添加一个字段标记数据是否被删除
  • 当删除数据时把标记置为1
  • 查询时只查询标记为0的数据

那这样一来,查询语句后面都需要加上deleted=0的条件,但是mp的方法没有这个条件,怎么办?

MybatisPlus提供了逻辑删除功能,无需改变方法调用的方式,而是在底层帮我们自动修改CRUD的语句。我们要做的就是在application.yaml文件中配置逻辑删除的字段名称和值即可:

mybatis-plus:
  type-aliases-package: com.itheima.mp.pojo
  global-config:
      db-config:
          logic-delete-field: deleted # 配置逻辑删除字段(自定义,与表中该字段对应)
          logic-delete-value: 1 # 逻辑已删除值(默认为1)
          logic-not-delete-value: 0 # 逻辑未删除值(默认为0)

配置了之后,删除某条数据实际就是把某条数据的deleted字段设置为1,并不会真的从数据库中删除

枚举处理器

当实体类中某个变量的值的数量比较固定,并且每个值对应某一种描述时,推荐使用枚举

比如:1表示账号正常,2表示账号冻结

这时候就把实体类中的status字段定义为枚举类型,但是数据库怎么根据自定义的枚举类型来判断操作数是什么呢?这时就用到了mp的枚举处理器

使用步骤:

  1. 加@EnumValue注解
  2. 配置yaml文件

案例

实体类

@Data
public class User {
    /**
     * 使用状态(1正常 2冻结)
     */
    private UserStatus status;
}

枚举类

@Getter
public enum UserStatus {
    NORMAL(1, "正常"),
    FREEZE(2, "冻结");
    @EnumValue
    private final int value;
    private final String desc;
    UserStatus(int value, String desc) {
        this.value = value;
        this.desc = desc;
    }
}

@EnumValue是mp提供的注解,表示哪个值是数据库增删改查时实际需要操作的数,比如上述就是value的值是数据库增删改查时实际需要操作的数

yaml文件配置

mybatis-plus:
  configuration:
    default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler

搞定!

注意:

  1. PO对应的DTO和VO如果存在相互拷贝的情况,都需要改成自定义的枚举类型
  2. 默认返回给前端的值为枚举项的名字,以案例为例,比如“NORMAL”,如果需要返回value,则在value上方加上注解 @JsonValue

JSON处理器

实体类中某个字段存储的是json格式的数据,并且想处理里面的某个数据时,需要单独定义一个类,那么这个数据库怎么存储这个类呢?这时就用到了mp的JSON处理器

使用方式:

  1. 给该字段加上@TableField(typeHandler = JacksonTypeHandler.class)
  2. 给该实体类加上@TableName(autoResultMap = true)

案例

User类

@Data
@TableName(value = "user", autoResultMap = true)
public class User {
    /**
     * 详细信息
     */
    @TableField(typeHandler = JacksonTypeHandler.class)
    private UserInfo info;
}

UserInfo类

@Data
@AllArgsConstructor(staticName = "of") // UserInfo.of(...) 等同于 new UserInfo(...)
@NoArgsConstructor
public class UserInfo {
    private Integer age;
    private String intro;
    private String gender;
}

搞定!

到此这篇关于MybatisPlus扩展功能的文章就介绍到这了,更多相关MybatisPlus扩展内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 开源的Java图片处理库实例详解

    开源的Java图片处理库实例详解

    Java 图片处理库提供了丰富的功能,用于处理和增强图像,在Java生态系统中,有几个流行的开源库可以用于图片处理,这些库提供了丰富的功能,如图像缩放、裁剪、颜色调整、格式转换等,本文介绍开源的Java图片处理库介绍,感兴趣的朋友一起看看吧
    2024-03-03
  • java获取日期之间天数的方法

    java获取日期之间天数的方法

    这篇文章主要介绍了java获取日期之间天数的方法,涉及java针对日期的转换与数学运算相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • Java SSM框架(Spring+SpringMVC+MyBatis)搭建过程

    Java SSM框架(Spring+SpringMVC+MyBatis)搭建过程

    最近一段时间搭建了ssm环境,并测试了几个小项目,下面小编通过图文并茂的形式给大家分享Java SSM框架(Spring+SpringMVC+MyBatis)搭建过程,需要的朋友参考下吧
    2017-11-11
  • 运行Springboot测试类查询数据库数据显示白网页问题及解决方法

    运行Springboot测试类查询数据库数据显示白网页问题及解决方法

    Spring Boot应用未能启动的原因是它没有找到合适的数据库配置具体来说,它需要一个数据源(DataSource),但未能在你的配置中找出,也没有找到任何嵌入式数据库(H2, HSQL 或 Derby),本文给大家分享运行Springboot测试类查询数据库数据显示白网页问题及解决方法,一起看看吧
    2023-11-11
  • SpringBoot整合rabbitMq自定义消息转换方式

    SpringBoot整合rabbitMq自定义消息转换方式

    这篇文章主要介绍了SpringBoot整合rabbitMq自定义消息转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Java import static及import原理区别解析

    Java import static及import原理区别解析

    这篇文章主要介绍了Java import static及import原理区别解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • SpringBoot3整合MyBatis出现异常:Property 'sqlSessionFactory'or 'sqlSessionTemplate' are required

    SpringBoot3整合MyBatis出现异常:Property 'sqlSessionFactory&a

    这篇文章主要介绍了SpringBoot3整合MyBatis报错:Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required,其实不是个大问题,只是自己编码时遇到了,然后总结总结分享一下,如果有遇到类似问题的,可以参考一下
    2022-11-11
  • Java 细致图解带你分析汉诺塔

    Java 细致图解带你分析汉诺塔

    汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。本文将用Java求解这一问题,感兴趣的可以学习一下
    2022-03-03
  • Sharding-Proxy分库分表和数据加密使用场景分析

    Sharding-Proxy分库分表和数据加密使用场景分析

    这篇文章主要介绍了Sharding-Proxy分库分表和数据加密使用经验分享,通过场景模拟分析结合示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • Java中LinkedList和ArrayList的效率分析

    Java中LinkedList和ArrayList的效率分析

    本文主要介绍了Java中LinkedList和ArrayList的效率分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02

最新评论