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);