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格式。