JFinal mysql 选择性修改数据库 类似mybatis selective操作

刚接触jfinal半个月,关于修改表格方法只找到了update,或者自己去拼sql,不知道大家有没有这个问题。实在没找到框架内的选择性修改table的方法,于是自己封装了一个,希望对大家有所帮助。可能jinal有类似方法,我没有发现,如果大家知道的话,可以评论里告我,万分感谢!封装完以后调用参数有两个:sql空间名namespace + 要修改的model。

sql模板的名称可以固定为updateByIdSelective,将这个名称定义为常量,可以方便调用。

1.定义sql模板

all.sql

#define updateByIdSelective(table)
update #(table)
#for(x : cond)
  #(for.index == 0 ? "set" : " , ") #(x.key) #para(x.value)
#end
where id = #(id)
#end

#namespace("merchant")
    #include("merchant.sql")
#end

merchant.sql

#sql("updateByIdSelective")
 #@updateByIdSelective("merchant")
#end


2.ModelUtil工具类,将model转化为map,以方便获取sqlpara

package com.xd.common.utils;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import com.jfinal.plugin.activerecord.Model;

public class ModelUtil {

    public static Map<String, Object> toUpdateMap(Model model) {
        Map<String, Object> map = new HashMap<String, Object>();
        Map<String, Object> result = new HashMap<String, Object>();
        Set<Entry<String, Object>> _getAttrsEntrySet = model._getAttrsEntrySet();
        Iterator<Entry<String, Object>> it = _getAttrsEntrySet.iterator();
        while (it.hasNext()) {
            Entry<String, Object> entry = it.next();
            if (entry.getValue() != null) {
                if ("id".equals(entry.getKey())) {
                    result.put(entry.getKey(), entry.getValue());
                } else {
                    map.put(entry.getKey() + " = ", entry.getValue());
                }
            }
        }
        result.put("cond", map);
        return result;
    }

}

3.调用sql模板

public boolean updateByIdSelective(Merchant merchant) {
        SqlPara sqlPara = Db.getSqlPara("merchant.updateByIdSelective", ModelUtil.toUpdateMap(merchant));
        try {
            Db.update(sqlPara);
        } catch (Exception e) {
            return false;
        }
        return true;
    }


评论区

JFinal

2017-10-23 11:10

感谢分享

jfinal 数据库操作在底层是用的 JDBC,操作模式上就是创建 sql 及其 paras,然后直接扔给了 JDBC,理论上只要是 JDBC 可以操作的, jfinal 都可以

mybatis 也是对 JDBC 的封装,相信其 selective 操作也是在 JDBC 基础上做了更一层封装

top

2017-10-23 12:03

ddjfinal

2017-10-30 19:57

JSONObject jsonObject = new JSONObject(modal.toJson());
Map map = (Map)jsonObject;
SqlPara sp = Db.getSqlPara("pf.getSysBrchList", Kv.by("cond",map));

这样就可以了啊,我的项目引入的是hutool的jar包里面的json工具,这样其实两行代码,其实一行
Map map = (Map)(new JSONObject(modal.toJson()));就转成map了。

ddjfinal

2017-10-30 19:59

好多json工具JSONObject 是直接提供转map的方法的,只需要把modal转成json就大功告成了,感觉写工具类没必要,除非有性能上的提升?

top

2017-11-01 11:00

@ddjfinal 这里的map不是单纯的吧model里的key-value加进来,还添加了“=”,主要用于set数据库。

ddjfinal

2017-11-01 17:06

@top 嗯,我都是在sql模版文件中遍历map的时候设置表达式条件的,默认都是 = 号,特殊 的比如 like的再处理下就ok了

top

2017-11-02 09:07

@ddjfinal 嗯嗯 都可以

热门分享

扫码入社