动态查询的一种解决方案

      最近刚接触jfinal,写了点东西,感觉jfinal是一个很优秀的框架,快捷开发,后台代码从搭建到基本完成只用了2天时间(第一天主要是搭建学习了,写代码主要用了低2天的时间)之前是用spring+ mybatis的 mybatis的where自认为处理的相当好,他是动态处理 if 条件判断, jfinal的话 参考了一下网上说的,一般都是在代码里进行拼接,这样写起来相对来说比较麻烦,于是我就想到一个办法,在这里和大家分享一下。

       在controller中 , request 有个方法可以吧request中的所有parameter 接收过来, 变成一个 map<String,String[]>, 这时候可不可以 把map 中的value 第一个值当做value , 第二个值传 相对应的 符号呢, 比方说我想查询 name 像 'jim' 的 , 传值的时候, 把 like 一起传过来 key 为 name ,value 为 ['Jim',"like"] 因为 这种查询几乎不会遇到多值的情况(这里说的多值是指的页面送个数组回来),所以说可以这么解决(这里处理的基本上是通用情况,当然特殊情况可以特殊处理嘛。),循环遍历map中的元素,然后取出key做 字段, value中的第二个元素做 条件,  value 第一个元素是值,这时候就可以写一个工具类了拼装一下相关的条件。

       使用的时候发现一个问题,我有设置的逻辑删除,查询列表的时候不想展示被删除的字段,而且还要分状态展示,而且我删除状态和那些状态是一起的,也就是说我可能在sql中我可能需要传两个相同的key 不同的条件,status=1 and status != -1 ,还有个问题是  直接在request中取出的map, 只能取值不能再put, 这时候我又把这个map 进行了拆分,分成了list ,每个list 中是hashmap 这个hashmap  就是遍历取出的每一个key 和他对应的value(String[])  这时候这个list 就可以进行add了。

controller中:QQ图片20161230220546.png

service 中:

QQ截图20161230220804.jpg

稍后我吧PageParam 和 pageutil传上来

大家可以做个参考


评论区

baima_aoe

2016-12-30 22:11

public class PageParam {

int pageNumber;

int pageSize;

String select;

String sqlExceptSelect;

Object[] param;

public int getPageNumber() {
return pageNumber;
}

public void setPageNumber(int pageNumber) {
this.pageNumber = pageNumber;
}

public int getPageSize() {
return pageSize;
}

public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}

public String getSelect() {
return select;
}

public void setSelect(String select) {
this.select = select;
}

public String getSqlExceptSelect() {
return sqlExceptSelect;
}

public void setSqlExceptSelect(String sqlExceptSelect) {
this.sqlExceptSelect = sqlExceptSelect;
}

public Object[] getParam() {
return param;
}

public void setParam(Object[] param) {
this.param = param;
}


}

baima_aoe

2016-12-30 22:11

public class PageUtil {

public static final int DEFAULT_PAGE_SIZE = 10;

public static PageParam getPageParam(List> paramList,String tableName,String select,String orders){
PageParam pageParam = new PageParam();

int page_size = DEFAULT_PAGE_SIZE;

int page_no = 1;

String sqlExceptSelect;


Object[] param = null;

int param_count = 0;

for(Map paramMap : paramList){
for(String key:paramMap.keySet()){
if("page_size".equals(key)){
if(paramMap.get(key)[0] != null && !("".equals(paramMap.get(key)[0])))
page_size = Integer.parseInt(paramMap.get(key)[0]);
}else if("page_no".equals(key)){
if(paramMap.get(key)[0] != null && !("".equals(paramMap.get(key)[0])))
page_no = Integer.parseInt(paramMap.get(key)[0]);
}else{
if(paramMap.get(key)[0] != null && !("".equals(paramMap.get(key)[0])))
param_count ++;
}
}
}
StringBuilder sqlExceptSelect_buder = new StringBuilder();
sqlExceptSelect_buder.append("FROM "+tableName+" ");
if(param_count > 0){
param = new Object[param_count];
sqlExceptSelect_buder.append("WHERE 1=1 ");
int j = 0;
for(Map paramMap : paramList){
for(String key : paramMap.keySet()){
if(!("page_size".equals(key)) && !("page_no".equals(key))){
String[] value = paramMap.get(key);
if(value[0] != null && !("".equals(value[0]))){
sqlExceptSelect_buder.append("AND ");
sqlExceptSelect_buder.append(key + " ");
//sqlExceptSelect_buder.append((value[1] == null || "".equals(value[1]))?"=":value[1] + " ");
if(value.length > 1){
if(value[1] == null || "".equals(value[1])){
sqlExceptSelect_buder.append("= ");
sqlExceptSelect_buder.append("? ");
param[j] = value[0];
}else if("like".equals(value[1].toLowerCase())){
sqlExceptSelect_buder.append("like ");
sqlExceptSelect_buder.append("?");
sqlExceptSelect_buder.append(" ");
param[j] = "%"+value[0]+"%";
}else{
sqlExceptSelect_buder.append(value[1]+" ");
sqlExceptSelect_buder.append("? ");
param[j] = value[0];
}
}else{
sqlExceptSelect_buder.append("= ");
sqlExceptSelect_buder.append("? ");
param[j] = value[0];
}


j++;
}
}
}
}
}
if(orders != null && !("".equals(orders))){
sqlExceptSelect_buder.append(" "+orders);
}
sqlExceptSelect = sqlExceptSelect_buder.toString();
pageParam.setPageNumber(page_no);
pageParam.setPageSize(page_size);
pageParam.setParam(param);
pageParam.setSqlExceptSelect(sqlExceptSelect);
if(select != null && !("".equals(select))){
pageParam.setSelect(select);
}else{
pageParam.setSelect("SELECT *");
}
return pageParam;
}

public static List> getParammapList(Map paraMap){
List> paramList = new ArrayList>();
if(paraMap != null){
Set keySet = paraMap.keySet();
for(String key :keySet){
Map paramMap = new HashMap();
String format_key = key.replace("[]", "");
paramMap.put(format_key, paraMap.get(key));
paramList.add(paramMap);
}
return paramList;
}else{
return null;
}
}

}

JFinal

2016-12-31 12:01

这种方式想法很新颖,以前没看到过还能这么玩的。对于后台管理需要根据不同的条件进行查询与过滤的,这是一种很好的封装方式,能够减少很多代码量,感谢分享

baima_aoe

2016-12-31 12:38

@JFinal 是啊,而且封装完成基本上都是前台js 和页面的功能了,后台基本上不用动了

giegie

2017-01-06 14:15

推荐楼主用一下 guava Multimap 解决你拼凑map的复杂数据结构,在一个这个 Multimap是支持一键多个值得

baima_aoe

2017-01-09 10:53

@giegie guava没研究过,还有前几天在写东西的时候发现arrayList 可以直接转array 反倒少了new array必须填生成多少个的麻烦啦,貌似guava的包不小,反倒不如java简便

baima_aoe

2019-07-18 17:23

看到有人收藏,好有成就感。哈哈

热门分享

扫码入社