数据库表字段属性类型为timestamp 类型 为什么生成的basemodel 是util.Date

数据库表字段属性类型为timestamp  类型 为什么生成的basemodel 是util.Date

 请问 使用生成器的时候  如何 做扩展?

评论区

JFinal

2016-10-18 16:35

因为 java.util.Date 是 java.sql.Timestamp 父类,你可以对这类字段直接 setXxx(new Date()),而不用去苦哈哈去创建一个 Timestamp 对象,得这样写:
timestamp = new Timestamp(new Date().getTime()); 然后再
setXxx(timestamp) 在功能上与 jfinal 现在的做法是一样的,何必舍简求繁?

生成器的扩展极其简单,直接创建继承类,覆盖掉父类的相关方法即可,jfinal 所有生成器是面向扩展设计的,所有属性与方法是 protected 的,继承即可扩展

JFinal

2016-10-18 16:36

timestamp 的处理方式,简单来说是 java.sql.Timestamp 创建方式并不支持 new Timestamp(),你必须写很多代码来创建它,同时 new Date() 可以代替这些代码

JFinal

2016-10-18 16:38

最后还忘了说了有一点,该处理方式,你仍然可以 setXxx(new Timestamp(new Date().getTime()); 因为 Date 是 Timestamp 的父类,所以完全没有阻止你使用 Timestamp,所以叫有百利无一害

Noobs

2016-10-18 16:41

@JFinal 如果是util.date 我表单 提交过来 getModel 获取到的time 就丢失了 时分秒 所以需要修改 字段类型

JFinal

2016-10-18 16:46

失去时分秒并不是这个原因引起的,因为 getModel 方法最底层利的 TypeConverter.java 这个类进行的转换,注意看一下里面有关对 Date 的转换源代码,会先判断你字段的长度,然后优先会转成 Timestamp

所以解决方案极其简单,让表单中提供的 time 满足这个格式:"yyyy-MM-dd HH:mm:ss"

以外我再将 jfinal 这部分源码copy来此,你一看便知,与类型无关:
if (type == java.util.Date.class) {
if (s.length() >= timeStampLen) {
return new SimpleDateFormat(timeStampPattern).parse(s);
}
else {
return new SimpleDateFormat(datePattern).parse(s);
}
}
注意看这个 if 语句,先是优先转换为 timestamp

JFinal

2016-10-18 16:47

建议你在 TypeConverter.java 中设置一个断点,调试一下,看是哪步转换没走 timestamp 这个分支,极有可能是格式不对

JFinal

2016-10-18 16:48

如果表单域中不方便让格式满足 "yyyy-MM-dd HH:mm:ss" 这个格式,可以在提交时用 js 先干预并转换一下,然后才是真正的提交

Noobs

2016-10-18 16:50

@JFinal 波哥 我看到了 是 getModel 处理的时候判断 我表单提交过来 没有秒所有 丢失了时分 OK 知道问题 就好做了 谢谢波哥 不仅解决了问题 还对date 有新的认知!

JFinal

2016-10-18 16:53

@Noobs 用如下几行代码做个测试,可以验证我前面贴出的 jfinal 源码:
String timeStampPattern = "yyyy-MM-dd HH:mm:ss";
String s = "2011-11-22 9:8:7";
Date d = new SimpleDateFormat(timeStampPattern).parse(s);
System.out.println(d);
会看到输出结果中有 09:08:07 数据,证明时分秒是在的

Noobs

2016-10-18 16:56

@JFinal 以前用ssh 框架 数据库 字段如果是date 类型就只能获取到年月日 改为 datetime 或者 timesteamp 就能获取到了 可能 ssh 框架 针对类型 做的 时间格式获取处理 并不像jfianl 做值的长度判断 再来转换时间格式

JFinal

2016-10-18 16:58

@Noobs jfinal 的做法考虑了更多的应用场景,尤其是为了让开发者在写代码的时候体验更好

Noobs

2016-10-18 16:59

@JFinal 嗯 是的 确实 体验到了 其中的秒处 多谢波哥 细心讲解!祝 JFinal 越做越好!

JFinal

2016-10-18 17:08

@Noobs 感谢支持 jfinal 发展

紫电清霜

2016-10-19 17:49

@JFinal 波总的生成器确实可扩展性很强,大赞~

Noobs

2016-10-24 10:46

@JFinal 波哥请问 如何配置 拦截一个包下所有的Controller 而不用 每个controller 都要加注解

JFinal

2016-10-24 10:59

@Noobs 这个是 jfinal 2.3 中将要推出的功能,目前建议是在 Controller 的声明入添加解,可拦截整个 controller 中所有 action

热门反馈

扫码入社