JFinal

登录 注册
JFinal 已连续多年蝉联最受欢迎中国开源软件冠军,投出您宝贵的一票今年继续夺冠! 评选传送门

动态查询的一种解决方案

      最近刚接触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传上来

大家可以做个参考


评论

  • 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;
    }


    }
  • 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;
    }
    }

    }
  • 12-31 12:01
    这种方式想法很新颖,以前没看到过还能这么玩的。对于后台管理需要根据不同的条件进行查询与过滤的,这是一种很好的封装方式,能够减少很多代码量,感谢分享
  • 12-31 12:38
    @JFinal 是啊,而且封装完成基本上都是前台js 和页面的功能了,后台基本上不用动了
  • 01-06 14:15
    推荐楼主用一下 guava Multimap 解决你拼凑map的复杂数据结构,在一个这个 Multimap是支持一键多个值得
  • 01-09 10:53
    @giegie guava没研究过,还有前几天在写东西的时候发现arrayList 可以直接转array 反倒少了new array必须填生成多少个的麻烦啦,貌似guava的包不小,反倒不如java简便
  • 发送