当前位置: 代码网 > it编程>编程语言>Java > MyBatis-plus(下)

MyBatis-plus(下)

2024年08月02日 Java 我要评论
只有save与update不需要传class字节码改造根据id批量查询用户的接口,查询用户的同时,查询出用户对应的所有地址。

目录

静态工具

逻辑删除

枚举处理器

​编辑​编辑json处理器 

分页插件

案例 



静态工具

只有save与update不需要传class字节码

usercontroller:

myserviceimpl: 

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

 @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> address = db.lambdaquery(address.class).in(address::getuserid, userids).list();
        //转换地址vo
        list<addressvo> addressvolist = beanutil.copytolist(address, addressvo.class);
        //用户地址集合分组处理,相同用户的放入一个集合(组)中
        map<long, list<addressvo>> addressmap=new hashmap<>(0);
        if (collutil.isnotempty(addressvolist)) {
            addressmap = addressvolist.stream().collect(collectors.groupingby(addressvo::getuserid));
        }

        //转vo返回
        list<uservo> list=new arraylist<>(users.size());
        for (user user : users) {
            uservo vo = beanutil.copyproperties(user, uservo.class);
            list.add(vo);
            vo.setaddresses(addressmap.get(user.getid()));
        }
        return list;
    }

 

逻辑删除

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

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: deleted #全局逻辑制除的实体字段名,字段类型可以是boolean、integer
      logic-delete-value: 1 #逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 #逻辑未删除值(默认为 0)

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

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

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

枚举处理器

在application.yml中配置全局枚举处理器: 

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

package com.yjj.mp.enums;

import com.baomidou.mybatisplus.annotation.enumvalue;
import lombok.getter;

@getter
public enum userstatus {
    normal(1, "正常"),
    frozen(2, "冻结"),
    ;
    @enumvalue
    private final int value;
    private final string desc;

    userstatus(int value, string desc) {
        this.value = value;
        this.desc = desc;
    }
}

 

将类型改为userstatus枚举类型

 

 

可以看到运行程序之后显示的是normal,如果想要看到显示状态的话,就加上jsonvalue注解

json处理器 

 

写一个userinfo类

package com.yjj.mp.domain.po;

import lombok.allargsconstructor;
import lombok.data;
import lombok.noargsconstructor;

@data
@noargsconstructor
@allargsconstructor(staticname = "of")
public class userinfo {
    private integer age;
    private string intro;
    private string gender;
}

在user类上加上@tablename(value = "user",autoresultmap = true)

然后之前写的测试就要修改了

现在再测试的话

 

分页插件

 首先,要在配置类中注册mybatisplus的核心插件,同时添加分页插件

mybatisconfig配置类:

package com.yjj.mp.config;

import com.baomidou.mybatisplus.annotation.dbtype;
import com.baomidou.mybatisplus.extension.plugins.mybatisplusinterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.paginationinnerinterceptor;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;

@configuration
public class mybatisconfig {
    @bean
    public mybatisplusinterceptor mybatisplusinterceptor(){
        mybatisplusinterceptor interceptor=new mybatisplusinterceptor();
        //创建分页插件
        paginationinnerinterceptor paginationinnerinterceptor=new paginationinnerinterceptor(dbtype.mysql);
        paginationinnerinterceptor.setmaxlimit(1000l);
        //添加分页插件
        interceptor.addinnerinterceptor(paginationinnerinterceptor);
        return interceptor;
    }
}

测试代码:

 @test
        void testpagequery(){
            int pageno=1,pagesize=10;
            //准备分页条件
            page<user> page = page.of(pageno, pagesize);
            //排序条件
            page.addorder(new orderitem("balance",true));
            page.addorder(new orderitem("id",true));
            page<user> p = myuserservice.page(page);
            //解析
            long total = p.gettotal();
            system.out.println("total ="+total);
            long pages = p.getpages();
            system.out.println("pages ="+pages);
            list<user> users = p.getrecords();
            users.foreach(user -> system.out.println(user));
        }

案例 

请求方式        get

请求路径        /users/page

请求参数       

 "pageno":1

"pagesize": 5,

"sortby":"balance"

"isasc":false,

"name": "jack",

"statub":1

返回值


特殊说明

如果排序字段为空,默认按照更新时间排序,排序字段不为空,则按照排序字段排序 

controller层:

service接口层

 

先写个pagequery,再让userquery继承pagequery

package com.yjj.mp.query;

import cn.hutool.core.util.strutil;
import com.baomidou.mybatisplus.core.metadata.orderitem;
import com.baomidou.mybatisplus.extension.plugins.pagination.page;
import io.swagger.annotations.apimodel;
import io.swagger.annotations.apimodelproperty;
import lombok.data;

@data
@apimodel(description = "分页查询实体")
public class pagequery {
    @apimodelproperty("页码")
    private integer pageno=1;
    @apimodelproperty("页码")
    private integer pagesize=5;
    @apimodelproperty("排序字段")
    private string  sortby;
    @apimodelproperty("是否升序")
    private boolean isasc=true;


    public <t> page<t> tomappage(orderitem ... items){
        //分页查询
        page<t> page = page.of(pageno, pagesize);
        //排序条件
        if (strutil.isnotempty(sortby)) {
            //不为空
            page.addorder(new orderitem(sortby, isasc));
        }else if (items!=null){
            //为空,默认按照更新时间排序
            page.addorder(items);
        }
        return page;
    }

    public <t> page<t> tomappage(string defaultsortby,boolean defaultasc){
        return tomappage(new orderitem(defaultsortby,defaultasc));
    }

    public <t> page<t> tomappagedefaultsortbycreatetime(){
        return tomappage(new orderitem("create_time",false));
    }

    public <t> page<t> tomappagedefaultsortbyupdatetime(){
        return tomappage(new orderitem("update_time",false));
    }
}

pagedto :

package com.yjj.mp.domain.dto;

import cn.hutool.core.bean.beanutil;
import cn.hutool.core.collection.collutil;
import com.baomidou.mybatisplus.extension.plugins.pagination.page;
import io.swagger.annotations.apimodel;
import io.swagger.annotations.apimodelproperty;
import lombok.data;

import java.util.collections;
import java.util.list;

@data
@apimodel(description = "分页结果")
public class pagedto<t> {
    @apimodelproperty("总条数")
    private long total;
    @apimodelproperty("总页数")
    private long pages;
    @apimodelproperty("集合")
    private list<t> list;

    public static <po,vo> pagedto<vo> of(page<po> p,class<vo> clazz){
        pagedto<vo> dto = new pagedto<>();
        //总条数
        dto.settotal(p.gettotal());
        //总页数
        dto.setpages(p.getpages());
        //当前页数据
        list<po> records = p.getrecords();
        if (collutil.isempty(records)){
            dto.setlist(collections.emptylist());
            return dto;
        }
        list<vo> vos = beanutil.copytolist(records, clazz);
        dto.setlist(vos);
        //返回

        return dto;
    }
}

 service层:

@override
    public pagedto<uservo> queryuserspage(userquery query) {
        string name = query.getname();
        integer status = query.getstatus();
        //构建查询条件
        page<user> page = query.tomappagedefaultsortbyupdatetime();

        //分页查询
        page<user> p = lambdaquery()
                .like(name != null, user::getusername, name)
                .eq(status != null, user::getstatus, status)
                .page(page);
        //封装vo结果
        return pagedto.of(p,uservo.class);
    }


努力遇见更好的自己!!!

(0)

相关文章:

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

发表评论

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