服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - Mysql存储二进制对象数据问题

Mysql存储二进制对象数据问题

2023-03-15 16:56码农的诞生 Mysql

这篇文章主要介绍了Mysql存储二进制对象数据问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Mysql存储二进制对象数据

首先数据库存储一个Object对象

需要在数据库表中定义一个blob类型的字段

Mysql存储二进制对象数据问题

与数据库对应的实体类

Mysql存储二进制对象数据问题

编写一个操作二进制的工具类

  1. import java.io.*;
  2.  
  3. /**
  4. * byte[]类型操作类
  5. */
  6. public class BlobUtil {
  7.  
  8. /**
  9. * 把object对象序列化为二进制字节数组
  10. * @param object
  11. * @return
  12. */
  13. public static byte[] setObject(Object object) {
  14. ByteArrayOutputStream baos = null;
  15. ObjectOutputStream out = null;
  16. try {
  17. baos = new ByteArrayOutputStream();
  18. out = new ObjectOutputStream(baos);
  19. out.writeObject(object);
  20. } catch (Exception e) {
  21. e.printStackTrace();
  22. } finally {
  23. if (out != null) {
  24. try {
  25. out.close();
  26. } catch (IOException e) {
  27. e.printStackTrace();
  28. }
  29. }
  30. if (baos != null) {
  31. try {
  32. baos.close();
  33. } catch (IOException e) {
  34. e.printStackTrace();
  35. }
  36. }
  37. }
  38. return baos.toByteArray();
  39. }
  40.  
  41. /**
  42. * 把二进制字节数组反序列化为object对象
  43. * object当中的每个javaBean对象都必须实现序列化
  44. * 最外层的类必须生成一个序列化ID
  45. * @param bytes
  46. * @return
  47. */
  48. public static Object getObject(byte[] bytes) {
  49. Object obj = null;
  50. ByteArrayInputStream bais = null;
  51. ObjectInputStream in = null;
  52. try {
  53. bais = new ByteArrayInputStream(bytes);
  54. in = new ObjectInputStream(bais);
  55. obj = in.readObject();
  56. } catch (Exception e) {
  57. e.printStackTrace();
  58. } finally {
  59. if (in != null) {
  60. try {
  61. in.close();
  62. } catch (IOException e) {
  63. e.printStackTrace();
  64. }
  65. }
  66. if (bais != null) {
  67. try {
  68. bais.close();
  69. } catch (IOException e) {
  70. e.printStackTrace();
  71. }
  72. }
  73. }
  74. return obj;
  75. }
  76. }

需要转换为byte[]的对象必须实现序列化和生成一个序列化ID,生成一个序列化ID是为了解决类当中一但有修改,反序列化时序列化ID就会对应不上,如下图:

类中如果有其他类为变量也需要实现序列化,否则从数据库中取出数据然后反序列化成Object对象的时候会直接报错

对user的数据进行操作

  1. import java.io.Serializable;
  2.  
  3. /**
  4. * @author
  5. * @description
  6. * @date
  7. */
  8. public class UserVO implements Serializable {
  9.  
  10. private static final long serialVersionUID = 1L;
  11.  
  12. private String userId;
  13.  
  14. private String userName;
  15.  
  16. private String password;
  17.  
  18. public String getUserId() {
  19. return userId;
  20. }
  21.  
  22. public void setUserId(String userId) {
  23. this.userId = userId;
  24. }
  25.  
  26. public String getUserName() {
  27. return userName;
  28. }
  29.  
  30. public void setUserName(String userName) {
  31. this.userName = userName;
  32. }
  33.  
  34. public String getPassword() {
  35. return password;
  36. }
  37.  
  38. public void setPassword(String password) {
  39. this.password = password;
  40. }
  41. }

调用二进制工具类来转换数据然后进行存取就可以了。

测试功能

  1. public class TestMain {
  2.  
  3. public static void main(String[] args) {
  4. UserVO user = new UserVO();
  5. user.setUserId("123456");
  6. user.setUserName("张三");
  7. byte[] dataValue = BlobUtil.setObject(user);
  8. System.out.println("=====对象转换成blob类型数据====="+Arrays.toString(dataValue));
  9. UserVO userVO = (UserVO) BlobUtil.getObject(dataValue);
  10. System.out.println("=====blob类型数据转换成对象====="+ JSONObject.toJSONString(userVO));
  11. }
  12. }

打印输出

=====对象转换成blob类型数据=====[-84, -19, 0, 5, 115, 114, 0, 53, 99, 111, 109, 46, 100, 111, 108, 112, 104, 105, 110, 46, 109, 111, 100, 117, 108, 101, 115, 46, 116, 109, 115, 46, 100, 111, 109, 97, 105, 110, 46, 99, 117, 115, 116, 111, 109, 101, 114, 115, 101, 114, 118, 105, 99, 101, 46, 85, 115, 101, 114, 86, 79, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 3, 76, 0, 8, 112, 97, 115, 115, 119, 111, 114, 100, 116, 0, 18, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 76, 0, 6, 117, 115, 101, 114, 73, 100, 113, 0, 126, 0, 1, 76, 0, 8, 117, 115, 101, 114, 78, 97, 109, 101, 113, 0, 126, 0, 1, 120, 112, 112, 116, 0, 6, 49, 50, 51, 52, 53, 54, 116, 0, 6, -27, -68, -96, -28, -72, -119] =====blob类型数据转换成对象====={"userId":"123456","userName":"张三"}

Mysql存储二进制大型对象类型对照

MySql MediumBlob——MySql的Bolb四种类型

MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。

BLOB类型实际是个类型系列(TinyBlob、Blob、MediumBlob、LongBlob),除了在存储的最大信息量上不同外,他们是等同的。

Mysql存储二进制对象数据问题

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/m0_37845840/article/details/82694081

延伸 · 阅读

精彩推荐