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 对象
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 代码 珍藏代码 XM 返佣 https://www.kaifx.cn/broker/x…
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 的待垃圾回收是无奈通过代码本人管制的,而是由虚拟机管制的。