问题描述
MySQL 数据库一个简单的表
CREATE TABLE `client_file` ( `fileId` bigint(20) NOT NULL AUTO_INCREMENT, `fileName` varchar(260) DEFAULT NULL, `isFolder` char(1) DEFAULT NULL, `fileTime` datetime DEFAULT NULL, PRIMARY KEY (`fileId`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
对于 fileTime 字段,如果使用 java.sql.PreparedStatement 的 setDate 方法,数据库会得到类似 '2011-10-26 00:00:00' 的结果,我们想要类似 '2011-10-26 17:12:50' 的记录。如何使用 JDBC 插入 Timestamp 值?不要使用数据库函数,如 MySQL sysdate。
解决办法
创建一个返回当前 timestamp 的函数,例如:
private static java.sql.Timestamp getCurrentTimeStamp() { java.util.Date today = new java.util.Date(); return new java.sql.Timestamp(today.getTime()); }
然后通过 preparedStatement.setTimestamp() 设置 timestamp:
String insertTableSQL = "INSERT INTO client_file" + "(fileName, isFolder, fileTime) VALUES" + "(?,?,?)"; preparedStatement = dbConnection.prepareStatement(insertTableSQL); preparedStatement.setTimestamp(3,getCurrentTimeStamp());
相关问题
如果想批量插入一些 client_file 记录呢?
可以用 java.sql.PreparedStatement 的 addBatch 依次添加多条记录:
public void insertClientFile(Connection conn, char from) { Random random = new Random(); String sql = "INSERT client_file (fileName, isFolder, fileTime) VALUES(?,?,?)"; PreparedStatement prest = null; try { conn.setAutoCommit(false); prest = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); // 每个用户 5000 个目录,5000 个文件 for (int x = 0; x < 5000; x++) { long fileTime = System.currentTimeMillis(); fileTime += random.nextInt(100000000); // 先加入一个 folder prest.setString(1, this.getFileName(from, random)); prest.setString(2, "1"); prest.setTimestamp(3, new Timestamp(fileTime)); prest.addBatch(); // 再加入一个 file prest.setString(1, this.getFileName(from, random)); prest.setString(2, "0"); prest.setTimestamp(3, new Timestamp(fileTime + random.nextInt(10000))); prest.addBatch(); } prest.executeBatch(); prest.close(); conn.commit(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
参考资料