jfinal在mysql下使用druid连接池出现映射model字段set,get方法全大写问题

第一次使用jfinal开发项目,数据库是mysql,使用druid连接池。今天下午在映射model的时候,发现表中没有下划线的字段映射model后的set,get方法全是大写,如表中字段为大写PHONE,映射生成后为

        public void setPHONE(java.lang.String PHONE) {

set("PHONE", PHONE);

        }

        public java.lang.String getPHONE() {

return get("PHONE");

}

经调试发现,MetaBuilder类的buildColumnMetas方法中,最初拿到的字段名就有时大写有时小写,而对于没有下划线的字段全部为大写,以至于后面处理属性名出了问题,虽然作者有提示mysql数据库建议使用小写字段名或者驼峰字段名,但毕竟不是一个完美的方案

11.jpg

222.jpg

从toCamelCase方法来看,在判断stringWithUnderline没有下划线时直接返回了,如果stringWithUnderline此时是大写也还是存到了TableMeta对象中,最终导致生成的set、get方法出现大写问题,由于项目紧急,没有太多时间去查看buildColumnMetas方法中为什么一开始拿到的就是大写,和后面代码怎么去优化,目前比较快的还是按作者的要求全部改成小写,或修改源码,在判断字段没有下划线时转成小写再返回,但不知道对其它地方有没有影响,这个需要仔细看看代码了

评论区

JFinal

2017-10-17 20:36

toCamelCase(...) 方法默认所有字符是小写的,然后主要对下划线部分做处理,如果参数本身是大写的,通过 toLowerCase() 转换一下就可以了

你的表字段应该是大写,可以通过继承 MetaBuilder 覆盖掉其中的 buildAttrName(...) 方法来实现你的需求

bujj

2017-11-09 10:42

@JFinal 框架生成的Model是map类型的,转成json后自然也是按map的key生成的json key,而做数据映射到Model时,又是按驼峰命名的方法存取的,这个后续框架能不能做个优化,在set key时,先转成驼峰key再put进去,这样存取Model属性key都一样的驼峰命名;这样改后是不是对于直接用model来操作数据库有影响,如果是直接取的model属性的key来做为表字段,再从驼峰命名转成下划线的字段就可以了;提个建议,希望JFinal越来越好!

JFinal

2017-11-09 10:45

@bujj 配置一下就好: me.setJsonFactory(new FastJsonFactory());

默认转 json 是用的 JFinalJson 实现类,通过上面的配置可以切换到 fastjson 上去

如果不是 web 项目,还可以通过 JsonManager.me().setJsonFactory(new FastJsonFactory()) 进行切换

JFinal

2017-11-09 10:47

@bujj 在 set key 时,如果将 key 转成驼峰,主要是数据反向存放的时候很麻烦,还要将驼峰再转回成下划线,还有一个是不兼容老用户的用法,还有很多其它缺点

因此,我自己的项目,mysql 数据表的所有字段全是驼峰的,整个世界清静了

bujj

2017-11-27 15:34

@JFinal 还发现一个问题,怎么感觉执行的代码跟写好的代码不一样,我更新了别人的代码,重新清理再生成class再跑,最后执行的还是原来的,甚至跑到别的类里去了(是的,就是这么神奇,是别的类,还不报错),不止我一个人出现过这个问题,我们项目组其他几个同事也有出现过,换成tomcat也是一样,最后我们把class文件整个删掉再生成,本次才不会有问题,过段时间又会偶尔冒出来

JFinal

2017-11-27 18:30

@bujj 使用的是上次的 class 文件而已,这个一点也不罕见,将 class clear 掉,重新编译即可

bujj

2017-12-06 09:36

@JFinal 可不是用的上次的class文件哦,是完全跑到另外一个类里去了

热门分享

扫码入社