Mybatis解决数据库Blob类型存储与读取问题

目录

1.Blob介绍

首先,先简单介绍下数据库Blob字段,Blob(Binary Large Object)是指二进制大对象字段,顺带介绍下Clob类型,Clob(Character Large Object)是指大字符对象。其中Blob是为存储大的二进制数据而设计的,而Clob是为存储大的文本数据而设计的。JDBC的PreparedStatement和ResultSet都提供了相应的方法来支持Blob和Clob操作,Mybatis各版本也支持对Blob或者Clob的存储以及读取操作,本文详细介绍Mybatis中Blob字段的操作。

2.自定义Blob类型处理器

MyBatis框架提供了一个BaseTypeHandler类,该类用于用户自定义一些字段类型,我们可以用这个类来操作Blob类型数据。该类有两个重要方法,setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType)getNullableResult(ResultSet rs, String columnName) 。前者提供开发者处理insert、update、delete语句结构的数据,ps参数为JDBC的预编译对象,i参数为SQL参数的占位符,parameter参数为当前Blob的长字符串,jdbcType为数据库字段类型。后者为查询语句返回数据的处理,rs参数为返回的数据集,columnName为字段名字。下面详细显示自定义Blob处理类代码。

public class BlobTypeHandler extends BaseTypeHandler<String> {
    public void setNonNullParameter(PreparedStatement ps, int i,  
            String parameter, JdbcType jdbcType) throws SQLException {  
        //声明一个输入流对象
        ByteArrayInputStream bis;  
        try {  
            //把字符串转为字节流
            bis = new ByteArrayInputStream(parameter.getBytes('utf-8'));  
        } catch (UnsupportedEncodingException e) {  
            throw new RuntimeException("Blob Encoding Error!");  
        }     
        ps.setBinaryStream(i, bis, parameter.length());  
    }  

    @Override  
    public String getNullableResult(ResultSet rs, String columnName)  
            throws SQLException {  
        Blob blob = (Blob) rs.getBlob(columnName);  
        byte[] returnValue = null;  
        if (null != blob) {  
            returnValue = blob.getBytes(1, (int) blob.length());  
        }  
        try {  
            //将取出的流对象转为utf-8的字符串对象
            return new String(returnValue, 'utf-8');  
        } catch (UnsupportedEncodingException e) {  
            throw new RuntimeException("Blob Encoding Error!");  
        }  
    }  
    }

3.编写查询语句

在MyBatis的配置文件中写一条查询语句,查询大字段数据,我这里讲content字段作为演示的Blob类型。

<select id="queryByList" parameterType="Map" resultMap="queryBaseResultMap">
    select  id ,title,type,content,author from my_blob 
    where 1 = 1 order by ${orderByClause}
 </select>
 <resultMap id="queryBaseResultMap" type="com.lst.model.MyBlob" >
    <id column="Id" property="id" jdbcType="INTEGER" />
    <result column="type" property="type" jdbcType="INTEGER" />
    <result column="Title" property="title" jdbcType="VARCHAR" />
    <result column="Author" property="author" jdbcType="VARCHAR" />
    <result column="Content" property="content" typeHandler="com.lst.utils.BlobTypeHandler"/> 
</resultMap>

ok,本文就讲到这么多,大字段在目前的系统开发中应用很广泛,如图片上传、短视频处理、以及当下的自媒体的图文并茂的内容呈现等等。

MyBatis提供了Blob类型的支持,可以将二进制数据(如图片)存储到Oracle的Blob字段中。 首先,在Mapper.xml中定义一个insert语句,如下所示: ``` <insert id="insertImage" parameterType="Map"> INSERT INTO image_table(id, image) VALUES(#{id}, #{image,jdbcType=BLOB}) </insert> ``` 其中,#{image,jdbcType=BLOB}表示将image属性映射到数据库BLOB字段。 然后,在Java代码中,将图片转换成字节数组,再将字节数组封装到一个Map中,作为参数调用insertImage方法,如下所示: ``` byte[] imageBytes = Files.readAllBytes(Paths.get("path/to/image.png")); Map<String, Object> paramMap = new HashMap<>(); paramMap.put("id", 1); paramMap.put("image", imageBytes); mapper.insertImage(paramMap); ``` 以上代码将读取一个PNG格式的图片文件,将其转换成字节数组,然后将字节数组封装到一个Map中,作为参数调用insertImage方法,将图片存储数据库中。 查询Blob类型的数据时,可以使用MyBatis提供的ResultHandler接口来处理Blob类型的数据,如下所示: ``` public class ImageResultHandler implements ResultHandler { @Override public void handleResult(ResultContext context) { ImageEntity entity = (ImageEntity) context.getResultObject(); Blob blob = entity.getImage(); byte[] bytes = null; try (InputStream inputStream = blob.getBinaryStream()) { bytes = IOUtils.toByteArray(inputStream); } catch (SQLException | IOException e) { e.printStackTrace(); } entity.setImageBytes(bytes); } } public interface ImageMapper { @Select("SELECT id, image FROM image_table WHERE id=#{id}") @ResultType(ImageEntity.class) void getImage(long id, ResultHandler handler); } ``` 以上代码定义了一个ImageResultHandler类,实现了ResultHandler接口,用于处理查询结果中的Blob类型数据。在调用ImageMapper的getImage方法时,将ImageResultHandler实例作为参数传入,MyBatis会自动调用ImageResultHandler的handleResult方法,将查询结果封装成ImageEntity实例。 在ImageEntity类中,可以定义一个byte[]类型的属性,用于存储Blob字段中读取的字节数组。这样,查询到的图片数据就可以直接使用了。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值