• JDBC向数据库中插入BLOB类型数据


    1.Blob介绍

    Blob是一种二进制数据文件,分为TinyBlob,Blob,MediumBlob,LongBlob四种类型。每种类型之间的差距是存储的内容大小不同。需要注意的是,向数据库中插入大量的Blob数据会导致性能下降。

    2.使用PreparedStatement向数据表中插入Blob类型字段

    步骤

    ①获取连接。

    ②编写SQL语句。

    ③预编译SQL语句。

    ④填充占位符。(在填写Blob类型数据时,使用setBlob(int index,InputStream in)来填写)

    ⑤执行SQL语句。

    示例:创建数据表,具有两个字段分别是name和photo,向其中插入name=“小张”和添加照片。

    1. package lib;
    2. import java.io.FileInputStream;
    3. import java.io.FileNotFoundException;
    4. import java.io.IOException;
    5. import java.io.InputStream;
    6. import java.sql.Connection;
    7. import java.sql.DriverManager;
    8. import java.sql.PreparedStatement;
    9. import java.sql.SQLException;
    10. import java.util.Properties;
    11. public class Test1 {
    12. public static void main(String[] args) {
    13. InputStream is=null;
    14. Connection connection=null;
    15. InputStream iStream=null;
    16. try {
    17. //加载配置文件
    18. is=Test1.class.getClassLoader().getResourceAsStream("test.properties");
    19. Properties properties=new Properties();
    20. properties.load(is);
    21. String user=properties.getProperty("user");
    22. String password=properties.getProperty("password");
    23. String url=properties.getProperty("url");
    24. String driver=properties.getProperty("driver");
    25. //加载驱动
    26. Class.forName(driver);
    27. //获取连接
    28. connection=DriverManager.getConnection(url, user, password);
    29. //删除旧表
    30. String sql="drop table test";
    31. PreparedStatement ps=connection.prepareStatement(sql);
    32. ps.execute();
    33. //创建新表
    34. sql="create table test (`name` varchar(10),photo Blob default null)";
    35. ps=connection.prepareStatement(sql);
    36. ps.execute();
    37. //插入数据
    38. sql="update test set photo=? where `name`=?";
    39. ps=connection.prepareStatement(sql);
    40. //使用setBlob()插入图片数据
    41. iStream=new FileInputStream("头像.jpeg");
    42. ps.setBlob(1, iStream);
    43. ps.setObject(2, "小张");
    44. ps.execute();
    45. } catch (Exception e) {
    46. e.printStackTrace();
    47. }finally {
    48. //关闭资源
    49. try {
    50. is.close();
    51. } catch (IOException e) {
    52. e.printStackTrace();
    53. }
    54. try {
    55. connection.close();
    56. } catch (SQLException e) {
    57. e.printStackTrace();
    58. }
    59. try {
    60. iStream.close();
    61. } catch (IOException e) {
    62. e.printStackTrace();
    63. }
    64. }
    65. }
    66. }

    3.从数据表中读取Blob类型数据

    步骤

    ①获取连接。

    ②编写SQL语句。

    ③预编译SQL语句,获取ResultSet对象。

    ④获取数据。(对于Blob类型数据,使用getBlob()方法获取一个Blob对象)。

    ⑤调用Blob对象的getBinaryStream()方法获取一个输入流。

    ⑥使用输出流将数据进行保存。

    示例:将上面添加的小张数据的头像保存到桌面。

    1. package lib;
    2. import java.io.FileInputStream;
    3. import java.io.FileNotFoundException;
    4. import java.io.FileOutputStream;
    5. import java.io.IOException;
    6. import java.io.InputStream;
    7. import java.sql.Connection;
    8. import java.sql.DriverManager;
    9. import java.sql.PreparedStatement;
    10. import java.sql.ResultSet;
    11. import java.sql.SQLException;
    12. import java.util.Properties;
    13. import com.mysql.cj.jdbc.Blob;
    14. public class Test1 {
    15. public static void main(String[] args) {
    16. InputStream is=null;
    17. Connection connection=null;
    18. FileOutputStream os=null;
    19. ResultSet rs=null;
    20. try {
    21. //加载配置文件
    22. is=Test1.class.getClassLoader().getResourceAsStream("test.properties");
    23. Properties properties=new Properties();
    24. properties.load(is);
    25. String user=properties.getProperty("user");
    26. String password=properties.getProperty("password");
    27. String url=properties.getProperty("url");
    28. String driver=properties.getProperty("driver");
    29. //加载驱动
    30. Class.forName(driver);
    31. //获取连接
    32. connection=DriverManager.getConnection(url, user, password);
    33. //获取数据
    34. String sql="select photo from test where `name`=?";
    35. PreparedStatement ps=connection.prepareStatement(sql);
    36. ps.setObject(1, "小张");
    37. rs=ps.executeQuery();
    38. if(rs.next()) {
    39. Blob blob=(Blob) rs.getBlob(1);
    40. //获取Blob对象的输入流
    41. is=blob.getBinaryStream();
    42. //创建指向桌面文件的流
    43. os=new FileOutputStream("C:\\Users\\13329\\Desktop\\头像.jpeg");
    44. //输出到桌面
    45. byte []data=new byte[1024];
    46. int len;
    47. int i=0;
    48. while((len=is.read(data))!=-1) {
    49. i++;
    50. os.write(data, 0, len);
    51. }
    52. }
    53. } catch (Exception e) {
    54. e.printStackTrace();
    55. }finally {
    56. //关闭资源
    57. try {
    58. is.close();
    59. } catch (IOException e) {
    60. e.printStackTrace();
    61. }
    62. try {
    63. connection.close();
    64. } catch (SQLException e) {
    65. e.printStackTrace();
    66. }
    67. try {
    68. os.close();
    69. } catch (IOException e) {
    70. e.printStackTrace();
    71. }
    72. }
    73. }
    74. }

    4.特殊情况说明

    插入指定的Blob类型数据后,可能会出现xxx too large的错误,此时需要在MySQL的安装目录下找到my.ini文件,加上如下配置参数:max_allowed_packet=16M。并且在修改后重启MySQL服务。(如果修改了还不能添加成功,请查看你插入的数据大小是否超过了你指定的数据类型的最大存储范围。)

  • 相关阅读:
    Kafka 线上性能调优
    yolov5添加ECA注意力机制
    信息系统项目管理师 第四版 第2章 信息技术发展
    K8S Pod控制器详细讲解
    USB /OTG 接线
    [激光原理与应用-36]:《光电检测技术-3》- 光学测量基础 - 光电效应与光电探测器的基本原理
    忠实数 马蹄集
    骗子查询系统源码
    ASCII_Util.java
    C语言”三子棋“升级版(模式选择+”模拟智能“下棋)
  • 原文地址:https://blog.csdn.net/m0_71987537/article/details/125598530