JFinal 与 sqlite 3 配合,生成 Model 时有误

在使用 JFinal 自带的 Generator 生成 Model 类的时候。sqlite 3 中我某些字段定义的是 integer 类型,生成出来的类中却是 string 类型。是否是需要配置其它东西,还是 JFinal 对 sqlite 支持不够呢?

数据库中:blob.png

类中:blob.png

评论区

JFinal

2016-08-29 17:10

是否设置了方言: generator.setDialect(new Sqlite3Dialect())
jfinal 生成 base model 时会通过反射获取的字段类型,完全依靠的 JDBC 得到的值,理论上来说是不会出错的
此外,是所有的 integer 都识别为了 String,还是少数情况?

Kerwin

2016-08-29 18:28

@JFinal 有设置了方言。是所有的 integer 都识别为了 string。

JFinal

2016-08-29 21:04

@Kerwin 升级下驱动试试,出现这种情况表明 JDBC 无法正确反射出正确的类型,记得搞定后发篇分享出来,感谢支持 jfinal 社区

陈朝

2018-03-08 16:24

我跟踪了一下,的确是sqllite-jdbc有问题。该驱动中对ResultSetMetaData 实现是org.sqllite.RS类,其中的getColumnClassName直接return "java.lang.Object"。太坑爹了。

陈朝

2018-03-08 16:27

话说回来JFinal生成module时,为什么不使用DatabaseMetaData,而使用ResultSetMetaData呢?

JFinal

2018-03-08 16:33

@陈朝 扩展一下 ModelBuilder 与 RecordBuilder,参考一下这里:
https://gitee.com/jfinal/jfinal/tree/master/src/main/java/com/jfinal/plugin/activerecord/builder

扩展完以后,再配置一下:
new Sqllite3Dialect().setModelBuilder(new MyModelBuilder());

相应的 RecordBuilder 也可以扩展,还有 MetaBuilder 也可以继承来扩展,sqllite 不按 JDBC 标准走,只能扩展

陈朝

2018-03-08 18:37

@JFinal 我按照你的思路做了一点扩展,现在该问题已经解决了,详细过程记录在
http://www.jfinal.com/share/716

JFinal

2018-03-08 19:41

@陈朝 使用 DatabaseMetaData 这个是否可以得到正确的类型?

jfinal 以前用的 ResultSetMetaData 来获取 meta 信息,有很多原因,时间太久远了有些原因也不太记得了,我尝试回忆一下:
1:jfinal 最初版本是从支持 mysql 开始的,使用 ResultSetMetaData 可以使用其 getObject(int) 得到正确的类型,而不必去做类型转换,代码精简、性能最好

2:DatabaseMetaData 貌似只能获取到 int 型的对应 java.sql.Types 类中的类型数据,这个对不同的数据库有差别,所以 jfinal 就干脆利用不同数据库的 ResultSetMetaData.getObject(int) 方法让其自己决定类型,尽量不干预。 不同数据库会自动转成它想转成的类型

3:对于 TableBuilder 以及 com.jfinal.core 包下的 getModel getBean 的类型转换也有影响

4:或许 DatabaseMetaData 可以做得更好,但由于历史原因不敢轻易动这里,要保持兼容性,在未来或许要去尝试一下 DatabaseMetaData 的实现方法

热门反馈

扫码入社