目录
静态工具
只有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);
}
努力遇见更好的自己!!!
发表评论