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='系统访问日志 记录访问日志(只记录管理相关日志,其它日志仅记录到日志文件)';

以上为个人经验,希望能给大家一个参考,也希望大家多多支持Devmax。

MybatisPlus中的多表条件排序查询的更多相关文章

  1. MybatisPlus中的多表条件排序查询

    这篇文章主要介绍了MybatisPlus中的多表条件排序查询,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  2. MybatisPlus如何处理Mysql的json类型

    这篇文章主要介绍了MybatisPlus如何处理Mysql的json类型,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. Mybatis详解动态SQL以及单表多表查询的应用

    MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,下面这篇文章主要给大家介绍了关于Mybatis超级强大的动态SQL语句的相关资料,需要的朋友可以参考下

  4. Java @Transactional指定回滚条件

    这篇文章主要介绍了Java @Transactional指定回滚条件,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下

  5. Spring Boot自动配置的原理及@Conditional条件注解

    这篇文章主要介绍了Spring Boot自动配置的原理及@Conditional条件注解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的朋友可以参考一下

  6. MybatisPlus保存、读取MySQL中的json字段失败问题及解决

    这篇文章主要介绍了MybatisPlus保存、读取MySQL中的json字段失败问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. MyBatisPlus TypeHandler自定义字段类型转换Handler

    这篇文章主要为大家介绍了MyBatisPlus TypeHandler自定义字段类型转换Handler示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  8. JavaScript中的条件判断语句使用详解

    这篇文章主要介绍了JavaScript中的条件判断语句使用详解,是JS入门学习中的基础知识,需要的朋友可以参考下

  9. MyBatis 多表联合查询及优化方法

    大家都知道Hibernate 是全自动的数据库持久层框架,它可以通过实体来映射数据库,通过设置一对多、多对一、一对一、多对多的关联来实现联合查询,接下来通过本文给大家介绍MyBatis 多表联合查询及优化,需要的朋友可以参考下

  10. MyBatisPlus+Lombok实现分页功能的方法详解

    Lombok是一个Java类库,提供了一组注解,简化POJO实体类开发。本文将为大家介绍一下Lombok的使用以及如何利用MyBatisPlus+Lombok实现分页功能,感兴趣的可以动手尝试一下

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部