1、存储Java对象的方法
下面有三种方式,可以存储Java对象。
- 1、将Java对象中的每一个字段都存入表中。
- 优点:每个字段都可以被检索
- 缺点:针对每个需要存储的对象,都要创建数据表。一个类对应一张表
- 2、将Java对象序列化之后,存入Blob字段或者Text。
- 优点:可以存储超大的对象,并且没有大小限制
- 缺点:Blob数据类型的缺点,检索上存在问题
- 3、保存为JSON字符串,使用VARCHAR数据类型存储
- 优点:可以存储完整的对象,反序列化也很方便。
- 缺点:不方便检索内容,需要提前估计JSON字符串大小。
- 场景:适合不需要检索,只用查询和存储展示。
- 4、MySQL 5.7 支持 json 类型存储。
第一种方法比较常规。
第二种方法,BLOB(Binary Large Object)与TEXT是为存储二进制大数据类型的,大多数情况下BLOB类型的列可以视为足够大的VARBINARY类型的列,采用二进制与字符串方式存储。BLOB和TEXT属于相同类型的数据,所以下面对BLOB和TEXT都简称BLOB。
BLOB的局限性:[2]
- 服务器不能在内存临时表中存储BLOB
- 查询涉及BLOB的值,会在磁盘上创建临时表,这样导致效率很低
- 通过SUBSTRING()函数,转化为VARCHAR
- 让临时表更快一些:把临时表放在基于内存的文件系统中。
- 维护成本高(数据量上来后后,添加字段和维护索引都需要耗费超长时间)
第三种方法,先将对象变成JASON对象,再将JSON字符串变成字符串,然后在数据表中用VARCHAR存储,需要确定对象的大小,以确定VARCHAR字段的大小。优点是需要用的时候,直接反序列化就行,但是检索起来不方便。适合的场景:存储一些不需要检索的字符串或对象,比如微信的模板消息,模板消息内容本身不需要被检索,能够被编辑、展示发送即可。
第四种方法请参考:[3]
2、参考文献
[1] 高性能MySQL(第3版)
[2] MySQL技术内幕:SQL编程
[3] 博客:mybatis存取mysql中的json