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存入數據庫中去,然後再讀出來.
結論:
1.java.sql.Date是含有時分秒,只是這是一種隱含,如果直接調用getDate(),則只會返回年,月,日,獲取時,分,秒的方法是使用java.util.Date,通用getTime(),返回從milliseconds,充當中間橋,進行轉換
2.Spring Types.timestamp可以對應的sqlserver數據庫中的datetime,可以把時間寫進去.
3.讀出來的時候,按則第一條原則進行轉換
在網上找了很多資料,轉換都比較複雜,使用jdbcTemplate的代碼看起來很笨拙,其實問題的關鍵是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存入數據庫中去,然後再讀出來.
CODE:
/*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());
}
*/
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.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
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});
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時,這種形式提供了更好的支持.