Java JDBC 操作二进制数据、日期时间
二进制数据
mysql提供了四种类型来存储二进制数据:
- TinyBlob 最多可存储255字节
- Blob 最多可存储65KB
- MediumBlob 最多可存储16MB
- LongBlob 最多可存储4GB
1 //从properties文件中加载数据库配置 2 Properties properties = new Properties(); 3 InputStream inputStream = Class.forName("test.Test").getResourceAsStream("/mysql.properties"); 4 properties.load(inputStream); 5 6 String driver = properties.getProperty("driver"); 7 String url = properties.getProperty("url"); 8 String user = properties.getProperty("user"); 9 String password = properties.getProperty("password"); 10 11 Class.forName(driver); 12 Connection connection = DriverManager.getConnection(url, user, password); 13 14 //插入 15 String sql1="insert into test_tb (id,blob_col) values (?,?)"; 16 PreparedStatement preparedStatement1 = connection.prepareStatement(sql1); 17 InputStream is = new FileInputStream("resource/a.png"); 18 preparedStatement1.setInt(1,1); 19 preparedStatement1.setBlob(2,is); //参数是InputStream型 20 preparedStatement1.executeUpdate(); 21 22 //查询 23 String sql2="select blob_col from test_tb where id=?"; 24 PreparedStatement preparedStatement2=connection.prepareStatement(sql2); 25 preparedStatement2.setInt(1,1); 26 ResultSet resultSet = preparedStatement2.executeQuery(); 27 if (resultSet.next()){ 28 FileOutputStream os=new FileOutputStream("resource/b.png"); 29 Blob blob = resultSet.getBlob("blob_col"); 30 InputStream binaryStream = blob.getBinaryStream(); 31 byte[] data=binaryStream.readAllBytes(); 32 os.write(data); 33 } 34 35 connection.close();
存储的只是文件中的数据,文件名需要使用单独的一列来保存。
一般我们是把文件上传到服务器上,数据库中存储文件路径。如果文件特别小,也可以直接存到数据库中。
日期
mysql中提供了date表示日期,格式:yyyy-mm-dd。
1 //插入 2 String sql1 = "insert into test_tb (date_col) values (?)"; 3 PreparedStatement preparedStatement1 = connection.prepareStatement(sql1); 4 Date date1 = new Date(System.currentTimeMillis()); //获取当前日期。使用当前时间的时间戳构造出日期 5 preparedStatement1.setDate(1,date1); 6 preparedStatement1.executeUpdate(); 7 8 //查询 9 String sql2 = "select date_col from test_tb"; 10 PreparedStatement preparedStatement2 = connection.prepareStatement(sql2); 11 ResultSet resultSet = preparedStatement2.executeQuery(); 12 while (resultSet.next()){ 13 Date date2 = resultSet.getDate("date_col"); 14 System.out.println(date2); 15 }
时间
mysql提供了time表示时间,格式:HH:mm:ss,hh是24小时制。
操作方法和日期的相同,把Date换为Time即可,也是使用System.currentTimeMillis()来构造。
与Date不同的是,Time还可以使用new java.util.Date().getTime()来构造。java.util.Date()构造的Date对象既包括当前日期,也包括当前时间。getTime()获取的是long型的时间戳。
日期时间
mysql提供了timestamp、datetime来存储日期时间,使用方式都差不多,格式都是:yyyy-mm-dd HH:mm:ss。
1 //插入 2 String sql1 = "insert into test_tb (timestamp_col) values (?)"; 3 PreparedStatement preparedStatement1 = connection.prepareStatement(sql1); 4 Timestamp timestamp1 = new Timestamp(System.currentTimeMillis()); //也可使用new Date().getTime()来构造 5 preparedStatement1.setTimestamp(1,timestamp1); 6 preparedStatement1.executeUpdate(); 7 8 9 //查询 10 String sql2 = "select timestamp_col from test_tb"; 11 PreparedStatement preparedStatement2 = connection.prepareStatement(sql2); 12 ResultSet resultSet = preparedStatement2.executeQuery(); 13 while (resultSet.next()){ 14 Timestamp timestamps2 = resultSet.getTimestamp("timestamp_col"); 15 16 Date date=new Date(timestamps2.getTime()); //此句的Date是java.util.Date 17 System.out.println(date); //Sun Aug 18 18:56:35 CST 2019的形式,不友好 18 19 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-mm-dd HH:mm:ss"); 20 String formatDT = sdf.format(timestamps2); //使用指定的格式来格式化,参数可以是Timestamp、long型的时间戳、Date 21 System.out.println(formatDT); //2019-08-18 19:06:06 22 }
也可以使用2列来存储,一列存储Date,一列存储Time。
未说明类型的Date、Time、Timestamp,是java.sql包下的。
new Date().getTime()的Date是java.util.Date,默认取当前日期时间,java.sql.Date的构造函数是需要参数的。
datetime、timestamp的异同点
- 存储格式都是yyyy-mm-dd HH:mm:ss
- datetime占用8个字节,timestamp占用4个字节
- 因为占用的字节数不同,能表示的时间日期范围不一样。timestamp:1970-01-01 00:00:01 ~ 2038-01-19 , datetime范围:1000-01-01 00:00:00 ~ 9999-12-31 23:59:59。
很多时候使用timestamp就够了,对数据库空间的利用率高。
有些字段需要使用系统当前时间,比如添加一个用户时,可能要用字段create_time来记录当前时间,设置默认值为now() 即可。