Java中Date插入数据库的一些问题总结(二)

Java中Date插入数据库的一些问题总结(二)
关于java.sql.Date中插入/提取数据库中 Date类型的date值–带有时分秒的方法

———————————–楼主温馨提示:以下内容可以忽略,直接从下个分割线阅读——————————–
书上一个项目把我给坑到了~此项目用java.sql.Date类,然后存入导出的日期是没有时间。出于优化的心态,我就想着看能不能把时分秒给加上,本以为是很简单的转换问题,结果一坑我就是半天~~
先看数据库里,date是datetime类型,存入的数据只有年月日,时间都是00:00:00;当时的我以为是简单的格式转换问题(受教育了~下次得把问题归结清楚,一通乱搞只会越来越乱~)就寻思着把时间获取然后重新转换一下格式,再存入不就OK了?如此一来存入数据库和导出展示都变成了美观的”yyyy-MM-dd HH:mm:ss”格式(2016-03-15 15:52:48)

原语句获取时间的代码是

setDate(new Date(System.currentTimeMills());

作为小白,只管百度,然后套用,这是一贯规律~于是搜索到了SimpleDateFormat对象,二话不说,开始套用,套用!然后一下午过去了~事情也没有解决。只能先把大概的收获总结一下:
1:System.currentTimeMillis() 返回long类型 可以强制转换成Date格式
2:SimpleDateFormat.format()返回的是 String类型,可以得到我上述的时间格式,但是是String类型。
3:SimpleDateFormat.parse()返回的是Date类型,该方法试图按照给定的SimpleDateFormat 对象的格式化存储来解析字符串,试过后发现,解析后的值是“格林威治时间格式“,即我当初设想的思路应该不能实现,转而改变策略,以任意格式把时间变成Date格式插入数据库中,提取的时候再做变换即可。
4:查询中发现java.util.Date 和 java.sql.Date存在一些区别,util.date用Date date = new Date(),util可以活动值,sql包必须给参数。
看来今天搞不定了,实在头大,休息了先。

———————————-这里!这里!我是下一个分割线T。T——————————–

接昨天的话。今儿请教了一下师兄们。算是解决了这个问题。
回头看这事的出现到解决,其实问题蛮多的。大致可分为
1. java.sql.Date 和 java.util.Date包之间的区别
2. 日期的类型转换之间的问题,String、Date、Long、Timestamp
3. 日期的格式化转变问题
—-这么些个问题堆在一起,让小白我感觉错综复杂,以致于烦躁、慌乱,解决问题的方向也发生偏差。好比这日期的格式化转变,我把它和类型转换一起做,甚至于还没搞明白什么类型就开始格式转换,绕来绕去得不到想要的结果。

今儿,翻看了一遍,问题本源是–“数据库在插入date类型的date时会出现时分秒丢失”造成的,而非date的类型转换导致。以下的内容就是如何保证date的插入和提取都带有时分秒;

正题开始:回忆下昨天的结果是获得了一个Date型的格林威治时间,插入数据库就只剩下年月日了,提取显示出来也只有年月日。我做的这个系统,把时间从获取到显示一共是经历了这么些步骤:
1.用户触发某事件后,系统来获取当前时间

      ly.setDate(new Date(System.currentTimeMillis())); ```

2.之后转到DB类的addInfo()方法,向数据库里插入日期,我是用prepareStatement执行的SQL语句

    static PreparedStatement pstmt;
    pstmt.setDate(1,new Date(System.currentTimeMillis()));

3.插入后再从数据库读出来,用DB.findInfo()方法

     ly.setDate(rs.getDate(1));

4.然后main.jsp上获取显示,等于是这么4个步骤

<td><%=ly.getUserId()%></td>

现在分析步骤1这里的date值是OK的,date类型的包含时分秒的时间,然后到了步骤2,插入可以看到数据库没有时分秒了,这里查询了下。

java.sql.date 是为了数据库而设计的 是java.util.date 的子类。 数据库有date和datetime类型,前者是不带时分秒,后者带时分秒。此外不管是java.sql.date还是 java.util.date 存储为date是会丢失时分秒! java.sql.date 中1.如果数据库使用的是 getDate() 无疑没有时分秒,因为数据库没有 2.如果数据库使用的是getTimestamp,时分秒就不会丢失

我们可以看到不管是java.sql.date还是 java.util.date下把Date类型的date值,直接插入数据库确实会丢失掉时分秒。问题出在这里,就得百度想对策了,这时候发现同上文说的一样,可以用Timestamp来做,改成如下

ly.setDate(new Timestamp(System.currentTimeMillis()));

这里先贴一下两个方法,

    private Date date;
    public Date getDate() {
        return date;
    }
    public void setDate(Date date) {
        this.date = date;

可以看到之前这里date的get和set方法都是用Date类型来做的,现在既然改成Timestamp型了,这里也得更改

    private Timestamp timestamp;
    public Timestamp getDate() {
        return timestamp;
    }
    public void setDate(Timestamp timestamp) {
        this.timestamp = timestamp;
    }

这一下步骤1又OK了,可以插入了,然后还得改下步骤2的方法,pstmt的setDate() 得改成前面谈到的 setTimestamp()

    pstmt.setTimestamp(1,new Date(System.currentTimeMillis()));

到了这里,写入部分OK了。做读取的话,我们还要继续修改步骤3,要把setDate改了,如下做相应的修改。

ly.setDate(rs.getTimestamp(3));

写完后运行应该OK了,不过会发现时间的精度好高,如这样:2016-03-16 15:23:07.223
这里我们再做转化,DB类中写一个dateChange()格式转化方法

public String dateChange(Timestamp timestamp){
            try {
                SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String ss = sdf.format(timestamp);
                return ss;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

用SimpleDateFormat对象设置自定义的时间格式,调用format()方法转换出结果(这里结果是String型),然后步骤4改成

<td><%=new DB().dateChange(ly.getDate())%></td>

到这里就一切OK啦~输出时间格式:2016-03-16 15:23:07

  • 参考文章
  • java.sql.date的时分秒去哪里了?
  • 关于PreparedStatement插入Date类型值的方法
  • Java:String和Date、Timestamp之间的转换

哎呀呀~真的感觉写一篇记录解决问题的博客确实不如总结知识点来的轻巧~~之前的语序好乱,改了半天,希望可以帮到一些遇到同样问题的朋友们。如有问题,欢迎留言~谢谢~

参与评论 您还未登录,请先 登录 后发表或查看评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

箫沐予

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值