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的更多相关文章

  1. springboot jpa 多条件查询(多表)

    前几天写的,贴上来. 实体类. package com.syl.demo.daomain; import lombok.Data; import javax.persistence.*; /** * ...

  2. springboot jpa 多条件查询(单表)

    需要实现的功能: 多个搜索输入框:全部不填,则查出所有列表:填了条件,就按条件查找:填的条件个数不定. 方法实现的核心:jpa自带的Specification<T> (目前只需要单表,多表 ...

  3. SSM整合 mybatis多条件查询与分页

    多条件查询与分页: 通过页面的houseName.floorage获取值传到前端视图(HouseSearchVO)实体类中的houseName,floorage建立houseSearchVO对象. 通 ...

  4. mybatis的mapper特殊字符转移以及动态SQL条件查询

    前言 我们知道在项目开发中之前使用数据库查询,都是基于jdbc,进行连接查询,然后是高级一点jdbcTemplate进行查询,但是我们发现还是不是很方便,有大量重复sql语句,与代码偶合,效率低下,于 ...

  5. Mybatis多条件查询

    在Mybatis多条件查询中: 1.参数如果是多条件,则需要将将添加到Map集合中进行传入. 2.就是将其参数用有序数字进行代替. Mybatis单个String类型参数传递 mysql文如下,传入参 ...

  6. SSM-MyBatis-13:Mybatis中多条件查询

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 实体类 public class Book { private Integer bookID; private ...

  7. mybatis按datetime条件查询,参数为时间戳时

    mybatis按datetime条件查询,参数为时间戳时,如果数据库为2018-1-1 20:22:10, 你的时间戳也为2018-1-1 20:22:10,但却没找到数据.可能是时差导致的.百度修正 ...

  8. Mybatis中动态SQL多条件查询

    Mybatis中动态SQL多条件查询 mybatis中用于实现动态SQL的元素有: if:用if实现条件的选择,用于定义where的字句的条件. choose(when otherwise)相当于Ja ...

  9. MyBatis中动态SQL语句完成多条件查询

    一看这标题,我都感觉到是mybatis在动态SQL语句中的多条件查询是多么的强大,不仅让我们用SQL语句完成了对数据库的操作:还通过一些条件选择语句让我们SQL的多条件.动态查询更加容易.简洁.直观. ...

随机推荐

  1. u-boot DM初始化流程

    initr_dm dm_init_and_scan dm_init  ((1)创建根设备root的udevice,存放在gd->dm_root中 (2)初始化uclass链表gd->ucl ...

  2. linux 发送 post 请求

    curl -H "Content-type: application/json" -X POST -d '{"accoId":"IDAP_000000 ...

  3. easypoi 版本依赖关系

    <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactI ...

  4. Java-FileUploadUtil工具类

    package com.gootrip.util; import java.io.File; import java.util.*; import org.apache.commons.fileupl ...

  5. Spring Boot 中初始化资源的几种方式(转)

    假设有这么一个需求,要求在项目启动过程中,完成线程池的初始化,加密证书加载等功能,你会怎么做?如果没想好答案,请接着往下看.今天介绍几种在Spring Boot中进行资源初始化的方式,帮助大家解决和回 ...

  6. jpa单向一对多

    单向一对多是一个类中的一条记录可对应另一个类的多条记录: 比如一个部门可对应多个员工:   jpa中的实现步骤:     one-to-many的one类中添加一个many类类型的set;比如部门类D ...

  7. hdu 5761 Rower Bo 微分方程

    Rower Bo Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total ...

  8. Qbxt 模拟赛&&day-8

    /* 今天的题目还是比较不错的. 今天考的很烂还是依旧的弱. 快考试了加油吧. Bless all. */ 注:所有题目的时间限制均为 1s,内存限制均为 256MB. 1.第K小数 (number. ...

  9. 深度学习笔记(十四)车道线检测 SCNN

    论文:Spatial As Deep: Spatial CNN for Traffic Scene Understanding 代码:https://github.com/XingangPan/SCN ...

  10. 大体知道java语法2----------理解面向对象

    我参加过大大小小n场面试,被好几位面试官问到过:能不能谈谈面向对象的几大特征?什么是面向对象?对于这两个问题,我始终觉得一定要理解,其实不只是这种概念题(姑且算它是概念题吧),包括各种语法都应该去理解 ...