各位老铁,跟大家分享一个项目中的小插曲。
近期一个项目采用SSM进行开发,数据库oracle11G。新项目开始未了各位小弟节省时间选用mybatis.generator生成了mybatis和实体类等相关代码。
默认正陶醉在柯大哥的歌声中,突然被一个小兄弟打断,告诉我系统中遇到一个问题。查询结果中的时间信息时分秒部分均显示为00 格式如下。我扫了一眼,心中略有眉目,告诉小兄弟找找原因并告诉我解决办法。
不一会小兄弟告诉我可以这样
select to_char(update_time,'yyyy-mm-dd hh24:mi:ss') as update_time from table_name
同时修改mapper文件的jdbcType为VARCHAR,看到这样的解决办法我就呵呵了。显然这不是最好的办法啊。遂让小兄弟继续看一下java.sql.Types这个类中TIMESTAMP和DATE的区别,以及java.sql.ResultSetMetaData接口在找个方案给我。
一袋烟的时间之后小兄弟兴高彩烈的找到我,告诉这回找到好方法了。并给我看了一段新的代码
try {
Class.forName("oracle.jdbc.OracleDriver");
String url = "jdbc:oracle:thin:@192.168.2.136:1521:orcl";
Connection con = DriverManager.getConnection(url, "wms", "wms");
Statement stmt = con.createStatement();
ResultSet res = stmt.executeQuery("select update_time,to_char(update_time,'yyyy-mm-dd hh24:mi:ss') as update_timenew from wms_apply");
ResultSetMetaData resmd = res.getMetaData();
int count = resmd.getColumnCount();
for(int i=1;i<=count;i++){
System.out.println(resmd.getColumnName(i)+"\t"+resmd.getColumnTypeName(i)+"\t"+resmd.getColumnType(i));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
执行结果如下
并给我讲明了其中道理,在oracle 中的DATE类型既包含日期又包含时间,但使用jdbc ResultSetMetaData接口获取到类型后同样为DATE类型,而java.sql.Types中类型更为丰富,包含DATE、TIME、TIMESTAMP这三个类型。只一点与mysql数据中的时间类型一致、date类型仅包含日期、显然错在了类型处理上。
小兄弟补充到:mybatis真是一个强大的框架,想要解决这个问题很简单
把
<result column="UPDATE_TIME" property="updateTime" jdbcType="DATE" />
替换为如下代码即可
<result column="UPDATE_TIME" property="updateTime" jdbcType="TIMESTAMP" />
问题解决,不错不错,孺子可教。
看到这个理各位可能有点疑惑了那为什么不显示成2019-01-03这样的格式那,由于项目中后台返回json格式给前台,所以使用了@JsonFormat注解。
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTime;
带上我的耳机、调高我的音量耳边响起
“只恨自己爱冒险、强扮英雄的无畏
伤了心的诺言、到了那天才能修复
我不做大哥好多年、我不爱冰冷的床沿”