zoukankan      html  css  js  c++  java
  • 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() 即可。

  • 相关阅读:
    Java基础知识强化94:Calendar类之Calendar概述和获取日历字段的方法
    Java基础知识强化93:算一下你来到这个世界多少天的案例
    Java基础知识强化92:日期工具类的编写和测试案例
    Java基础知识强化91:DateFormat类之DateFormat实现日期和字符串的相互转换
    Java基础知识强化90:Date类之Data类中日期和毫秒相互转换
    Java基础知识强化89:Date类之Data类概述及其方法
    Java基础知识强化88:BigDecimal类之BigDecimal类引入和概述 以及 BigDecimal的使用(加减乘除)
    Java基础知识强化87:BigInteger类之BigInteger加减乘除法的使用
    Java基础知识强化86:BigInteger类之BigInteger概述和构造方法
    Java基础知识强化85:System类之arraycopy()方法(数组拷贝)
  • 原文地址:https://www.cnblogs.com/chy18883701161/p/11373517.html
Copyright © 2011-2022 走看看