这篇文章主要介绍了MybatisPlus中的多表条件排序查询,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
1.pom文件
sql支持 ${ew.customSqlSegment} 最低版本3.0.7
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.7</version>
</dependency>
2.自定义返回对象
@Data
@ApiModel
public class SupLogUserVO
{
@ApiModelProperty(value="日志ID")
private Long id;
@ApiModelProperty(value="用户ID")
private Long userId;
@ApiModelProperty(value="姓名")
private String name;
@ApiModelProperty(value="操作类型")
private String operation;
@ApiModelProperty(value="方法")
private String method;
@ApiModelProperty(value="参数")
private String param;
@ApiModelProperty(value="客户端类型")
private String clientType;
@ApiModelProperty(value="业务系统")
private String sysId;
@ApiModelProperty(value="ip")
private String ip;
@ApiModelProperty(value="创建时间")
private LocalDateTime createTime;
}
3.mapper方法
IPage<SupLogUserVO> getSupLogUser(IPage<SupLogUserVO> page, @Param(Constants.WRAPPER) Wrapper<SupLogUserVO> queryWrapper);
4.xml自定义sql
<select id="getSupLogUser" resultType="bw.yth.svc.web.sysmng.vo.SupLogUserVO">
select
l.id,l.user_id userId,u.`name`,l.operation,l.method,l.param,
l.client_type clientType,l.sys_id sysId,l.ip,l.create_time createTime
from sup_log l
LEFT JOIN
sys_user u
on l.user_id = u.user_id
${ew.customSqlSegment}
</select>
5.service方法
public IPage<SupLogUserVO> getSupLogUser(String name, String six, String order, Integer curPage, Integer limit) {
QueryWrapper<SupLogUserVO> wrapper = new QueryWrapper<SupLogUserVO>().like(StringUtils.isNotBlank(name), "name", name);
wrapper = QueryUtil.addOrderBy(wrapper, six, null, order, null);
Page<SupLogUserVO> page = QueryUtil.getPage(curPage, limit);
return supLogDao.getSupLogUser(page, wrapper);
}
6.QueryUtil自定义的查询工具
import org.apache.commons.lang3.StringUtils;
import bw.common.util.BclSqlUtil;
import bw.yth.svc.base.AppConst;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
/** 查询相关的工具类 */
public class QueryUtil
{
/** 防SQL注入过滤。去掉 “'";\”及空格
* @return - 输入为空或全被过滤则返回空串,一定不会返回null
*/
public static String filterSql(String sql)
{
return BclSqlUtil.filterSql(sql, true);
}
/** 根据分页参数生成MP分页对象
* @param pageNo 页号(从1开始)
* @param pageSize 每页条数
*/
public static <T> Page<T> getPage(Integer pageNo, Integer pageSize)
{
if(pageNo==null || pageNo<1)
pageNo = 1;
if(pageSize==null || pageSize<1 || pageSize>AppConst.Q_MAX_PER_PAGE)
pageSize = AppConst.Q_DEFAULT_PER_PAGE;
return new Page<T>(pageNo, pageSize);
}
/** 为查询增加排序条件(可指定默认条件)
* @param wrapper 查询对象
* @param orderField 指定的排序字段,可为空
* @param defOrderField 缺省的排序字段(无指定字段时用),可为空
* @param orderType 指定的排序方向,可为空
* @param defOrderType 缺省的排序方向(无指定方向时用),可为空
* @return 查询对象
*/
public static <T> QueryWrapper<T> addOrderBy(QueryWrapper<T> wrapper, String orderField, String defOrderField, String orderType, String defOrderType)
{
boolean isAsc;
//先判断排序方向
isAsc = true;
if( StringUtils.isBlank(orderType) ) //无指定值
{
if( AppConst.DESC.equalsIgnoreCase(defOrderType) ) //判断默认值
isAsc = false;
}
else //有指定值
{
if( AppConst.DESC.equalsIgnoreCase(orderType) )
isAsc = false;
}
//再判断排序字段
if( StringUtils.isBlank(orderField) ) //无指定值
{
if( !StringUtils.isBlank(defOrderField) ) //有默认值
wrapper.orderBy(true, isAsc, QueryUtil.filterSql(defOrderField));
}
else //有指定值
wrapper.orderBy(true, isAsc, QueryUtil.filterSql(orderField));
return wrapper;
}
/** 为查询增加排序条件(无默认排序条件)
* @param wrapper 查询对象
* @param orderField 指定的排序字段,可为空
* @param orderType 指定的排序方向,可为空
* @return 查询对象
*/
public static <T> QueryWrapper<T> addOrderBy(QueryWrapper<T> wrapper, String orderField, String orderType)
{
return addOrderBy(wrapper, orderField, null, orderType, null);
}
//待删除
/** 获得数据库分页参数。返回:[0]=开始索引(from 0) [1]=条数 [2]=页号(从1开始) */
public static int[] getPageParam(Integer pageNo, Integer pageSize)
{
int[] result = new int[3];
//条数
if(pageSize==null || pageSize<1)
result[1] = 20;
else if(pageSize > 200)
result[1] = 200;
else
result[1] = pageSize;
//开始索引
if(pageNo==null || pageNo<1)
{
result[0] = 0;
result[2] = 1;
}
else
{
result[0] = (pageNo-1)*result[1];
result[2] = pageNo;
}
return result;
}
}
7.常量配置
/** 项目的常量定义-业务相关 */
public class AppConst
{
//==== 查询相关的参数
/** 查询返回的最大条数。优先级高于分页参数,防止返回数据太多导致数据库负担过重 */
public static final int Q_MAX_RESULT = 1000;
/** 最大的每页大小值 */
public static final int Q_MAX_PER_PAGE = 100;
/** 默认的每页大小值 */
public static final int Q_DEFAULT_PER_PAGE = 20;
/** 导出数据时返回的最大条数 */
public static final int Q_MAX_EXPORT = 5000;
//==== 其它
public static final String ASC = "ASC";
public static final String DESC = "DESC";
public static final String PAGE = "page"; //返回给前端的分页数据参数名
}
8.controller方法
@GetMapping("/getList")
@ApiOperation(value="查询用户列表", notes="")
public CommonResponse<Object> getList(
@ApiParam(name="name", value="名称(模糊匹配),空表示不限。",defaultValue="超级") @RequestParam(required=false) String name,
@ApiParam(name="curPage", value="开始页数",defaultValue="1") @RequestParam(required=false) Integer curPage,
@ApiParam(name="limit", value="每页条数",defaultValue="5") @RequestParam(required=false) Integer limit,
@ApiParam(name="six", value="排序字段",defaultValue="createTime") @RequestParam(required=false) String six,
@ApiParam(name="order", value="排序方向",defaultValue="desc:降序,asc:升序") @RequestParam(required=false) String order
)
{
CommonResponse<Object> resp = new CommonResponse<Object>();
//分页参数
IPage<SupLogUserVO> resultPage = supLogService.getSupLogUser(name,six,order,curPage,limit);
resp.addData("data", resultPage.getRecords());
resp.addData("page", QueryPage.of(resultPage));
return resp;
}
9.swagger
入参:
出参:
10.sql表
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
`user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`login_name` varchar(50) NOT NULL COMMENT '登录名',
`password` varchar(100) NOT NULL COMMENT '登录密码 加密后的密码',
`salt` varchar(50) NOT NULL COMMENT '加密用的盐',
`type` int(11) NOT NULL DEFAULT '0' COMMENT '账户类别 999999=超级用户',
`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '账户状态 ≤0=禁用(0=冻结),>0=正常',
`check_status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '审核状态 ≤0=待审核,>0=审核通过',
`delete_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标志 0=未删除,1=已删除',
`name` varchar(10) NOT NULL COMMENT '姓名',
`sex` char(1) DEFAULT NULL COMMENT '性别 F=男,M=女',
`birthday` datetime DEFAULT NULL COMMENT '生日',
`id_card_num` varchar(50) DEFAULT NULL COMMENT '身份证号',
`mobile_phone` varchar(50) DEFAULT NULL COMMENT '手机号',
`email` varchar(50) DEFAULT NULL COMMENT '邮箱',
`dept_id` int(11) NOT NULL DEFAULT '1' COMMENT '所属部门',
`position` varchar(10) DEFAULT NULL COMMENT '职务',
`memo` varchar(50) DEFAULT NULL COMMENT '备注',
`create_user` int(11) DEFAULT NULL COMMENT '创建者 此记录的创建用户',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`user_id`),
UNIQUE KEY `login_name_UNI` (`login_name`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COMMENT='用户';
DROP TABLE IF EXISTS `sup_log`;
CREATE TABLE `sup_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`operation` varchar(50) NOT NULL COMMENT '操作',
`method` varchar(100) NOT NULL COMMENT '调用的方法',
`param` varchar(500) DEFAULT NULL COMMENT '参数',
`client_type` varchar(10) DEFAULT NULL COMMENT '客户端类型 见枚举定义',
`sys_id` varchar(50) DEFAULT NULL COMMENT '访问的业务系统 见枚举定义',
`ip` varchar(50) DEFAULT NULL COMMENT 'IP地址',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=utf8 COMMENT='系统访问日志 记录访问日志(只记录管理相关日志,其它日志仅记录到日志文件)';
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程学习网。
沃梦达教程
本文标题为:MybatisPlus中的多表条件排序查询
基础教程推荐
猜你喜欢
- Java文件管理操作的知识点整理 2023-05-19
- java基础知识之FileInputStream流的使用 2023-08-11
- java实现多人聊天系统 2023-05-19
- springboot自定义starter方法及注解实例 2023-03-31
- Java数据结构之对象比较详解 2023-03-07
- ConditionalOnProperty配置swagger不生效问题及解决 2023-01-02
- Java并发编程进阶之线程控制篇 2023-03-07
- Java实现查找文件和替换文件内容 2023-04-06
- Java实现线程插队的示例代码 2022-09-03
- JDK数组阻塞队列源码深入分析总结 2023-04-18