date数据存入mysql_Date对象存入mysql数据库

本文详细解析了Java中处理日期时间的API,包括java.sql.Date、java.sql.Time、java.sql.Timestamp的区别与应用,以及如何正确地转换和使用这些类来确保与数据库交互时的数据准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java.sql.Date,java.sql.Time和java.sql.Timestamp三个都是java.util.Date的子类(包装类)。

java.sql.Date是java.util.Date的子类,是一个包装了毫秒值的瘦包装器,允许 JDBC 将毫秒值标识为 SQL DATE 值。毫秒值表示自 1970 年 1 月 1 日 00:00:00 GMT 以来经过的毫秒数。 为了与 SQL DATE 的定义一致,由 java.sql.Date 实例包装的毫秒值必须通过将时间、分钟、秒和毫秒设置为与该实例相关的特定时区中的零来“规范化”。

说白了,java.sql.Date就是与数据库Date相对应的一个类型,而java.util.Date是纯java的Date。

从类 java.util.Date 继承的方法

after, before, clone, compareTo, equals, getDate, getDay, getMonth, getTime, getTimezoneOffset, getYear, hashCode, parse, setDate, setMonth, setYear, toGMTString, toLocaleString, UTC

sql.Date也有时间的

如果不想用oracle的to_date函数,可以自己生成sql.Date对象

String s = "2012-06-21 00:10:00";

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

java.util.Date d1 = sdf.parse(s); //先把字符串转为util.Date对象

java.sql.Date d2 = new java.sql.Date(d1.getTime()); //再转换为sql.Date对象

想要将带时分秒的时间插入到数据库中,除了Oracle数据库的to_date()方法之外。我们可以用 Timestamp类来实现。java.sql.Date是规范化之后的时间,其时分秒部分被截取掉了。

java.sql.Date是为了配合SQL DATE而设置的数据类型。“规范化”的java.sql.Date只包含年月日信息,时分秒毫秒都会清零。格式类似:YYYY-MM-DD。当我们调用ResultSet的getDate()方法来获得返回值时,java程序会参照"规范"的java.sql.Date来格式化数据库中的数值。因此,如果数据库中存在的非规范化部分的信息将会被劫取。

在sun提供的ResultSet.java中这样对getDate进行注释的:

Retrieves the of the designated column in the current row of this ResultSet object as a “java.sql.Date” object in the Java programming language.

同理。如果我们把一个java.sql.Date值通过PrepareStatement的setDate方法存入数据库时,java程序会对传入的java.sql.Date规范化,非规范化的部分将会被劫取。然而,我们java.sql.Date一般由java.util.Date转换过来,如:java.sql.Date sqlDate=new java.sql.Date(new java.util.Date().getTime()).

显然,这样转换过来的java.sql.Date往往不是一个规范的java.sql.Date.要保存java.util.Date的精确值,

我们需要利用java.sql.Timestamp.

eg:

  String s="2012-01-02 03:12:21";

SimpleDateFormat sp = newSimpleDateFormat("yyyy-MM-dd hh:mm:ss");

java.util.Date du = sp.parse(s);

java.sql.Timestamp st = newjava.sql.Timestamp(du.getTime());

把一个日期值写入数据库中,发现由java.util.Date转存为java.sql.Date后,只有年月日,没有了时分秒:

java.util.Date ud =newjava.util.Date();

java.sql.Date sd =newjava.sql.Date(ud.getTime());

这个可是不行的,用户至少要精确到分。由于java.sql.Date为了能够遵守sql日期标准,把所有时分秒都归了零。只有用Timestamp来进行保存,由于Timestamp是子类,因此写好的bean里面不需要修改数据类型。

pstmt.setTimestamp(15,newjava.sql.Timestamp(Calendar.getInstance().getTime().getTime()));//当前时间

pstmt.setTimestamp(16,newjava.sql.Timestamp(userFile.getCreateTime().getTime()));//指定时间

对于指定时间还可以用Calendar类的setTime()方法来设置

Calendar cal = Calendar.getInstance();

System.out.println(cal.getTime().getTime());

String string="2012-01-01 01:02:03";

SimpleDateFormat sp = newSimpleDateFormat("yyyy-MM-dd hh:mm:ss");

java.util.Date da = sp.parse(string);

cal.setTime(da);

System.out.println(cal.getTime().getTime());

在数据库中插入带时分秒的时间需要用Timestamp。一般做这种操作用框架居多,我就说一下Hibernate吧。在数据库表中字段类型设置为Date数据类型,代码中映射的字段类型设置为 Timestamp类型, private Timestamp date;  在映射文件中 Type也是时间戳类型的。在赋值取值的时候用前面的操作获取到需要的时间的时间戳对象直接赋值就行。然后就可以用Hibernate执行方法将带时分秒的时间存入到数据库里了。(不过这一点意义好像不是很大,大多都是直接varchar2存进去,取时候再to_date一下或者在代码里处理)

还需要说一点的就是

在使用SimpleDateFormat时格式化时间的 yyyy.MM.dd 为年月日而如果希望格式化时间为12小时制的,则使用hh:mm:ss如果希望格式化时间为24小时制的,则使用HH:mm:ss,上代码:

SimpleDateFormat ss =newSimpleDateFormat("yyyy-MM-dd hh:mm:ss");//12小时制

SimpleDateFormat sdformat =newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");//24小时制

Date d =newDate();

SimpleDateFormat ss = newSimpleDateFormat("yyyy-MM-dd hh:mm:ss");//12小时制

System.out.println(ss.format(d));

Date date = newDate();

SimpleDateFormat sdformat = newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");//24小时制

String LgTime = sdformat.format(date);

System.out.println(LgTime);

结果为

2008-05-2801:32:54

2008-05-2813:32:54

Date类,已经很少用了。更多使用的是Calendar

Calendar    date    =    Calendar.getInstance();

date.get(Calendar.HOUR_OF_DAY    );//得到24小时机制的

date.get(Calendar.HOUR);//    得到12小时机制的

### 物联网设备数据存储至MySQL #### 设计表结构 为了有效地将物联网设备的数据(即物模型)存入 MySQL 数据库,合理的表结构设计至关重要。考虑到不同类型的传感器可能发送不同类型数据,建议采用一种灵活的设计方式来适应多种情况。 对于基本的 IoT 数据记录,可以创建一张名为 `iot_data` 的表格用于保存来自各个设备的时间戳、测量值以及其他元信息: ```sql CREATE TABLE iot_data ( id INT AUTO_INCREMENT PRIMARY KEY, device_id VARCHAR(50), -- 设备唯一标识符 timestamp DATETIME, -- 记录时间 metric_name VARCHAR(100), -- 测量指标名称 (温度/湿度...) value DOUBLE -- 实际读数 ); ``` 如果存在多个属性或复杂对象,则可以通过扩展此模式或将它们拆分为单独的相关联表来进行更精细管理[^1]。 #### 插入数据的方法 针对批量插入操作效率问题,在 Python 中利用 faker 库模拟生成大量符合约束条件的信息并一次性提交给数据库是一种常见做法。下面是一个简单的例子展示如何通过 pymysql 驱动程序执行多行 INSERT 语句: ```python import pymysql from faker import Faker fake = Faker() conn = pymysql.connect( host='localhost', user='root', password='password', database='testdb' ) try: with conn.cursor() as cursor: sql = "INSERT INTO iot_data(device_id, timestamp, metric_name, value) VALUES (%s,%s,%s,%s)" data_points = [ ('device_001', fake.date_time_this_year(), 'temperature', round(fake.pyfloat(min_value=-40,max_value=80),2)), ('device_002', fake.date_time_this_month(), 'humidity', round(fake.random.uniform(0,100),2)) # 可继续添加更多条目... ] result = cursor.executemany(sql,data_points) conn.commit() finally: conn.close() ``` 上述脚本会向 `iot_data` 表中插入两条新纪录,每一条代表一次由特定装置收集到的不同种类环境参数采样结果[^4]。 另外,也可以考虑使用 CSV 文件作为中间媒介,先准备好要加载的内容再借助 LOAD DATA INFILE 命令快速完成大批量导入工作。这种方式特别适合处理那些已经存在于外部文件系统上的现成资料集。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值