文档章节

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

萧沐垚
 萧沐垚
发布于 2016/12/16 10:05
字数 1649
阅读 380
收藏 1

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

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

© 著作权归作者所有

萧沐垚
粉丝 3
博文 20
码字总数 22908
作品 0
南京
程序员
私信 提问
最近使用logstash遇到的问题(关于数据导入)

要求通过logstash从oracle中获取数据,然后相应的直接传入mysql中去。 基本测试成功的配置文件如下: input {    stdin {   }   jdbc {   jdbcconnectionstring => "jdbc:oracle:th...

&Legend
2018/08/05
0
0
java 时间戳和PHP时间戳 的转换 php time()

最近在弄discuz,数据库mysql,时间类型int 10 原文http://hi.baidu.com/yuquan0405/item/ec4f804ac7e01c08e935046c 总结一下java 时间戳和PHP时间戳 的转换问题: 由于精度不同,导致长度不一...

干死it
2013/08/04
2.4K
0
阿里、百度等多家公司Java面试记录与总结

算算自己大概面试了近十家公司,也拿到了几个Offer,现在面试告一段落,简单总结下面试经验。 我现在主要的方向是Java服务端开发,把遇到的问题和大家分享一下,也谈谈关于技术人员如何有方向...

2018/07/02
0
0
通过JDBC连接oracle数据库的几个技巧

  Java数据库连接(JDBC)API是一系列能够让Java编程人员访问数据库的接口,各个开发商的接口并不完全相同。以下是一些技巧,这些技巧能够使我们更好地发挥系统的性能和实现更多的功能。ora...

弱弱小男子
2013/08/29
100
0
java和mysql之间的时间日期类型传递

mysql(版本:5.1.50)的时间日期类型如下: datetime 8bytes xxxx-xx-xx xx:xx:xx 1000-01-01 00:00:00到9999-12-31 23:59:59 timestamp 4bytes xxxx-xx-xx xx:xx:xx 1970-01-01 00:00:01到......

为了美好的明天
2017/10/31
56
0

没有更多内容

加载失败,请刷新页面

加载更多

为什么要在网站中应用CDN加速?

1. 网页加载速度更快 在网站中使用CDN技术最直接的一个好处就是它可以加快网页的加载速度。首先,CDN加速的内容分发是基于服务器缓存的,由于CDN中缓存了不少数据,它能够给用户提供更快的页...

云漫网络Ruan
39分钟前
7
0
亚玛芬体育(Amer Sports)和信必优正式启动合作开发Movesense创新

亚玛芬体育和信必优正式启动合作开发Movesense创新,作为亚玛芬体育的完美技术搭档,信必优利用Movesense传感器技术为第三方开发移动应用和服务。 Movesense基于传感器技术和开放的API,测量...

symbiochina88
50分钟前
4
0
创龙TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA核心板规格书

SOM-TL437xF是一款广州创龙基于TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA芯片设计的核心板,采用沉金无铅工艺的10层板设计,适用于高速数据采集和处理系统、汽车导航、工业自动化等领...

Tronlong创龙
51分钟前
4
0
好程序员Java学习路线分享MyBatis之线程优化

  好程序员Java学习路线分享MyBatis之线程优化,我们的项目存在大量用户同时访问的情况,那么就会出现大量线程并发访问数据库,这样会带来线程同步问题,本章我们将讨论MyBatis的线程同步问...

好程序员官方
57分钟前
6
0
IDEA 自定义方法注解模板

IDEA 自定义方法注解模板 1、使用效果 /*** 计算交易费用* @Author wangjiafang* @Date 2019/9/11* @param feeComputeVo* @return*/@PostMapping("/v1/fee_compute")public ApiResp......

小白的成长
57分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部