A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Java中针对Timestamp的数据类型操作
数据库使用Oracle 10g 32位,存在一张表STU(学生表)。
这里写图片描述

二、项目结构图
这里写图片描述

三、关键代码
Stu (bean)

package sample.bean;

import java.sql.Timestamp;

public class Stu {

    private int stuNo;
    private String stuName;
    private Timestamp createTime;

    public int getStuNo() {
        return stuNo;
    }
    public void setStuNo(int stuNo) {
        this.stuNo = stuNo;
    }
    public String getStuName() {
        return stuName;
    }
    public void setStuName(String stuName) {
        this.stuName = stuName;
    }
    public Timestamp getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Timestamp createTime) {
        this.createTime = createTime;
    }

}

StuDao

public class StuDao {

    /**
     * 插入stu表记录(PreparedStatement),效率更高,更安全
     */
     public void testInsertStuPs(Stu stu) {
        Connection conn = DBUtil.getConnection(); // 创建数据库连接
        PreparedStatement ps = null;// 创建PreparedStatement对象
        try {
            System.out.println("=========连接成功===============");
            String sql = "insert into stu values(?,?,?)";
            ps = conn.prepareStatement(sql); // 获取PreparedStatement对象
            ps.setInt(1, stu.getStuNo());
            ps.setString(2, stu.getStuName());
            ps.setTimestamp(3, stu.getCreateTime());

            int rs = ps.executeUpdate();// 执行更新语句
            if (rs != 0) {
                System.out.println("insert success");
            } else {
                System.out.println("insert fail");
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.closePreparedStatement(ps);
            DBUtil.closeConnection(conn);
        }
    }

     /**
     * 查询stu表记录
     */
    public Stu testSelectStuByNo(int stuNo) {
        Connection conn = DBUtil.getConnection(); // 创建数据库连接
        PreparedStatement statement = null;// 创建statement对象
        ResultSet result = null;// 创建结果集ResultSet
        Stu stu = new Stu();
        try {
            String sql = "select * from stu where stuno=?";
            statement = conn.prepareStatement(sql); // 获取PreparedStatement对象Axitrader返佣https://www.kaifx.cn/broker/axitrader.html
            statement.setInt(1, stuNo);
            result = statement.executeQuery();
            if (result.next()) {
                stu.setStuNo(result.getInt(1));
                stu.setStuName(result.getString(2));
                stu.setCreateTime(result.getTimestamp(3));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.closeResultSet(result);
            DBUtil.closePreparedStatement(statement);
            DBUtil.closeConnection(conn);
new Date().getTime();  
最近做监控系统,发现代码中有前两种方法,然后突然有了一个想法,到底哪个更快呢?

然后做了如下实验:



Java代码  收藏代码
import java.util.Calendar;  
import java.util.Date;  

public class TimeTest {  
    private static long _TEN_THOUSAND=10000;  
    public static void main(String[] args) {  
        long times=1000*_TEN_THOUSAND;  
        long t1=System.currentTimeMillis();  
        testSystem(times);  
        long t2=System.currentTimeMillis();  
        System.out.println(t2-t1);  
        testCalander(times);  
        long t3=System.currentTimeMillis();  
        System.out.println(t3-t2);  
        testDate(times);  
        long t4=System.currentTimeMillis();  
        System.out.println(t4-t3);  
    }  

    public static void testSystem(long times){//use 188  
        for(int i=0;i<times;i++){  
            long currentTime=System.currentTimeMillis();  
        }  
    }  

    public static void testCalander(long times){//use 6299  
        for(int i=0;i<times;i++){  
            long currentTime=Calendar.getInstance().getTimeInMillis();  
        }  
    }  

    public static void testDat该方法的含义是,表示定时器将延迟delay(毫秒)时间后,执行task任务。如果delay为负数或0,则任务会被立即进行。而且是一次性的执行任务,后续不会重复(或定时)执行该任务。

对于Timer类,还提供一个同样功能的方法,如下: 







1

public void schedule(TimerTask task, Date time)





该方法与上面方法的区别是,上面方法是指定延期一段时间执行,这个方法是指定在某个具体的时间点执行。注意,如果系统的当前时间已经超过了参数time指定的时间,该任务会被立即执行。

当运行上面代码时,我们发现程序立即打印类似如下的2条信息:


main start:2016-01-13 22:23:18
task   run:2016-01-13 22:23:18

因为我们这里给schedule方法传递的delay参数值为0,所以任务会被立即执行,所以两个语句打印出来的时间是一样的,这是应该的。大家可以自己改变传入的delay值来看输出信息的变化。再过大约5秒(即sleep的时间)后,继续打印了1条信息:

main   end:2016-01-13 22:23:23

打印信息的时间与上面语句差了5秒,与sleep设置的一致,也是很合理的。

但我们会发现一个很有趣的现象,会发现该进程不会退出,这时main主线程已经结束了,这说明定时器把任务完成后,即使后面没有待等待执行的任务了,定时器中创建的后台线程也不会立即退出。查看了相关的java doc文档,解释说定时器线程不会主动退出,需要等待垃圾回收,但java的待垃圾回收是无法通过代码自己控制的,而是由虚拟机控制的。


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马