mybatis遇上oracle date

各位老铁,跟大家分享一个项目中的小插曲。

近期一个项目采用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;

带上我的耳机、调高我的音量耳边响起

“只恨自己爱冒险、强扮英雄的无畏

伤了心的诺言、到了那天才能修复

我不做大哥好多年、我不爱冰冷的床沿”

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值