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. Tomcat启动中文乱码,淇℃伅等

    打开Tomcat根目录下的conf文件夹,打开logging.properties. 把 java.util.logging.ConsoleHandler.encoding = UTF-8 换成 ja ...

  2. ZJOI2013 K大数查询 和 LG3380【模板】二逼平衡树(树套树)

    K大数查询 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c:如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的 ...

  3. JAVA解压ZIP文件

    import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.Inp ...

  4. 08 saltstack生产实例-apahce+php+redis

    1.apache+php 前几章的LAMP:https://www.cnblogs.com/venicid/p/11276232.html#_label2 Php放在apache 1.目录结构 2.p ...

  5. node压缩文件

  6. Navicat导出表结构

    SQL Server导出表结构 Oracle导出表结构

  7. 存储映射--mmap

    存储映射 使一个磁盘文件与存储空间中的一个缓冲区相映射. 当从缓冲区中取数据,就相当于读文件中的相应字节. 将数据存入缓冲区,则相应的字节就自动写入文件. 使用这种方法,首先应通知内核,将一个指定文件 ...

  8. 也谈Tcp/Ip协议

    一. 计算机网络体系结构分层 一图看完本文 计算机网络体系结构分层 计算机网络体系结构分层 不难看出,TCP/IP 与 OSI 在分层模块上稍有区别.OSI 参考模型注重“通信协议必要的功能是什么”, ...

  9. c源码编译

    #include<stdio.h> #include<math.h> //程序中要调用求平方根函数sqrt int main() { double a,b,c,disc,x1, ...

  10. HR问“你目前有几个offer”,聪明人会怎么说?

    点击上方“程序员江湖”,选择“置顶或者星标” 你关注的就是我关心的!   一个朋友和我聊天,说起自己最近被虐的面试经历.他985毕业,工作3年,看中了一家月薪1.5万的工作,准备跳槽.虽然在北京不算高 ...