刚接触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")
#endmerchant.sql
#sql("updateByIdSelective")
#@updateByIdSelective("merchant")
#end2.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 数据库操作在底层是用的 JDBC,操作模式上就是创建 sql 及其 paras,然后直接扔给了 JDBC,理论上只要是 JDBC 可以操作的, jfinal 都可以
mybatis 也是对 JDBC 的封装,相信其 selective 操作也是在 JDBC 基础上做了更一层封装