关于BLOB数据类型

最后更新:2023-10-18 20:17:10 | 状态:未完成
以下需要打开ConfigTable.IS_AUTO_CHECK_METADATA = true;有效
1.通常情况下数据库的blob类型会对应entity的byte[]类型

这种情况下查询和更新都可以正常的相互转换。
如employee.setRemark(remark.getBytes());
service.save(employee);


2.有些情况下数据库是blob类型,而entity的属性是String类型

2.1 db > java 
参考BeanUtil.setFieldValue(Object obj, Field field, Column column, Object value)

在查询时,会把查询结果的byte[]执行base64编码后赋值给entity属性,Base64Util.encode(bytes)


为什么不直接field = new String(byte[])?
因为数据库中保存的不一定是String也有可能是Image

2.2 java > db
参考DefaultJDBCAdapter.convert(Column column, RunValue run)

2.2.1
在大多数情况下可以直接给String属性直接赋值,
如employee.setName("张三")
这时在执行update时会把employee.name.getBytes()保存到数据库

2.2.2
在极端情况下属性值有可能符合base64编码规则,如"abcd"这时就识别不出来是base64编码后的结果还是原始值
对于符合base64编码规则的值,在执行update前会先执行base64.decode(value).getBytes()再保存到数据库
在遇到这种情况时应该先进行base64编码再赋值才能在数据库中保存"abcd",如employee.setRemark(Base64Util.encode("abcd"))
当然在任何情况下都可以先把原始值进行base64编码,只在在确保原始值不符合base64编码规则的情况下才可以不执行base64编码直接给属性赋值

如以下两种方式都可以正常执行,因为值"张三"不会被误识别为base64编码结构
employee.setRemark("张三")
employee.setRemark(Base64Util.encode("张三"))




为什么要进行base64编码处理?
因为数据库中保存的不一定是String也有可能是Image或指纹虹膜等生物特征值,如果是String可以直接new String(bytes),否则new String就会乱码
所以对于String属性会先把byte[]经过base64编码后再赋值,如果业务逻辑中需要显示原始内容需要base64解码后再构造String如 new String(Base64Util.decode(value))(注意如果编码时指定了UTF-8之外的编码格式这里同样需要指定)

在保存到数据时为什么需要base64编码
因为从数据库中读取出来的值是经过base64编码过的,这时如果直接调用update,会用base64编码结果生成sql,所以生成sql的过程中默认按base64编码后的结果处理,也就是先进行base64解码再getBytes()保存到数据库
所以为了保持统一,在给属性赋值时也要先进行base64编码后再赋值,
当然在许多情况下可以识别出来值是否是base64格式,这时不经过base64编码直接给属性赋值SQL过程也可以正常处理


首页 最近更新 搜索 提交 回复