up:: JDBC基于JavaBean实体类实现分页数据封装
本篇博客的代码沿用上篇博客JDBC基于JavaBean实体类实现分页数据封装中的代码;
一.数据库中日期类型说明:
(1)MySQL中date和datetime类型是可兼容的;
(2)java程序给数据库的日期字段赋值的时候,只有setDate()方法,而没有setDateTime()方法 ;
二:从数据库中读取日期数据
1.首先,在JavaBean:Employee类中,添加日期属性hiredate:类型是java.util.Date
2.然后,在PaginationCommand类中添加:数据库中获取的日期类型是java.sql.Date
同时,在employee属性赋值的时候:
这是因为:java.sql包下的Date类型,继承自,java.util包下的Date类型:所以,在进行 数据提取的时候,这两者是互相兼容的 ;
上面读取的过程,实际是把从数据库读到的java.sql.Date类型,赋值给java.util.Date类型;因为java.sql.Date类型继承自java.util.Date类型,所以这个是没有问题的。
三: 向数据库中添加日期数据
那么再向数据库表中更新数据的时候,怎么处理?
比如从前端传过来一个日期变量,大概率是String字符串,这个日期字符串如何存储到数据库中?
InsertCommand类:
package com.imooc.jdbc.hrapp.command;
import com.imooc.jdbc.common.DbUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Scanner;
public class InsertCommand implements Command{
@Override
public void execute() {
Scanner in = new Scanner(System.in);
System.out.println("请输入员工编号:");
int eno = in.nextInt();
System.out.println("请输入员工姓名");
String ename = in.next();
System.out.println("请输入员工薪资:");
Float salary = in.nextFloat();
System.out.println("请输入隶属部门:");
String dname = in.next();
System.out.println("请输入入职日期:");
String strHiredate = in.next();
// String类型到java.sql.Date,分两步
//1.String转为java.util.Date;
java.util.Date udHiredate = null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
udHiredate = sdf.parse(strHiredate);
} catch (ParseException e) {
e.printStackTrace();
}
//2.将java.util.Date转为java.sql.Date;
Long time = udHiredate.getTime();//getTime()方法是获取从1970年到现在的毫秒数;
java.sql.Date sdHiredate = new java.sql.Date(time);//java.sql.Date支持在构造函数中传入一个1970年的毫秒数的;
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = DbUtils.getConnection();
String sql = "insert into employee(eno,ename,salary,dname,hiredate) values(?,?,?,?,?)";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1,eno);
pstmt.setString(2,ename);
pstmt.setFloat(3, salary);
pstmt.setString(4, dname);
pstmt.setDate(5,sdHiredate); // java.sql.Date
int cnt = pstmt.executeUpdate();
System.out.println(cnt);
System.out.println(dname+"员工入职手续已办理。");
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally {
DbUtils.closeConnection(null, pstmt, conn);
}
}
}
核心就是: 先把日期字符串转成java.util.Date格式;然后获得时期的毫秒数;然后把毫秒数转成java.sql.Date格式。