在Java代码中,java.sql包原则上不能出现在DAO以外的地方。
数据库和java中的时间类型的对应关系
DATE->java.sql.Date
TIME->java.sql.Time
TIMESTAMP->java.sql.Timestamp
java.sql包下给出三个与数据库相关的日期时间类型,分别是:
- Date:表示日期,只有年月日,没有时分秒。会丢失时间;
- Time:表示时间,只有时分秒,没有年月日。会丢失日期;
- Timestamp:表示时间戳,有年月日时分秒,以及毫秒。
Java中除了DAO以外的其他地方用到数据库对应的时间类型怎么办?例如domain部分(数据库对应的实体类:User)
这就需要将java.util.Date与java.sql.Date、java.sql.Time、java.sql.Timestamp之间进行转换
通过查看文档可知,java.util.Date是java.sql.Date、java.sql.Time、java.sql.Timestamp父类
java.sql.Date、Time、Timestamp -> java.util.Date
- 这一步不需要处理了:因为java.util.Date父类;
java.util.Date -> java.sql.Date、Time、Timestamp
- java.sql.Date、Time、Timestamp都拥有一个含有一个long类型的参数,代表毫秒值的构造函数
- 把util的Date转换成毫秒值
实例代码:
先在mysql中建立一张表
CREATE TABLE `dateTest` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`d` date ,
`t` time ,
`ts` timestamp ,
PRIMARY KEY (`id`)
);
在src目录下新建一个配置文件:jdbc.properties
diverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://locahost:3306/sql_test?useUnicode=true&characterEncoding=UTF8
username=root
password=123456
添加一个数据库连接工具类:jdbcUtils.java
public class jdbcUtils {
private static final String dbconfig="jdbc.properties";
private static Properties properties=new Properties();
static {
try {
//获得jdbc配置文件流
InputStream is=jdbcUtils.class.getClassLoader().getResourceAsStream(dbconfig);
properties.load(is);
} catch (IOException e) {
throw new RuntimeException(e);
}
try {
Class.forName(properties.getProperty("diverClassName"));
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(properties.getProperty("url"),
properties.getProperty("username"),properties.getProperty("password"));
}
}
建立一个测试类:test.java
public class test {
@Test
public void fun1() throws SQLException {
//获取mysql 服务器的连接
Connection cn= jdbcUtils.getConnection();
String sql="insert into dateTest(d,t,ts) values(?,?,?)";
PreparedStatement ps=cn.prepareStatement(sql);
//创建一个java.util.Date对象,存放当前时间
java.util.Date date=new java.util.Date();
//因为java.sql.Date是java.util.Date子类
ps.setDate(1,new java.sql.Date(date.getTime()));//丢失时分
ps.setTime(2,new java.sql.Time(date.getTime()));//丢失年月
ps.setTimestamp(3,new java.sql.Timestamp(date.getTime()));
//执行
ps.executeUpdate();
}
@Test
public void fun2() throws SQLException {
//获取mysql 服务器的连接
Connection cn= jdbcUtils.getConnection();
String sql="select * from dateTest";
PreparedStatement ps=cn.prepareStatement(sql);
//创建一个java.util.Date对象,存放当前时间
java.util.Date date=new java.util.Date();
ResultSet rs=ps.executeQuery();
while(rs.next()){
java.util.Date d1=rs.getDate("d");
java.util.Date d2=rs.getDate("t");//因为只有时分,转换成年月就是起始时间:1970
java.util.Date d3=rs.getDate("ts");
System.out.println(d1+","+d2+","+d3);
}
}
}
结果:
数据中
控制台:
2019-03-24,1970-01-01,2019-03-24