最近一直纠结的一个问题就是如何讲bean,或者说实体中Date类型的属性,存进数据库中。
数据库中字段类型为Datetime类型。
刚开始找了很多方法。
首先,报的是java.util.Date和java.sql.Date不匹配异常,那首先想到的就是转换。
//首先bean中有一个Date类型对象
java.sql.Date d = new java.sql.Date(bean.getDate().getTime());
上面代码实现了转换,但是这样 setDate 存入数据库,发现日期是对的,但是时间全为0.
Java的文档真的要仔细查,其实java文档已经写明了,为什么没有时间呢?
一个包装了毫秒值的瘦包装器 (thin wrapper),它允许 JDBC 将毫秒值标识为 SQL DATE
值。毫秒值表示自 1970 年 1 月 1 日 00:00:00 GMT 以来经过的毫秒数。
为了与 SQL DATE
的定义一致,由 java.sql.Date
实例包装的毫秒值必须通过将小时、分钟、秒和毫秒设置为与该实例相关的特定时区中的零来“规范化”。
为了与数据库Date类型一致,所以java规范也把Date类型做成这样。数据库的Date类型就是没有时间的。Datetime才有时间。
这时,想到了一个类型,Timestamp,我们从数据库拿的时候,想拿时间,就是拿Timestamp才拿到时间。
只要把util.Date转换成Timestamp就Ok了啊。
OK。
java.sql.Timestamp tDate = new java.sql.Timestamp(bean.getDate().getTime);
pstmt.setTimestamp(tDate);
当然,也有很多其他方法,还可以数据库直接设计成varchar,或者是long类型,format以后直接存。
还可以这样写。
String str =bean.getDate()+" "+bean.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = sdf.parse(str);
java.sql.Timestamp sqlDate = new java.sql.Timestamp(date.getTime());
db.setDate1(sqlDate);
都OK。