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


目录
相关文章
|
1月前
|
SQL 安全 数据库
如何在Django中正确使用参数化查询或ORM来避免SQL注入漏洞?
如何在Django中正确使用参数化查询或ORM来避免SQL注入漏洞?
141 77
|
26天前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过MongoDB Atlas Data Lake或Apache Drill,可以在Java中使用SQL语法查询MongoDB数据。这两种方法都需要适当的配置和依赖库的支持。希望本文提供的示例和说明能够帮助开发者实现这一目标。
45 17
|
30天前
|
XML Java 数据库连接
Mybatis一对一,一对多关联查询
## MyBatis一对一、一对多关联查询详解 MyBatis是一款优秀的持久层框架,提供了灵活的SQL映射功能,支持复杂的数据库操作。本文将详细介绍MyBatis中一对一和一对多关联查询的实现。 ### 一对一关联查询 一对一关联关系指的是一个表中的一条记录与另一个表中的一条记录相关联。例如,一个用户有一个地址信息。 #### 数据库表设计 假设有两个表:`user`和 `address`。 ``` CREATE TABLE user ( id INT PRIMARY KEY, name VARCHAR(50) ); CREATE TABLE address
36 18
|
21天前
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
28天前
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
91 6
|
2月前
|
SQL 存储 人工智能
Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询
Vanna 是一个开源的 Python RAG(Retrieval-Augmented Generation)框架,能够基于大型语言模型(LLMs)为数据库生成精确的 SQL 查询。Vanna 支持多种 LLMs、向量数据库和 SQL 数据库,提供高准确性查询,同时确保数据库内容安全私密,不外泄。
379 7
Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询
|
2月前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过使用 MongoDB Connector for BI 和 JDBC,开发者可以在 Java 中使用 SQL 语法查询 MongoDB 数据库。这种方法对于熟悉 SQL 的团队非常有帮助,能够快速实现对 MongoDB 数据的操作。同时,也需要注意到这种方法的性能和功能限制,根据具体应用场景进行选择和优化。
109 9
|
2月前
|
SQL XML Java
mybatis实现动态sql
MyBatis的动态SQL功能为开发人员提供了强大的工具来应对复杂的查询需求。通过使用 `<if>`、`<choose>`、`<foreach>`等标签,可以根据不同的条件动态生成SQL语句,从而提高代码的灵活性和可维护性。本文详细介绍了动态SQL的基本用法和实际应用示例,希望对您在实际项目中使用MyBatis有所帮助。
102 11
|
2月前
|
XML Java 数据库连接
Mybatis实现RBAC权限模型查询
通过对RBAC权限模型的理解和MyBatis的灵活使用,我们可以高效地实现复杂的权限管理功能,为应用程序的安全性和可维护性提供有力支持。
73 5
|
3月前
|
SQL Java
使用java在未知表字段情况下通过sql查询信息
使用java在未知表字段情况下通过sql查询信息
54 8