今天反馈了一个问题 JFinal 与 sqlite 3 配合,生成 Model 时有误,后来升级了驱动,也没有解决这个问题。跟了一下代码,有了一点自己的想法,现在分享出来和大家讨论讨论。
JFinal 在 Generator 的时候,生成表信息的代码是在 MetaBuilder.java 中的 buildColumnMetas 方法(215行左右)。
使用
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。
数据库:
java 获取到的:
java.sql 中的 Types:
@Jfinal 波总是不是在这块做一下修改呢,或者在 Generator 中增加能够指定类型的方法。
第一次做分享,请大神多多指教。
目前来说,建议通过 public class MySqliteMetaBuilder extends MetaBuilder 并且覆盖掉 builderColumnMetas(...) 方法来支持 sqlite 数据库,jfinal 后续版本会考虑改进的办法
总的来说,现有的获取 meta 的方式非常稳定,只是 sqlite 中出现意外,不大可能会单独为了 sqlite 去改变以前的处理方式,一是为了稳定性。二是由于 getColumnType(i) 或许仍然不能像 getColumnClassName(i) 一样非常精准地得到相应的 java 类型