当前位置: 代码网 > it编程>编程语言>Java > MybatisPlus扩展功能

MybatisPlus扩展功能

2026年01月14日 Java 我要评论
代码生成器作用:生成相对固定的po、mapper、service等相关代码步骤安装插件安装好后重启idea在“工具”一栏里有相关的两个选项先点击“config da

代码生成器

作用:生成相对固定的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扩展内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com