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的多条件.动态查询更加容易.简洁.直观. ...
随机推荐
- python OS模块 对操作系统接口调用
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径os.chdir("dirname") 改变当前脚本工作目录:相当于shell下cdos.curdir ...
- 阅读之web应用安全
一.三种坏人与servlet安全 认证可以防止“假冒者”攻击,授权可以防止“非法升级者”攻击,机密性和数据完整性可以防止“窃听者”攻击. 二.认证与授权 Web容器进行认证与授权的过程: 客户端:浏览 ...
- 基于LVM 测试磁盘写性能.md
准备工作 /dev/sdb 创建一个卷组,基于卷组创建5个逻辑卷,各100G 在10.10.88.214 新建5台虚拟机,每台虚拟机用到lvm建的逻辑卷 dd 压测 在每台虚拟机上执行dd 命令: d ...
- C# List分组
//分组 8个为一组 List<List<string>> ArrayList = sArray.Select((x, i) => new { Index = i, Va ...
- Eclips的JDK更换为1.8
1.Window—Preferences—Java—Compiler—右侧面板设置为1.6 2.Window—Preferences—Java—Installed JREs—右侧面板“Add”本地的1 ...
- noi.ac #543 商店
我们考虑可并堆维护,从深到浅贪心选取. 用priority_queue启发式合并的话,是60pts: #include<iostream> #include<cstdio> # ...
- 灰度图像--图像分割 阈值处理之OTSU阈值
学习DIP第55天 转载请标明本文出处:***http://blog.csdn.net/tonyshengtan ***,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发:http ...
- Linux之防火墙iptables
一.检查iptables服务状态 1.首先检查iptables服务的状态 [root@bogon ~]# service iptables status iptables: Firewall is n ...
- echarts的渲染问题
问题:柱状图的图例和柱状图颜色在IE10和IE11中拖动时间轴的时候图例和柱状图颜色会发生改变 echarts的渲染是从setOption中开始的,不是从echarts.init()开始 initPa ...
- docker安装中文版Gitlab服务端
1.pull中文版镜像: docker pull beginor/gitlab-ce:11.3.0-ce.0 2.创建目录: 通常会将 GitLab 的配置 (etc) . 日志 (log) .数据 ...