如何把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时,这种形式提供了更好的支持.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值