用mybatis-plus实现分页、多条件查询
mybatis-plus
条件构造器QueryWrapper常用方法
/**
*附加条件构造器QueryWrapper常用方法
*/
wrapper.eq("数据库字段名", "条件值"); //相当于where条件 等于
wrapper.ne("数据库字段名", "条件值"); //相当于where条件 不等于
wrapper.ge("数据库字段名", "要比较的值"); //大于等于
wrapper.le("数据库字段名", "要比较的值"); //小于等于
wrapper.gt("数据库字段名", "要比较的值"); //大于
wrapper.lt("数据库字段名", "要比较的值"); //小于
wrapper.between("数据库字段名", "区间一", "区间二"); //相当于范围内使用的between 在值区间一到区间二之间
wrapper.notBetweeen("数据库字段名", "区间一", "区间二"); //相当于不在范围内使用的between
wrapper.like("数据库字段名", "模糊查询的字符"); //模糊查询like
wrapper.likeLeft("数据库字段名", "模糊查询的字符"); //模糊查询like模糊查询匹配最后一位值‘%值’
wrapper.likeRight("数据库字段名", "模糊查询的字符"); //模糊查询like模糊查询匹配第一位值‘值%’
wrapper.groupBy("数据库字段名"); //相当于group by分组
wrapper.in("数据库字段名", "包括的值,分割"); //相当于in
wrapper.notIn("数据库字段名", "不包括的值,分割"); //相当于not in
wrapper.isNull("数据库字段名"); //值为空或null
wrapper.isNotNull("数据库字段名"); //值不为空或不为null
wrapper.orderByAsc("数据库字段名"); //排序升序
wrapper.orderByDesc("数据库字段名"); //排序降序
wrapper.or(); //—或者 例:wrapper.like("name", keywords).or().like("address", keywords)
wrapper.and(); //——和
wrapper.inSql("sql语句"); //符合sql语句的值
wrapper.notSql("sql语句"); //不符合SQL语句的值
wrapper.esists("SQL语句"); //查询符合SQL语句的值
wrapper.notEsists("SQL语句"); //查询不符合SQL语句的值
一、分页查询
1.设置分页信息
//1.设置分页信息 Page<User> page = new Page<>(1,10);
2.写配置类(config/MyBatisPlusConfig)
package com.fzy.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 MyBatisPlusConfig { // 最新版 @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }
3.查询
package com.fzy.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fzy.entity.User; import com.fzy.service.UserService; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/user") @RequiredArgsConstructor public class UserController { private final UserService userService; //分页查询 @RequestMapping("/page") public IPage<User> page(){ //1.设置分页信息 Page<User> page = new Page<>(2,3); //2.查询 Page<User> page1 = userService.page(page); System.out.println("page1 = " + page1); System.out.println("page1.getSize() = " + page1.getSize()); System.out.println("page1.getCurrent() = " + page1.getCurrent()); System.out.println("page1.getPages() = " + page1.getPages()); System.out.println("page1.getTotal() = " + page1.getTotal()); System.out.println("page1.getRecords() = " + page1.getRecords()); return page1; } }
二、多表分页+条件查询
1.设置分页信息,和查询条件
//多表分页+条件查询 @RequestMapping("/list3") public Page<UserAndDeptVo> list3(){ //设置分页信息 Page<UserAndDeptVo> page = new Page<>(1, 5); //设置查询条件 User user = new User(){{ setUsername("冬冬"); }}; //查询 Page<UserAndDeptVo> pageInfo = userService.findUserAndDeptByPage(page,user); System.out.println("pageInfo.getTotal() = " + pageInfo.getTotal()); System.out.println("pageInfo.getSize() = " + pageInfo.getSize()); System.out.println("pageInfo.getPages() = " + pageInfo.getPages()); return pageInfo; }
2.写配置类(config/MyBatisPlusConfig)
package com.fzy.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 MyBatisPlusConfig { // 最新版 @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }
3.封装类
package com.fzy.vo; import com.fzy.entity.Department; import com.fzy.entity.User; import lombok.Data; @Data public class UserAndDeptVo { private User user; private Department department; }
4.编写动态sql,映射
Page<UserAndDeptVo> selectUserAndDeptByPage(@Param("page") Page<UserAndDeptVo> page,@Param("user") User user);
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.fzy.mapper.UserMapper"> <sql id="Base_Column_List"> id,username,password, dept_id,is_delete,pro_img </sql> <resultMap id="UserAndDeptVo" type="com.fzy.vo.UserAndDeptVo"> <association property="user" javaType="com.fzy.entity.User"> <id property="id" column="id" jdbcType="INTEGER"/> <result property="username" column="username" jdbcType="VARCHAR"/> <result property="password" column="password" jdbcType="VARCHAR"/> <result property="deptId" column="dept_id" jdbcType="VARCHAR"/> <result property="isDelete" column="is_delete" jdbcType="INTEGER"/> <result property="proImg" column="pro_img" jdbcType="VARCHAR"/> </association> <association property="department" javaType="com.fzy.entity.Department"> <id property="deptId" column="dept_id" jdbcType="VARCHAR"/> <result property="name" column="name" jdbcType="VARCHAR"/> </association> </resultMap> //分页连表查询 <select id="selectUserAndDeptByPage" resultMap="UserAndDeptVo"> SELECT u.*,d.* FROM `user` u LEFT JOIN `departments` d ON u.dept_id=d.dept_id <where> <if test="user!=null and user!=''"> u.username=#{user.username} </if> </where> </select> </mapper>
分页+条件查询
@Override public PageApiRest getList(PageDTO<SysPermission> pageDto) { //1.设置分页信息 IPage<SysPermission> page = new Page<>(pageDto.getPage(),pageDto.getSize()); //2.设置查询条件 QueryWrapper<SysPermission> queryWrapper = new QueryWrapper<>(); //查询条件不为空,并且标题不为空串,就模糊查询标题 //资源名称 if(pageDto.getWhere()!=null && !StringUtils.isEmpty(pageDto.getWhere().getPermName())){ queryWrapper.lambda().like(SysPermission::getPermName,pageDto.getWhere().getPermName()); } //资源路径 if(pageDto.getWhere()!=null && !StringUtils.isEmpty(pageDto.getWhere().getLinkUrl())){ queryWrapper.lambda().like(SysPermission::getLinkUrl,pageDto.getWhere().getLinkUrl()); } //资源分类 if(pageDto.getWhere()!=null && !StringUtils.isEmpty(pageDto.getWhere().getPermDesc())){ queryWrapper.lambda().like(SysPermission::getPermDesc,pageDto.getWhere().getPermDesc()); } //查询指定字段 queryWrapper.select("id", "title"); //排除字段查询 queryWrapper.select(SysPermission.class, info -> !info.getColumn().equals("content") && !info.getColumn().equals("update_by")); //3.查询 IPage<SysPermission> page1 = baseMapper.selectPage(page, queryWrapper); //4.封装,返回 PageApiRest<SysPermission> pageRest = new PageApiRest<>(); pageRest.setTotal(page1.getTotal()); pageRest.setData(page1.getRecords()); return pageRest; }
三、mybatis-plus的修改时间自动填充
1.时间字段上配置注解
@TableField(fill = FieldFill.INSERT) //插入时生效 private Date createTime; @TableField(fill = FieldFill.INSERT_UPDATE) //插入和修改时生效 private Date updateTime;
2.编写配置类(MyMetaObjectHandler.java)
package com.fzy.config; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; import java.util.Date; @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, "createTime", Date.class, new Date()); // 起始版本 3.3.0(推荐使用) this.strictInsertFill(metaObject, "updateTime", Date.class, new Date()); // 起始版本 3.3.0(推荐使用) } @Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date()); // 起始版本 3.3.0(推荐) } }