经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MySQL » 查看文章
Mysql存储二进制对象数据问题
来源:jb51  时间:2023/3/15 8:52:36  对本文有异议

Mysql存储二进制对象数据

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

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

与数据库对应的实体类

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

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

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

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

对user的数据进行操作

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

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

测试功能

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

打印输出

=====对象转换成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),除了在存储的最大信息量上不同外,他们是等同的。

在这里插入图片描述

总结

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号