- 論壇徽章:
- 0
|
1. 如何把java.util.Date對象保存到SQLServer中類型為datetime類型字段中去,如果使用java.sql.Date類,那么除了年月日,時分秒都會被去掉.當然可以通過執(zhí)行
insert into table(field) values('yeary-month-day hours:minutes:seconds')
即使用字符串強制執(zhí)行操作,有沒有其它更好的方法?
問題已經解決,總結經驗如下:
我使用的是Spring 提供的JdbcTemplate
我的對象中含有java.sql.Date類型的兩個對象,
數(shù)據(jù)庫使用SQLServer 2000,使用的了Datetime類型的字段
現(xiàn)在要把java.sql.Date類型的userDeviceInfo存入數(shù)據(jù)庫中去,然后再讀出來.
- /*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中的一條記錄映射成一個對象
- //為把一條記錄映射成一個對象,我們需要創(chuàng)建這樣的RowMapper
- class userDeviceInfoRowMapper implements RowMapper
- {
- public Object mapRow(ResultSet rs, int index) throws SQLException
- {
- userDeviceInfo userobj = new userDeviceInfo();
- userDeviceInfoDao.ResultToObj(userobj, rs);
- return userobj;
- }
- }
- // 實現(xiàn)userDeviceInfo類對象的持久化
- public class userDeviceInfoDao
- {
- private JdbcTemplate jdbcTemplate;
- private DataSource dataSource;
- public userDeviceInfoDao(DataSource ds)
- {
- this.dataSource = ds;
- jdbcTemplate = new JdbcTemplate(this.dataSource);
- }
- // 向數(shù)據(jù)庫是添加一個對象,實現(xiàn)對象持久化,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);
- }
- // 根據(jù)UserId得到一個對象
- public userDeviceInfo getObj(String strUserID) throws SQLException
- {
- String sql = "select * from UserInfo where strUserID = ?";// 創(chuàng)建查詢語句
- final Object[] params = new Object[] { strUserID };// 創(chuàng)建查詢參數(shù)
- final userDeviceInfo userobj = new userDeviceInfo();
- jdbcTemplate.query(sql, params, new RowCallbackHandler() {
- public void processRow(ResultSet rs) throws SQLException
- {
- ResultToObj(userobj, rs);
- }
- });
- return userobj;
- }
- // 把一行記錄轉換成一個對象,為提高代碼重用,寫成一個靜態(tài)函數(shù)
- 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數(shù)據(jù)庫中的datetime,可以把時間寫進去.
3.讀出來的時候,按則第一條原則進行轉換
在網上找了很多資料,轉換都比較復雜,使用jdbcTemplate的代碼看起來很笨拙,其實問題的關鍵是java.sql.Date是否能保存除年月日外的時分秒,只要可以,就能通過中間方法進行存取.
剛剛總結出來的經驗,請多多指教!!! |
|