首页 > 数据库 >mybaties-plus使用@SelectProvider实现动态SQL

mybaties-plus使用@SelectProvider实现动态SQL

时间:2024-09-09 17:52:15浏览次数:12  
标签:mybaties selectByDynamicSql SQL List params table plus null columns

mybaties-plus使用@SelectProvider实现动态SQL

新建DynamicSqlProvider.java类

package com.muphy.mapper;

import org.apache.ibatis.jdbc.SQL;

import java.util.*;

public class DynamicSqlProvider {

    public String buildSelectSql(Map<String, Object> params) {
        // 注意:这里的参数名需要与Mapper接口中的@Param注解匹配
        String table = (String) params.get("table");
        List<String> columns = (List<String>) params.get("columns");
        Map<String, Object> queryParams = (Map<String, Object>) params.get("params");
        List<String> orders = (List<String>) params.get("orders");
        // 使用StringBuilder或SQL类构建SQL查询
        // 这里为了简化,直接使用StringBuilder
        SQL sql = new SQL();
        if (columns == null || columns.isEmpty()) {
            sql.SELECT("*");
        } else {
            sql.SELECT(String.join(",", columns));
        }
        sql.FROM(table);
        if (queryParams != null && !queryParams.isEmpty()) {
            StringBuilder conditionBuilder = new StringBuilder();
            for (Map.Entry<String, Object> entry : queryParams.entrySet()) {
                String key = entry.getKey();
                Object value = entry.getValue();
                if (conditionBuilder.length() > 0) {
                    conditionBuilder.append(" AND ");
                }
                if (value == null) {
                    conditionBuilder.append(" is null or ").append(key).append(" = ''");
                } else {
                    // 这里假设我们使用 = 来进行比较,你可以根据实际需要调整
                    conditionBuilder.append(key).append(" = #{params.").append(key).append("}");
                }
            }
            sql.WHERE(conditionBuilder.toString());
        }
        if (orders != null && !orders.isEmpty()) {
            sql.ORDER_BY(String.join(",", orders));
        }
        return sql.toString();
    }

}

在mapper类中扩展方法

public interface TestMapper extends BaseMapper<TestEntity> {


    default List<Map<String, Object>> selectByDynamicSql(String table) {
        return selectByDynamicSql(table, null, null, null);
    }

    default List<Map<String, Object>> selectByDynamicSql(String table, List<String> columns) {
        return selectByDynamicSql(table, columns, null, null);
    }

    default List<Map<String, Object>> selectByDynamicSql(String table, Map<String, Object> queryParams) {
        return selectByDynamicSql(table, null, queryParams, null);
    }

    default List<Map<String, Object>> selectByDynamicSql(String table, Map<String, Object> queryParams, List<String> orders) {
        return selectByDynamicSql(table, null, queryParams, orders);
    }

    default List<Map<String, Object>> selectByDynamicSql(String table, List<String> columns, Map<String, Object> queryParams) {
//        return selectBy(table, columns, queryParams, null);
        return selectByDynamicSql(table, columns, queryParams, null);
    }

    default List<Map<String, Object>> selectByDynamicSql(String table, List<String> columns, Map<String, Object> queryParams, List<String> orders) {
        Map<String, Object> params = new HashMap<>();
        params.put("table", table);
        params.put("columns", columns);
        params.put("params", queryParams);
        params.put("orders", orders);
        return selectByDynamicSql(params);
    }

    @SelectProvider(type = DynamicSqlProvider.class, method = "buildSelectSql")
    List<Map<String, Object>> selectByDynamicSql(Map<String, Object> params);
}

使用

        Map<String, Object> params = new HashMap<>();  
        params.put("table", "users");  
        params.put("columns", Arrays.asList("id", "name", "email"));  
        Map<String, Object> where = new HashMap<>();  
        where.put("id", 1);  
        where.put("name", "John Doe");  
        params.put("params", where);  
        params.put("orders", Arrays.asList("id DESC"));  

        List<Map<String, Object>> maps = baseMapper.selectByDynamicSql(themeTable.getTableName(), columns, queryParams);

标签:mybaties,selectByDynamicSql,SQL,List,params,table,plus,null,columns
From: https://www.cnblogs.com/muphy/p/18405014

相关文章

  • SQL SERVER -- JSON处理
    --JSON 字符串转 行记录Declare@JsonStrNvarchar(Max)='[{"State":0,"Name":"语文","ReMark":"了解国学信息","RepDtl":[{"ID":1,"Age":11},{"ID":2,"Age":12},{"ID&quo......
  • CentOS卸载MySQL
    查看MySQL状态systemctlstatusmysqld2.如果MySQL处于启动状态,则停止MySQLsystemctlstopmysqld3.取消开机自启动systemctldisablemysqld4.查找已安装的MySQL包rpm-qa|grep-imysql#或yumlistinstalled|grep-imysqlmysql-community-client.x86_64......
  • MySQL 触发器
    本篇文章介绍了触发器的概念以及为什么使用触发器,触发器的类型和何时执行它们;列举了INSERT、DELETE和UPDATE操作的触发器示例。目录MySQL触发器应用场景创建触发器创建规则创建语法创建示例注意事项删除触发器使用触发器INSERT触发器确定新生成值测试触发器DE......
  • mysql 如何开启 binlog
    mysql如何开启binlog在MySQL中开启二进制日志(binlog)通常涉及修改MySQL的配置文件(通常是my.cnf或my.ini),并重启MySQL服务。以下是开启binlog的步骤:修改配置文件:打开MySQL的主配置文件my.cnf(Linux系统通常位于/etc/mysql/目录下,Windows系统可能位于MySQL安装目录下)。在[mysqld......
  • java连接MySQL
    一.下载驱动包java通过JDBC(JavaDatabaseConnectivity)包连接数据库<dependency>  <groupId>com.mysql</groupId>  <artifactId>mysql-connector-j</artifactId>  <version>9.0.0</version></dependency>二.配置数据源(数据库的信息) ......
  • 从管控角度谈慢SQL治理
    一、什么是慢SQL慢SQL是指那些执行效率低下、响应时间长,导致用户等待时间变长和服务器资源利用率下降的SQL查询。那么,如何定义一个SQL查询是"慢"的呢?这不是一个绝对时间的问题,而是需要从多维度考量。时间维度最常见的定义慢SQL的方法是时间阈值。这个阈值可以根据不同的系统和......
  • 20240909_155524 mysql 三种变量
    什么是变量标识数据的标识符,就是变量变量是标识数据的mysql中的三种变量系统变量自定义变量局部变量系统变量查看所有系统变量showvariables;根据系统变量名查看它的值select@@系统变量名select@@autocommit修改系统变量的值set系统变量名=值setautocommit......
  • 20240904_192638 mysql 填空题 存储过程进阶
    定义一个存储过程的形参,它接收数据,参数名为id,为int类型inidint定义一个存储过程的形参,它返回数据,参数名为name,是varchar(5)类型outnamevarchar(5)定义一个存储过程的形参,它一边接收数据一边返回数据,参数名为num,是int类型inoutnumint声明一个名为info的游标,保存查询teac......
  • centos7.9安装mysql8.0.39
    1.添加MySQLYum仓库首先,需要下载并安装MySQLYum仓库RPM包:sudorpm-Uvhhttps://repo.mysql.com/mysql80-community-release-el7-3.noarch.rpm2.更新Yum缓存安装完Yum仓库后,更新Yum缓存:sudoyumcleanallsudoyummakecache3.安装MySQL 现在可以......
  • mybatis plus 常用知识汇总(保姆级教程!~)
    介绍:MyBatis-Plus是基于MyBatis框架的一个增强工具,主要目的是简化MyBatis的开发过程,提供更加简洁、方便的CRUD操作。它是在保留MyBatis强大功能的基础上,通过封装和优化一些常见操作来提高开发效率。MyBatis-Plus提供了许多开箱即用的功能,包括自动CRUD代码生成、分页......