需求:将对象序列化,保存到数据库中,数据库设计用blob数据类型,使用oracle数据库,使用hibernate保存blob大数据,ibatis查询blob大数据.
部分代码献上:
一、存:
1、要保存的类:class SaveQueryBO implements Serializable
2、将对象转换成blob格式:Blob saveQueryBo= Hibernate.createBlob(SearchUtil.objectToByte(saveQueryBO));
3、hibernate配置:
<property name="saveQueryBo" column="SAVE_QUERY_BO" type="java.sql.Blob"
not-null="false"
/>
4、save这个就不贴了;完事儿
二、取
1、ibatis配置
<result property="saveQueryBo" column="save_Query_Bo" jdbcType="BLOB" javaType = "java.lang.Object"/>
说明下:
javaType = "java.lang.Object"必须是这个,不然报你写个handler吧~
2、相应类:
private Object saveQueryBo;
saveQueryBo虽然是blob类型的,但是必须写成object的,同上1点;
3、查询,转换
if(saveQueryBo != null){
Blob saveQueryBoBlob = (Blob)saveQueryBo;
return (SaveQueryBO)SearchUtil.byteToObject(SearchUtil.blobToByte(saveQueryBoBlob));
}
完整代码:
import java.sql.Blob;
public class SaveQueryVO {
private String tableKey;//主键
private String queryName;//查询名称
private String userCode;//用户编号
private String custType;//客户类型
private Object saveQueryBo;//搜索相关类
private String sql;//sql
public String getSql() {
return sql;
}
public void setSql(String sql) {
this.sql = sql;
}
/**
* 返回的是 BLOB对象,需要强转
*/
public Object getSaveQueryBo() {
return saveQueryBo;
}
/**
* 返回的是 SaveQueryBO对象
* @throws CrmBaseException
*/
public SaveQueryBO getSaveQueryBO() throws CrmBaseException {
try {
if(saveQueryBo != null){
Blob saveQueryBoBlob = (Blob)saveQueryBo;
return (SaveQueryBO)SearchUtil.byteToObject(SearchUtil.blobToByte(saveQueryBoBlob));
}
} catch (Exception e) {
e.printStackTrace();
//TODO
throw new CrmBaseException("系统错误");
}
return null;
}
public void setSaveQueryBo(Object saveQueryBo) {
this.saveQueryBo = saveQueryBo;
}
public String getCustType() {
return custType;
}
public void setCustType(String custType) {
this.custType = custType;
}
public String getTableKey() {
return tableKey;
}
public void setTableKey(String tableKey) {
this.tableKey = tableKey;
}
public String getQueryName() {
return queryName;
}
public void setQueryName(String queryName) {
this.queryName = queryName;
}
public String getUserCode() {
return userCode;
}
public void setUserCode(String userCode) {
this.userCode = userCode;
}
}
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.sql.Blob;
public class SearchUtil {
/**'
* 获得搜索主表code
* @return
*/
public static String getMainTableCode(){
return SearchConstant.MAIN_TABLE_CODE_PE_VALUE;
}
/**
*
* @param columnType
* @param columnValue
* @return
* @throws CrmBaseException
*/
public static String getColumValue4Sql(String columnType,String columnValue) throws CrmBaseException{
//当类型为数字
if(SearchConstant.COLUMNTYPE_NUMBER.equals(columnType) || SearchConstant.COLUMNTYPE_DOUBLE.equals(columnType)){
if(StringUtil.isEmpty(columnValue)){
return "0";
}else{
return columnValue;
}
} else if(SearchConstant.COLUMNTYPE_DATE.equals(columnType)){//当类型为日期
if(StringUtil.isEmpty(columnValue)){
return "''";
}else{
return "to_date('"+columnValue+"','yyyy-MM-dd')";
}
}else{//默认
if(StringUtil.isEmpty(columnValue)){
return "''";
}else{
return "'"+columnValue+"'";
}
}
}
/**
* 将对象转化为字节流
* @param obj
* @return
* @throws Exception
*/
public static byte[] objectToByte(Object object) throws CrmBaseException {
try{
if (object == null) return null;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(object);
byte[] bytes = bos.toByteArray();
bos.close();
oos.close();
return bytes;
}catch (Exception e) {
e.printStackTrace();
throw new CrmBaseException(e.getMessage());
}
}
/**
* 将字节流转化为对象
* @param bytes
* @return
* @throws Exception
*/
public static Object byteToObject(byte[] bytes) throws Exception {
if (bytes==null) return null;
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bis);
Object object = ois.readObject();
bis.close();
ois.close();
return object;
}
public static byte[] blobToByte(Blob blob) {
if (blob == null) return null;
byte[] listByte = null;
try {
BufferedInputStream is = new BufferedInputStream(blob.getBinaryStream());
int len = (int)blob.length();
listByte = new byte[len];
int offset = 0;
int read = 0;
while (offset < len && (read=is.read(listByte,offset,len-offset)) >= 0) {
offset += read;
}
} catch (Exception e) {
e.printStackTrace();
}
return listByte;
}
}
<resultMap id="saveQueryVO" class="SaveQueryVO">
<result property="tableKey" column="table_Key" />
<result property="queryName" column="query_Name" />
<result property="userCode" column="user_Code" />
<result property="custType" column="cust_Type" />
<result property="saveQueryBo" column="save_Query_Bo" jdbcType="BLOB" javaType = "java.lang.Object"/>
<result property="sql" column="sql" />
</resultMap>