JFinal 生成 sqlite3 model 代码的弊端

今天反馈了一个问题 JFinal 与 sqlite 3 配合,生成 Model 时有误,后来升级了驱动,也没有解决这个问题。跟了一下代码,有了一点自己的想法,现在分享出来和大家讨论讨论。


JFinal 在 Generator 的时候,生成表信息的代码是在 MetaBuilder.java 中的 buildColumnMetas 方法(215行左右)。

blob.png

使用

select * from table_name where 1 = 2

获取到 ResultSet 和 ResultSetMetaData。而后通过 ResultSetMetaData 的 getColumnClassName(i) 方法获取到字段类型。这个方法可能是依赖于 JDBC 驱动实现的,但是 sqlite 驱动返回的所有类型全部都是 java.lang.Object 。所以在 JFinal 定义的 typeMapping 中找不到对应的类型。而后的例外处理(230行的 else)也没有捕捉到,所以就全部当成 String 类型了。


但是在跟代码的过程中发现, rsmd.getColumnType(i) 这个方法是可以正确获取到字段类型的,也就是 Integer 类型的字段,这个方法返回的是 4。

数据库:blob.png

java 获取到的:blob.png

java.sql 中的 Types:blob.png


@Jfinal 波总是不是在这块做一下修改呢,或者在 Generator 中增加能够指定类型的方法。

第一次做分享,请大神多多指教。

评论区

JFinal

2016-08-30 00:23

关键点在于在 sqlite 中使用 getColumnClassName(i) 获取不到正确的类型,而 getColumnType(i) 可以获取到正确的类型,这个行为只有在 sqlite 中是这样,在其它数据库中是正常的

目前来说,建议通过 public class MySqliteMetaBuilder extends MetaBuilder 并且覆盖掉 builderColumnMetas(...) 方法来支持 sqlite 数据库,jfinal 后续版本会考虑改进的办法

总的来说,现有的获取 meta 的方式非常稳定,只是 sqlite 中出现意外,不大可能会单独为了 sqlite 去改变以前的处理方式,一是为了稳定性。二是由于 getColumnType(i) 或许仍然不能像 getColumnClassName(i) 一样非常精准地得到相应的 java 类型

JFinal

2016-08-30 00:23

感谢你的分享,如果后续有方案别忘了再回来分享一下,感谢支持

Kerwin

2016-08-30 09:53

@JFinal 好的。谢谢波总。我再研究研究!

545923664

2018-03-06 21:48

牛逼

热门分享

扫码入社