二进制数据
mysql提供了四种类型来存储二进制数据:
TinyBlob 最多可存储255字节
Blob 最多可存储65KB
MediumBlob 最多可存储16MB
LongBlob 最多可存储4GB
1 //从properties文件中加载数据库配置
2 Properties properties = newProperties();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() 即可。