目录
BLOB 简介
BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。简言之,是数据库中存储较大数据时使用的数据格式.
SSI架构简介
SSI架构是Spring(调配),Struts(分发),Ibatis(数据库)三者共同使用的简称.
BLOB 使用
BLOB 接收
在entity中使用byte数组去接收传递过来的数据.
private byte[] blobData;
public byte[] getBlobData() {
return blobData;
}
public void setBlobData(byte[] blobData) {
this.blobData = blobData;
}
在sqlMap中的resultMap中使用binary类型去接收查找出的数据.
<!-- 返回结果集 -->
<resultMap id="resultMap" class="com.sisi.entity.simpleEntity" >
<result column="BLOB_DATA" property="blobData" jdbcType="binary" />
</resultMap>
<!-- SQL语句 -->
<select id="simpleSql" resultMap="resultMap" parameterClass="java.util.Map" >
<![CDATA[
SELECT
BLOB_DATA AS BLOB_DATA,
FROM
TABLE_SIMPLE
WHERE
SIMPLE_ID = #simpleId#
]]>
</select>
BLOB 转换
整体思路就是将二进制转换为你之前存储进去的格式,因为在这块存储进去的时候就是使用四位十六进制代表一个数字,所以整体思路如下表.
数据格式 | 数据 | 数据解释 | 数据操作 | |
原数据 | 257 |
| 十转十六 | |
一个四位十六进制 | 0101 |
| 直接中间切开 | |
两个二位十六进制 | 01 | 01 |
| 分别十六转二 |
两个八位二进制 | 00000001 | 00000001 | 数据库中存储格式 | 二转字节流 |
byte[]字节数组 | 1 | 1 | entity中接收格式 | 字节流转十六 |
四个一位十六进制 | 0 1 0 1 |
| ||
一个四位十六进制 | 0101 |
| 十六转十 | |
十进制(原数据) | 257 |
|
|
从数据库到能用的十进制如下代码
//得到字节数组
byte[] byteArray =simpleData.get(0).getEntity().getBlobData();
//将字节数组转化为十六进制
String hexArray =byteArrayToHexArray(byteArray);
//十六进制转十进制
List<String> resultData = new ArrayList<String>();
int index;
String fourHex;//四位十六进制
String stringOneDecimal;//String类型的十进制(除以100并保留两位小数)
double oneDecimal;//原始十进制
for(index = 0;index < hexArray.length(); index+=4){
//合成原来的四位十六进制
fourHex=hexArray.substring(index,index+4);
//四位16进制转为十进制
oneDecimal = Integer.parseInt(fourHex,16);
//数据意义处理,除以100,然后只保留两位小数才有原来的意义
oneDecimal = oneDecimal*0.01;
stringOneDecimal = String.format("%.2f", oneDecimal);
//resultData为最终的十进制数组
resultData.add(stringOneDecimal);
}
private static final char[] HEX_CHAR = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
//得到十六进制
public static String byteArrayToHexArray(byte[] bytes) {
// 一个byte为8位,可用两个十六进制位标识
char[] buf = new char[bytes.length * 2];
int a = 0;
int index = 0;
// 使用除与取余进行转换
for(byte b : bytes) {
if(b < 0) {
a = 256 + b;
} else {
a = b;
}
//相当于转化为两位十六进制,实际是转化为两个一位十六进制,但是两个在一起才有十六进制的意义
buf[index++] = HEX_CHAR[a / 16];
buf[index++] = HEX_CHAR[a % 16];
}
return new String(buf);
}