• 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") 2 List<ActivityAppDO> selectAll(@Param("pageindex") Integer pageindex, @Param("pagenum") Integer pagenum, 3 @Param("jsonArray") JSONArray jsonArray, @Param("flag") Boolean flag);
  • 相关阅读:
    test!
    Visual Studio 中的单元测试 UNIT TEST
    Jquery结合div+css实现文字间断停顿向上滚动效果
    asp.net中使用HttpWebRequest发送上传文件
    分享一个可以灵活控制的实现Javascript滚动效果的程序
    VeryCodes.Log让日志记录和读取变的更简单
    实现MyXLS设置行高的功能
    设计模式学习笔记建造者模式
    设计模式学习笔记原型模式
    设计模式学习笔记模板方法
  • 原文地址:https://www.cnblogs.com/yangxiaobo-blog/p/11511023.html
Copyright © 2020-2023  润新知