Mybatis:动态SQL分组查询

简介: Mybatis:动态SQL分组查询

目录

1.  实现思路

2. 代码实现

2.1  mapper

2.2 mapper 接口

2.3 Service层

AjaxResult对象

2.4 controller

2.5 测试



1.  实现思路

利用Mybatis 动态SQL 拼装Group By 语句,实现单个和多个字段分组


2. 代码实现

2.1  mapper

<!--分组查询证书信息列表-->
    <resultMap id="groupResultMap" type="java.util.Map">
        <result column="count(1)" property="num" jdbcType="VARCHAR"/>
        <result column="user_unit" jdbcType="VARCHAR" property="userUnit"/>
        <result column="train_cycle_zh" jdbcType="VARCHAR" property="trainCycleZh"/>
        <result column="train_cycle_en" jdbcType="VARCHAR" property="trainCycleEn"/>
        <result column="train_major_zh" jdbcType="VARCHAR" property="trainMajorZh"/>
        <result column="train_major_en" jdbcType="VARCHAR" property="trainMajorEn"/>
        <result column="certif_type" jdbcType="VARCHAR" property="certifType"/>
        <result column="certif_status" jdbcType="INTEGER" property="certifStatus"/>
    </resultMap>
    <select id="groupCetifInfoBySelective" parameterType="com.ruoyi.certif.domain.CertifInfoDO"
            resultMap="groupResultMap">
        SELECT COUNT(1),
        <trim suffixOverrides=",">
            <if test="userUnit != null">
                user_unit,
            </if>
            <if test="trainCycleZh != null">
                train_cycle_zh,
            </if>
            <if test="trainCycleEn != null">
                train_cycle_en,
            </if>
            <if test="trainMajorZh != null">
                train_major_zh,
            </if>
            <if test="trainMajorEn != null">
                train_major_en,
            </if>
            <if test="certifType != null">
                certif_type,
            </if>
            <if test="certifStatus != null">
                certif_status,
            </if>
        </trim>
        FROM certif_info GROUP BY
        <trim suffixOverrides=",">
            <if test="userUnit != null">
                user_unit,
            </if>
            <if test="trainCycleZh != null">
                train_cycle_zh,
            </if>
            <if test="trainCycleEn != null">
                train_cycle_en,
            </if>
            <if test="trainMajorZh != null">
                train_major_zh,
            </if>
            <if test="trainMajorEn != null">
                train_major_en,
            </if>
            <if test="certifType != null">
                certif_type,
            </if>
            <if test="certifStatus != null">
                certif_status,
            </if>
        </trim>
    </select>


2.2 mapper 接口

 /**
     * 分组查询证书信息列表
     * @param certifInfo
     * @return
     */
    public List<Map> groupCetifInfoBySelective(CertifInfoDO certifInfo);


2.3 Service层

public AjaxResult groupCetifInfo(CertifInfoDO certifInfo) {
        log.info("【分组查询证书信息】,参数:{}", certifInfo);
        if (Objects.isNull(certifInfo)) {
            log.error("【分组查询证书信息列表】参数缺失");
            AjaxResult.error("分组查询证书信息,参数缺失");
        }
        List<Map> maps = certifInfoMapper.groupCetifInfoBySelective(certifInfo);
        return AjaxResult.success(maps);
    }

AjaxResult对象

import java.util.HashMap;
import com.ruoyi.common.core.constant.HttpStatus;
import com.ruoyi.common.core.utils.StringUtils;
/**
 * 操作消息提醒
 * 
 */
public class AjaxResult extends HashMap<String, Object>
{
    private static final long serialVersionUID = 1L;
    /** 状态码 */
    public static final String CODE_TAG = "code";
    /** 返回内容 */
    public static final String MSG_TAG = "msg";
    /** 数据对象 */
    public static final String DATA_TAG = "data";
    /**
     * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。
     */
    public AjaxResult()
    {
    }
    /**
     * 初始化一个新创建的 AjaxResult 对象
     * 
     * @param code 状态码
     * @param msg 返回内容
     */
    public AjaxResult(int code, String msg)
    {
        super.put(CODE_TAG, code);
        super.put(MSG_TAG, msg);
    }
    /**
     * 初始化一个新创建的 AjaxResult 对象
     * 
     * @param code 状态码
     * @param msg 返回内容
     * @param data 数据对象
     */
    public AjaxResult(int code, String msg, Object data)
    {
        super.put(CODE_TAG, code);
        super.put(MSG_TAG, msg);
        if (StringUtils.isNotNull(data))
        {
            super.put(DATA_TAG, data);
        }
    }
    /**
     * 返回成功消息
     * 
     * @return 成功消息
     */
    public static AjaxResult success()
    {
        return AjaxResult.success("操作成功");
    }
    /**
     * 返回成功数据
     * 
     * @return 成功消息
     */
    public static AjaxResult success(Object data)
    {
        return AjaxResult.success("操作成功", data);
    }
    /**
     * 返回成功消息
     * 
     * @param msg 返回内容
     * @return 成功消息
     */
    public static AjaxResult success(String msg)
    {
        return AjaxResult.success(msg, null);
    }
    /**
     * 返回成功消息
     * 
     * @param msg 返回内容
     * @param data 数据对象
     * @return 成功消息
     */
    public static AjaxResult success(String msg, Object data)
    {
        return new AjaxResult(HttpStatus.SUCCESS, msg, data);
    }
    /**
     * 返回错误消息
     * 
     * @return
     */
    public static AjaxResult error()
    {
        return AjaxResult.error("操作失败");
    }
    /**
     * 返回错误消息
     * 
     * @param msg 返回内容
     * @return 警告消息
     */
    public static AjaxResult error(String msg)
    {
        return AjaxResult.error(msg, null);
    }
    /**
     * 返回错误消息
     * 
     * @param msg 返回内容
     * @param data 数据对象
     * @return 警告消息
     */
    public static AjaxResult error(String msg, Object data)
    {
        return new AjaxResult(HttpStatus.ERROR, msg, data);
    }
    /**
     * 返回错误消息
     * 
     * @param code 状态码
     * @param msg 返回内容
     * @return 警告消息
     */
    public static AjaxResult error(int code, String msg)
    {
        return new AjaxResult(code, msg, null);
    }
}


2.4 controller

    /**
     * 分组查询证书信息列表
     */
    @GetMapping("/statis")
    public AjaxResult listGroup(CertifInfoDO certifInfo) {
        AjaxResult result = certifInfoService.groupCetifInfo(certifInfo);
        return result;
    }


2.5 测试

http://localhost:8081/certif/info/statis?trainMajorZh=GROUP   【中文专业分组】
http://localhost:8081/certif/info/statis?userUnit=GROUP   【用户单位分组】
http://localhost:8081/certif/info/statis?certifType=GROUP   【证书类型分组】
http://localhost:8081/certif/info/statis?certifStatus=GROUP   【证书状态分组】


相关文章
|
7月前
|
SQL 监控 关系型数据库
一键开启百倍加速!RDS DuckDB 黑科技让SQL查询速度最高提升200倍
RDS MySQL DuckDB分析实例结合事务处理与实时分析能力,显著提升SQL查询性能,最高可达200倍,兼容MySQL语法,无需额外学习成本。
|
7月前
|
SQL 存储 关系型数据库
MySQL体系结构详解:一条SQL查询的旅程
本文深入解析MySQL内部架构,从SQL查询的执行流程到性能优化技巧,涵盖连接建立、查询处理、执行阶段及存储引擎工作机制,帮助开发者理解MySQL运行原理并提升数据库性能。
|
11月前
|
SQL 数据挖掘 数据库
第三篇:高级 SQL 查询与多表操作
本文深入讲解高级SQL查询技巧,涵盖多表JOIN操作、聚合函数、分组查询、子查询及视图索引等内容。适合已掌握基础SQL的学习者,通过实例解析INNER/LEFT/RIGHT/FULL JOIN用法,以及COUNT/SUM/AVG等聚合函数的应用。同时探讨复杂WHERE条件、子查询嵌套,并介绍视图简化查询与索引优化性能的方法。最后提供实践建议与学习资源,助你提升SQL技能以应对实际数据处理需求。
773 1
|
7月前
|
SQL 监控 关系型数据库
SQL优化技巧:让MySQL查询快人一步
本文深入解析了MySQL查询优化的核心技巧,涵盖索引设计、查询重写、分页优化、批量操作、数据类型优化及性能监控等方面,帮助开发者显著提升数据库性能,解决慢查询问题,适用于高并发与大数据场景。
|
SQL Java 数据库连接
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
|
8月前
|
SQL XML Java
通过MyBatis的XML配置实现灵活的动态SQL查询
总结而言,通过MyBatis的XML配置实现灵活的动态SQL查询,可以让开发者以声明式的方式构建SQL语句,既保证了SQL操作的灵活性,又简化了代码的复杂度。这种方式可以显著提高数据库操作的效率和代码的可维护性。
475 18
|
12月前
|
SQL Java 数据库连接
MyBatis动态SQL字符串空值判断,这个细节99%的程序员都踩过坑!
本文深入探讨了MyBatis动态SQL中字符串参数判空的常见问题。通过具体案例分析,对比了`name != null and name != &#39;&#39;`与`name != null and name != &#39; &#39;`两种写法的差异,指出后者可能引发逻辑混乱。为避免此类问题,建议在后端对参数进行预处理(如trim去空格),简化MyBatis判断逻辑,提升代码健壮性与可维护性。细节决定成败,严谨处理参数判空是写出高质量代码的关键。
1563 0
|
6月前
|
SQL 关系型数据库 MySQL
(SQL)SQL语言中的查询语句整理
查询语句在sql中占了挺大一部分篇幅,因为在数据库中使用查询语句的次数远多于更新与删除命令。而查询语句比起其他语句要更加的复杂,可因为sql是数据库不可或缺的一部分,所以即使不懂,也必须得弄懂,以上。
349 0
|
9月前
|
SQL XML Java
MyBatis Mapper中使用limit参数的查询问题
总结而言,MyBatis中使用 `limit`参数的查询可以高度定制并且灵活,基于方法签名和XML映射文件的组合来达成多样化的查询需求。通过参数化查询和动态SQL,MyBatis可以有效地处理各种复杂情境下的数据库操作,并且将SQL语句的维护与业务代码的编写相分离,提升代码的可维护性和可阅读性。
744 13
|
8月前
|
SQL Java 数据库连接
SSM相关问题-1--#{}和${}有什么区别吗?--Mybatis都有哪些动态sql?能简述一下动 态sql的执行原理吗?--Spring支持的几种bean的作用域 Scope
在MyBatis中,`#{}`是预处理占位符,可防止SQL注入,适用于大多数参数传递场景;而`${}`是直接字符串替换,不安全,仅用于动态表名、列名等特殊场景。二者在安全性、性能及使用场景上有显著区别。
305 0