数据库字段是下划线方式的,如何转换List 中字段为驼峰式的

因为是之前系统的升级,数据库字段公司不让调整,都是下划线形式的。我进行表的查询,因为可能连表查询,不能跟bean进行对应:我想让返回的数据json是驼峰式输出,而不是现在的字段形式输出。

String sql ="select * from hello_word";

List<Record> list = Db.find(sql);

System.out.println(JsonUtil.convert(JFinalJson.getJson().toJson(list)));

我现在的解决办法是写了个json的转换器,进行json的转换,我觉得效率不高,大神还有更好的解决办法吗?

还有个问题:我加入俱乐部,是不是都可以直接找您咨询问题了!

评论区

JFinal

2017-04-28 18:03

主要有两个方向,任选其一:
1:如果是 mysql,将字段直接弄成驼峰的是最省事的方式,推荐这种方式
2:下载首页的 jfinal demo 中的 model 生成器,可生成 getter、setter 方法,然后通过 me.setJsonFactory(new FastJsonFactory())

注意:model 也是可以用关联查询获取非本 model 所属性表中字段的,但由于这些 join 过来的字段是没有 getter 方法的,可以用 select a as xx 起别名的方式,将外来表的字段弄成驼峰的。 如果采用方案一中的方法,就更省事

由于 jfinal 现在用户量非常大,所以个人时间无法承担大家的提问,只能重点照顾俱部的支持者,俱乐部有专用 qq 群,而不是俱乐部的小伙伴在社区提问也可以得到回复

chenmopinglou

2017-04-28 18:17

@JFinal
我们用的db2,我因为在config配置了
ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
arp.setContainerFactory(new PropertyNameContainerFactory());

PropertyNameContainerFactory 类(新增类PropertyNameContainerFactory 驼峰下划线工厂类)代码如下:

package com.cmpl.jxgl.common;

import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import com.jfinal.plugin.activerecord.IContainerFactory;

//XXX 新增类PropertyNameContainerFactory 驼峰下划线工厂类
@SuppressWarnings({ "rawtypes", "unchecked" })
public class PropertyNameContainerFactory implements IContainerFactory {

public Object convert(Object key) {
if (key instanceof String) {
String property = null;
String alias = null;
if (((String) key).indexOf(".") > -1) {
String[] properties = ((String) key).split("\\.");
alias = properties[0];
property = properties[1];
} else {
property = ((String) key);
}
StringBuilder buf = new StringBuilder(property);
for (int i = 1; i < buf.length() - 1; i++) {
if (Character.isLowerCase(buf.charAt(i - 1)) && Character.isUpperCase(buf.charAt(i))
&& Character.isLowerCase(buf.charAt(i + 1))) {
buf.insert(i++, '_');
}
}
return (alias != null ? alias + "." : "")
+ (toUpperCase ? buf.toString().toUpperCase() : buf.toString().toLowerCase());
}
return key;
}

private static boolean toUpperCase = true;

public PropertyNameContainerFactory() {
}

public PropertyNameContainerFactory(boolean toUpperCase) {
PropertyNameContainerFactory.toUpperCase = toUpperCase;
}

public Map getAttrsMap() {
return new PropertyNameMap();
}

public Map getColumnsMap() {
return new PropertyNameMap();
}

public Set getModifyFlagSet() {
return new PropertyNameSet();
}

public class PropertyNameSet extends HashSet {
private static final long serialVersionUID = 2337255096474815584L;

public boolean add(Object e) {
return super.add(convert(e));
}

public boolean remove(Object e) {
return super.remove(convert(e));
}

public boolean contains(Object e) {
return super.contains(convert(e));
}

public boolean addAll(Collection c) {
boolean modified = false;
for (Object o : c)
if (super.add(convert(o)))
modified = true;
return modified;
}
}

public class PropertyNameMap extends HashMap {
private static final long serialVersionUID = -4107018318847768335L;

public Object get(Object key) {
return super.get(convert(key));
}

public boolean containsKey(Object key) {
return super.containsKey(convert(key));
}

public Object put(Object key, Object value) {
return super.put(convert(key), value);
}

public void putAll(Map m) {
for (Map.Entry e : (Set) (m.entrySet()))
super.put(convert(e.getKey()), e.getValue());
}

public Object remove(Object key) {
return super.remove(convert(key));
}
}
}


这样我通过如下方法调用:
Page page =Db.paginate(1, 10, "select * ", " from hello_word a ");
renderJson(JFinalJson.getJson().toJson(page));

返回的数据如下:
{"totalRow":2,"pageNumber":1,"lastPage":true,"firstPage":true,"totalPage":1,"pageSize":10,"list":[{"NUAN_NUAN":"test","ID":"11111111111111111110","USER_NAME":"张三","USER_PWD":"李四"},{"NUAN_NUAN":"1","ID":"11111111111111111111","USER_NAME":"1","USER_PWD":"111"}]}


因为我们业务表很多,牵扯到数据移植,所以字段名称不能调整。

JFinal

2017-04-28 20:54

@chenmopinglou 扩展 IContainerFactory 也是一个办法,jfinal 3.1 已经开发完成并在内测中,五一节完善好手册后会发布正式版本,这个版本对于你这个需求有更好的解决方案

多多关注一下社区动态, jfinal 3.1 版对于你这个需求支持会更加方便

热门反馈

扫码入社