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   【证书状态分组】


目录
相关文章
|
4天前
|
SQL 运维 监控
SQL查询太慢?实战讲解YashanDB SQL调优思路
本文是Meetup第十期“调优实战专场”的第二篇技术文章,上一篇《高效查询秘诀,解码YashanDB优化器分组查询优化手段》中,我们揭秘了YashanDB分组查询优化秘诀,本文将通过一个案例,助你快速上手YashanDB慢日志功能,精准定位“慢SQL”后进行优化。
|
1天前
|
SQL 大数据 数据挖掘
玩转大数据:从零开始掌握SQL查询基础
玩转大数据:从零开始掌握SQL查询基础
63 35
|
2月前
|
SQL 安全 数据库
如何在Django中正确使用参数化查询或ORM来避免SQL注入漏洞?
如何在Django中正确使用参数化查询或ORM来避免SQL注入漏洞?
175 77
|
21天前
|
SQL 关系型数据库 分布式数据库
利用 PolarDB PG 版向量化引擎,加速复杂 SQL 查询!完成任务领发财新年抱枕!
利用 PolarDB PG 版向量化引擎,加速复杂 SQL 查询!完成任务领发财新年抱枕!
|
11天前
|
SQL XML Java
九、MyBatis动态SQL
九、MyBatis动态SQL
22 2
|
12天前
|
SQL 关系型数据库 OLAP
云原生数据仓库AnalyticDB PostgreSQL同一个SQL可以实现向量索引、全文索引GIN、普通索引BTREE混合查询,简化业务实现逻辑、提升查询性能
本文档介绍了如何在AnalyticDB for PostgreSQL中创建表、向量索引及混合检索的实现步骤。主要内容包括:创建`articles`表并设置向量存储格式,创建ANN向量索引,为表增加`username`和`time`列,建立BTREE索引和GIN全文检索索引,并展示了查询结果。参考文档提供了详细的SQL语句和配置说明。
29 1
|
1天前
|
SQL 索引
【YashanDB知识库】字段加上索引后,SQL查询不到结果
【YashanDB知识库】字段加上索引后,SQL查询不到结果
|
7天前
|
SQL XML Java
六、MyBatis特殊的SQL:模糊查询、动态设置表名、校验名称唯一性
六、MyBatis特殊的SQL:模糊查询、动态设置表名、校验名称唯一性
24 0
|
2月前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过MongoDB Atlas Data Lake或Apache Drill,可以在Java中使用SQL语法查询MongoDB数据。这两种方法都需要适当的配置和依赖库的支持。希望本文提供的示例和说明能够帮助开发者实现这一目标。
61 17
|
2月前
|
XML Java 数据库连接
Mybatis一对一,一对多关联查询
## MyBatis一对一、一对多关联查询详解 MyBatis是一款优秀的持久层框架,提供了灵活的SQL映射功能,支持复杂的数据库操作。本文将详细介绍MyBatis中一对一和一对多关联查询的实现。 ### 一对一关联查询 一对一关联关系指的是一个表中的一条记录与另一个表中的一条记录相关联。例如,一个用户有一个地址信息。 #### 数据库表设计 假设有两个表:`user`和 `address`。 ``` CREATE TABLE user ( id INT PRIMARY KEY, name VARCHAR(50) ); CREATE TABLE address
53 18