springboot后端实现条件查询,要配合使用mybatis
package cn.com.dyg.work.sqlgen; import cn.com.dyg.work.common.exception.DefException;
import cn.com.dyg.work.common.utils.CamelAndUnderLineConverter;
import com.alibaba.fastjson.JSONArray;
import org.apache.ibatis.jdbc.SQL;
import org.springframework.util.StringUtils; import java.util.List;
import java.util.Map; /**
* 多种方式查询,根据前台传送的json来拼接sql语句,使查询更加灵活。
*/
public class ActivityAppSqlGenerator {
/**
* 根据mp里面的条件来查询活动申请数据
*
* @param mp 条件
* @return 活动申请sql
*/
public String queryActivityAppData(final Map<String, Object> mp) {
Boolean flag = (Boolean) mp.get("flag");
SQL sql = new SQL() {
{
if (flag)
SELECT(" app.* ");
else
SELECT("count(*)");
FROM("crm_academic_activity_app app");
LEFT_OUTER_JOIN(" crm_flowinfo info on app.id=info.pk_src and IFNULL(info.dr,0)=0 "); JSONArray jsonArray = (JSONArray) mp.get("jsonArray");
if (jsonArray != null)
for (int i = 0; i < jsonArray.size(); i++) {
Object item = jsonArray.get(i);
@SuppressWarnings("unchecked") Map<String, Object> map = (Map<String, Object>) item;
if (map.size() != 3)
throw new DefException("查询条件有问题。");
String column = (String) map.get("column");
if (StringUtils.isEmpty(column))
throw new DefException("column不可以为空。");
String fieldName;
if ("status".equalsIgnoreCase(column))
fieldName = "IFNULL(info.status,1)";
else
fieldName = "app." + CamelAndUnderLineConverter.humpToLine2(column);
String opt = ((String) map.get("opt")).toLowerCase().trim();
switch (opt) {
case "<":
case ">":
case "=":
case "<=":
case ">=":
WHERE(fieldName + " " + opt + " #{ jsonArray[" + i + "].value} ");
break;
case "like":
WHERE(fieldName + " " + opt + " concat('%',#{jsonArray[" + i + "].value},'%') ");
break;
case "order":
String value = (String) map.get("value");
String suffix = "desc";
if (!StringUtils.isEmpty(value) && value.startsWith("asc"))
suffix = "asc"; ORDER_BY(fieldName + " " + suffix);
break;
case "in":
WHERE(fieldName + " in (" + getInSql((List) map.get("value"), i) + ")");
break;
case "between":
WHERE(fieldName + " between #{jsonArray[" + i + "].value[0]} and #{jsonArray[" + i + "].value[1]} ");
break;
default:
throw new DefException("查询条件有问题。");
}
}
WHERE("app.dr=0");
ORDER_BY("app.ts desc ");
}
};
if (flag)
return sql.toString() + " limit #{pageindex},#{pagenum} ";
else
return sql.toString();
} /**
* 拼接in查询条件
*
* @param ls 集合
* @param i 当前条件所处的位置
* @return 查询条件
*/
private String getInSql(List ls, int i) {
if (ls == null || ls.size() == 0)
return "('')";
StringBuilder sb = new StringBuilder();
int c = 0;
for (Object ignored : ls) {
sb.append("#{jsonArray[").append(i).append("].value[").append(c++).append("]}");
sb.append(",");
}
return (sb.substring(0, sb.length() - 1));
}
}
mybatis,使用provider来读取传入的参数构造查询语句
1 @SelectProvider(type = ActivityAppSqlGenerator.class, method = "queryActivityAppData")
List<ActivityAppDO> selectAll(@Param("pageindex") Integer pageindex, @Param("pagenum") Integer pagenum,
@Param("jsonArray") JSONArray jsonArray, @Param("flag") Boolean flag);
springboot后端实现条件查询,要配合使用mybatis的更多相关文章
- springboot jpa 多条件查询(多表)
前几天写的,贴上来. 实体类. package com.syl.demo.daomain; import lombok.Data; import javax.persistence.*; /** * ...
- springboot jpa 多条件查询(单表)
需要实现的功能: 多个搜索输入框:全部不填,则查出所有列表:填了条件,就按条件查找:填的条件个数不定. 方法实现的核心:jpa自带的Specification<T> (目前只需要单表,多表 ...
- SSM整合 mybatis多条件查询与分页
多条件查询与分页: 通过页面的houseName.floorage获取值传到前端视图(HouseSearchVO)实体类中的houseName,floorage建立houseSearchVO对象. 通 ...
- mybatis的mapper特殊字符转移以及动态SQL条件查询
前言 我们知道在项目开发中之前使用数据库查询,都是基于jdbc,进行连接查询,然后是高级一点jdbcTemplate进行查询,但是我们发现还是不是很方便,有大量重复sql语句,与代码偶合,效率低下,于 ...
- Mybatis多条件查询
在Mybatis多条件查询中: 1.参数如果是多条件,则需要将将添加到Map集合中进行传入. 2.就是将其参数用有序数字进行代替. Mybatis单个String类型参数传递 mysql文如下,传入参 ...
- SSM-MyBatis-13:Mybatis中多条件查询
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 实体类 public class Book { private Integer bookID; private ...
- mybatis按datetime条件查询,参数为时间戳时
mybatis按datetime条件查询,参数为时间戳时,如果数据库为2018-1-1 20:22:10, 你的时间戳也为2018-1-1 20:22:10,但却没找到数据.可能是时差导致的.百度修正 ...
- Mybatis中动态SQL多条件查询
Mybatis中动态SQL多条件查询 mybatis中用于实现动态SQL的元素有: if:用if实现条件的选择,用于定义where的字句的条件. choose(when otherwise)相当于Ja ...
- MyBatis中动态SQL语句完成多条件查询
一看这标题,我都感觉到是mybatis在动态SQL语句中的多条件查询是多么的强大,不仅让我们用SQL语句完成了对数据库的操作:还通过一些条件选择语句让我们SQL的多条件.动态查询更加容易.简洁.直观. ...
随机推荐
- 对bloom的理解 及优化
varying uv放到vs 讲下bloom的细节 上图这种做法 temporally stable box filtering up 的时候 需要filter 上述upscale有两张srv dow ...
- mysql 查看删除触发器等操作
mysql 查看删除触发器等操作 平时很少操作触发器,源于昨晚的一次故障,使用pt-online-change-schema修改大表过程中出现异常,再次执行时,提示已经存在触发器,导致失败. 这里推荐 ...
- JVM(七),JVM面试小知识
七.JVM面试小知识 1.JVM三大性能调优参数 -Xms -Xmx -Xss 的含义 2.java内存模型中堆和栈的区别 3.不同JDK版本中的intern()方法的区别
- 在Windows下编译扩展OpenCV 3.1.0 + opencv_contrib 及一些问题
一.准备工作: 1.下载OpenCV安装包:https://github.com/opencv/opencv 安装过程实际上就是解压过程,安装完成后得到(这里修改了文件名): 2.下载opencv_c ...
- 数据分析师面经一(bk)
2019年第一个数据分析面试: 先说一下心理感受,在BOSS多次看到这个岗位了,但是 呢一直没勇气去投这个岗位.首先毕竟是一个知名企业一万+人的公司,心里多少底气不足(小公司待习惯了吧),而且看岗位要 ...
- 【java】获取项目资源路径
目资源路径分两种,一种是普通Java项目的资源路径,另一种是JavaEE项目的资源路径. 获取Java项目的包(源码下的包 或者 jar包)的资源路径 // 方法1:通过this.getClass() ...
- C# WebServices 客户端服务端
一.编写一个WebService 开发环境:VS2012 1.编写webservice阶段 打开VS2012,新建一个空的web应用程序,我这里用的Framework版本是4.5的 新建好web应用程 ...
- redis远程连接命令
redis-cli -h 172.17.0.85 -p 6379 输入密码 auth "1234
- kafka 性能测试脚本
[参考文章]:Kafka自带的性能测试脚本 1. 生产消息压测脚本 1.1 脚本及参数 bin/kafka-producer-perf-test.sh --topic kafka-test-0 -- ...
- 8 Linux 文件类型
Linux 系统中的文件是没有扩展名的. 1.通过 ls -l 文件名,看第一个字符判断文件类型: - 普通文件(文本文件.二进制文件.压缩文件.电影.图片等) d 目录文件 b 设备文件(块设 ...