如何把java.util.Date對象保存到SQLServer中類型爲datetime類型字段中

1. 如何把java.util.Date對象保存到SQLServer中類型爲datetime類型字段中去,如果使用java.sql.Date類,那麼除了年月日,時分秒都會被去掉.當然可以通過執行
insert into table(field) values('yeary-month-day hours:minutes:seconds')
即使用字符串強制執行操作,有沒有其它更好的方法?

問題已經解決,總結經驗如下:
我使用的是Spring 提供的JdbcTemplate
我的對象中含有java.sql.Date類型的兩個對象,
數據庫使用SQLServer 2000,使用的了Datetime類型的字段
現在要把java.sql.Date類型的userDeviceInfo存入數據庫中去,然後再讀出來.

/*class userDeviceInfo原來是一個登陸設備信息類,在這裏我只選兩其中兩個成員變量,就能說明問題,這個類使用了java.sql.Date類型的兩個成員變量,提供了相應的setter,getter,供Spring和用戶設置屬性,取得屬性
*/

import java.sql.Date;
public class userDeviceInfo
{
        private Date dRegDate;
        private Date dCZDate;

        public void setDRegDate(Date dRegDate)
        {
                this.dRegDate = dRegDate;
        }

        public void setDCZDate(Date dCZDate)
        {
                this.dCZDate = dCZDate;
        }

        public Date getDRegDate()
        {
                return this.dRegDate;
        }


        public Date getDCZDate()
        {
                return this.dCZDate;
        }
}

/*
下面是使用Spring JdbcTemplate的插入對象和取得對象的類
*/


import java.sql.*;
import javax.sql.DataSource;

import java.util.Date;
import java.util.List;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.RowMapperResultReader;

import alarm.userDeviceInfo;

//RowMapper接口負責把ResultSet中的一條記錄映射成一個對象
//爲把一條記錄映射成一個對象,我們需要創建這樣的RowMapper
class userDeviceInfoRowMapper implements RowMapper
{
        public Object mapRow(ResultSet rs, int index) throws SQLException
        {
                userDeviceInfo userobj = new userDeviceInfo();
                userDeviceInfoDao.ResultToObj(userobj, rs);

                return userobj;
        }
}

// 實現userDeviceInfo類對象的持久化
public class userDeviceInfoDao
{
        private JdbcTemplate jdbcTemplate;

        private DataSource dataSource;

        public userDeviceInfoDao(DataSource ds)
        {
                this.dataSource = ds;
                jdbcTemplate = new JdbcTemplate(this.dataSource);
        }

        // 向數據庫是添加一個對象,實現對象持久化,need modity
        public int insertObj(userDeviceInfo userobj) throws SQLException
        {

                String sql = "insert into UserInfo(
                                + "dRegDate,dCZDate)"
                                + " values(?,?)";
                Object[] params = new Object[] { userobj.getDRegDate(),
                                userobj.getDCZDate()};

                int[] types = new int[] {
                        Types.TIMESTAMP,
                        // sqlserver中的datetime對應types.timestamp,java.sql.date
                        // 轉換過程由java.util.date --> java.sql.date
                        Types.TIMESTAMP,
                };

                return jdbcTemplate.update(sql, params, types);
        }
        // 根據UserId得到一個對象
        public userDeviceInfo getObj(String strUserID) throws SQLException
        {
                String sql = "select * from UserInfo where strUserID = ?";// 創建查詢語句
                final Object[] params = new Object[] { strUserID };// 創建查詢參數
                final userDeviceInfo userobj = new userDeviceInfo();

                jdbcTemplate.query(sql, params, new RowCallbackHandler() {

                public void processRow(ResultSet rs) throws SQLException
                {
                        ResultToObj(userobj, rs);
                }
                });

                return userobj;
        }


        // 把一行記錄轉換成一個對象,爲提高代碼重用,寫成一個靜態函數
        public static void ResultToObj(userDeviceInfo userobj, ResultSet rs)
                        throws SQLException
        {
        
                java.sql.Date sqlDate1 = new java.sql.Date(rs.getTimestamp("dCZDate").getTime());  //轉換精要
                java.sql.Date sqlDate2 = new java.sql.Date(rs.getTimestamp("dRegDate").getTime());  

                userobj.setDCZDate(sqlDate1);
               
                userobj.setDRegDate(sqlDate2);

        }
}


//測試用例,我們從userDeviceInfoDao中取得userObj後,怎麼樣從java.sql.Date中取得時間呢
test case:

        BeanFactory factory = new XmlBeanFactory(new FileInputStream(//bean工廠,測試bean
                                "D://bin//JAVA//Alarm//WebRoot//WEB-INF//Alarm-servlet.xml"));
        userDeviceInfoDao userDao = (userDeviceInfoDao) factory
                                .getBean("userDeviceInfoDao");

        userDeviceInfo userobj = new userDeviceInfo();
        try
        {
                userobj = userDao.getObj("admin12");
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
                       //使用SimpleDateFormat
                String da = sdf.format(userobj.getDRegDate().getTime());//獲取milliseconds,然後轉換
                System.out.println(userobj.getStrUserID() + ",regtime:" + da);

                } catch (SQLException e)
                {
                        System.err.println(e.toString());
                }

結論:
1.java.sql.Date是含有時分秒,只是這是一種隱含,如果直接調用getDate(),則只會返回年,月,日,獲取時,分,秒的方法是使用java.util.Date,通用getTime(),返回從milliseconds,充當中間橋,進行轉換
2.Spring Types.timestamp可以對應的sqlserver數據庫中的datetime,可以把時間寫進去.
3.讀出來的時候,按則第一條原則進行轉換
在網上找了很多資料,轉換都比較複雜,使用jdbcTemplate的代碼看起來很笨拙,其實問題的關鍵是java.sql.Date是否能保存除年月日外的時分秒,只要可以,就能通過中間方法進行存取.

剛剛總結出來的經驗,請多多指教!!!
==============================================================
弄那麼複雜幹嘛?
java.sql.Date是繼承自java.util.Date,也就是說,java.util.Date的所有方法java.sql.Date都可以用啊,而且繼承的類可以向上轉換。最簡單的方法,你把程序裏面所有的定義java.util.Date都改成java.sql.Date不就行了?

實在需要轉換,參照下例
java.sql.Date sdate = xxxx;
java.util.Date udate = (java.util.Date) sdate;
sdate = new java.sql.Date(udate.getTime());
=========================================================
java.text.*下有個DateFormat
DateFormat df=DateFormat.getDateInstance();
String date=df.format(new java.util.Date());
後面的可以分解new java.util.Date().getTime()
date=yyyy-mm-dd
===========================================================
問題是我們爲什麼要使用這種格式呢?
insert into table(field) values('yeary-month-day hours:minutes:seconds')
幹嘛不用PreparedStatement ?
insert into table(field) values(?);
java.sql.Date dt = new java.sql.Date(...);
pstmt.setDate(dt);
pstmt.executeUpdate();

Spring不是支持使用preparedstatement的嗎?有簡單的方法不用,幹嘛要舍簡就繁地把日期格式轉來轉去呢?

java.sql.Date sdate = new java.sql.Date(...);
JdbcTemplate jt = ...
jt.update("insert into table(field) values(?)", new Object[] {sdate});
=============================================================
JdbcTemplae承擔了資源管理和錯誤處理的重擔,可以使JDBC代碼非常乾淨,對於update(String sql,Object[] args,int[] argTypes)提供了類型安全,當參數爲null時,這種形式提供了更好的支持.

發佈了6 篇原創文章 · 獲贊 1 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章