做一些java项目是和数据库打交道是不可避免的,本人在一次将数据插入orcale数据库时Date类型字段插入时时分秒莫名其妙的就丢失了,在debug过程中发现在Date类型是时分秒是存在的,但是在这里要注意的是java.util.Date类型的是不可以直接插入数据库的。那么问题出在什么地方呢,在我继续debug的时候发现在转换为课插入数据库的java.sql.Date后该字段就没有了时分秒,这时候经过百度,API的指导,我发现sql.Date是不存在精度到时分秒的,所以解决办法为:
/***
* 将传递过来的字符串转化为Timestamp类型
* @param s
* @return
*/
public Timestamp toDate(String s){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d = null;
try {
d = sdf.parse(s);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return new java.sql.Timestamp(d.getTime());
}
这里是在java中使用存储过程:
CallableStatement call = session.connection().prepareCall(
"{call P_BUSINESS(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}");
call.setLong(1, ci.getID());
call.setString(2, ci.getINTERFACE_code());
call.setString(3, ci.getNODE());
call.setString(4, ci.getSUMMARY());
call.setString(5, ci.getDATA_TYPE());
call.setDouble(6, ci.getBUSSINESS_now());
call.setDouble(7, ci.getUSER_now());
call.setTimestamp(8, ci.getCOLLECT_time());
call.setString(9, ci.getDATA_info());
call.setString(10, ci.getDATA_info2());
call.setString(11, ci.getDATA_info3());
call.setTimestamp(12, ci.getRECV_time());
call.setInt(13, ci.getSENDFLAG());
call.setInt(14, ci.getWARNING_ID());
call.executeQuery();
</pre><pre name="code" class="java"> 附上存储过程:
</pre><pre name="code" class="java"><pre name="code" class="sql">create or replace procedure P_BUSINESS(ID IN OUT NUMBER,INTERFACE_CODE IN OUT VARCHAR2,NODE IN OUT VARCHAR2,SUMMARY IN OUT VARCHAR2,DATA_TYPE IN OUT VARCHAR2,BUSSINESS_NOW IN OUT NUMBER,USER_NOW IN OUT NUMBER,COLLECT_TIME IN OUT DATE,DATA_INFO IN OUT VARCHAR2,DATA_INFO2 IN OUT VARCHAR2,DATA_INFO3 IN OUT VARCHAR2,RECV_TIME IN OUT DATE,SENDFLAG IN OUT NUMBER,WARNING_ID IN OUT NUMBER) is
begin
insert into T_BUSINESS(ID,INTERFACE_CODE,NODE,SUMMARY,DATA_TYPE,BUSSINESS_NOW,USER_NOW,COLLECT_TIME,DATA_INFO,DATA_INFO2,DATA_INFO3,RECV_TIME,SENDFLAG,WARNING_ID)
values(HIBERNATE_SEQUENCE.NEXTVAL,INTERFACE_CODE,NODE,SUMMARY,DATA_TYPE,BUSSINESS_NOW,USER_NOW,COLLECT_TIME,DATA_INFO,DATA_INFO2,DATA_INFO3,RECV_TIME,SENDFLAG,WARNING_ID);
end P_BUSINESS;