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"/>

以上是自定义typehandler或者实体存成BLOB时用Byte[]。从数据库中取出来用String接收就可以了,以下是使用mybatis存入数据库

BLOB和CLOB都是大字段类型。java

BLOB是按二进制来存储的,而CLOB是能够直接存储文字的。sql

一般像图片、文件、音乐等信息就用BLOB字段来存储,先将文件转为二进制再存储进去。文章或者是较长的文字,就用CLOB存储.数据库

BLOB和CLOB在不一样的数据库中对应的类型也不同:
MySQL 中:clob对应text/longtext,blob对应blob
Oracle中:clob对应clob,blob对应blob

MyBatis提供了内建的对CLOB/BLOB类型列的映射处理支持。app

建表语句:测试

create table user_pics( id number primary key, name varchar2(50) , pic blob, bio clob ); 

照片(pic)能够是PNG,JPG或其余格式的。简介信息(bio)能够是学比较长的文字描述。默认状况下,MyBatis将CLOB类型的列映射到java.lang.String类型上、而把BLOB列映射到byte[]类型上。spa

public class UserPic{ private int id; private String name; private byte[] pic; private String bio; //setters & getters
}

映射文件:code

<insert id="insertUserPic" parameterType="UserPic"> <selectKey keyProperty="id" resultType="int" order="BEFORE"> select my_seq.nextval from dual </selectKey> insert into user_pics(id,name, pic,bio) values(#{id},#{name},#{pic},#{bio}) </insert> <select id="getUserPicById" parameterType="int" resultType="UserPic"> select * from user_pics where id=#{id} </select>

映射接口:对象

public interface PicMapper { int insertUserPic(UserPic userPic); UserPic getUserPicById(int id); }

测试方法:blog

public void test_insertUserPic(){ String name = "tom"; String bio = "能够是很长的字符串"; byte[] pic = null; try { //读取用户头像图片File file = new File("src/com/briup/special/1.gif"); InputStream is = new FileInputStream(file); pic = new byte[is.available()]; is.read(pic); is.close(); } catch (Exception e){ e.printStackTrace(); } //准备好要插入到数据库中的数据并封装成对象UserPic userPic = new UserPic(name, pic , bio); SqlSession sqlSession = null; try{ sqlSession = MyBatisSqlSessionFactory.openSession(); SpecialMapper mapper = sqlSession.getMapper(SpecialMapper.class); mapper.insertUserPic(userPic); sqlSession.commit(); }catch (Exception e) { e.printStackTrace(); } } 

下面的getUserPic()方法将CLOB类型数据读取到String类型,BLOB类型数据读取成byte[]属性:接口

@Test public void test_getUserPicById(){ SqlSession sqlSession = null; try { sqlSession = MyBatisSqlSessionFactory.openSession(); SpecialMapper mapper = sqlSession.getMapper(SpecialMapper.class); UserPic userPic = mapper.getUserPicById(59); System.out.println(userPic.getId()); System.out.println(userPic.getName()); System.out.println(userPic.getBio()); System.out.println(userPic.getPic().length); } catch (Exception e) { e.printStackTrace(); } }

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

  1. Mybatis:数据库的类型与java类型对应

                                   Mybatis与数据库的类型对应 1:Java数据类型与MySql数据类型对照表 类型名称 显示长度 数据库类型 JAVA类型 JDBC类 ...

  2. 从mysql数据库读取Blob_读取数据库Blob类型的文本数据

    开发一个查询功能时,遇到了一个ORM的问题:数据库字段是 Blob 类型,里面实际存储的是文本数据,Java 后端代码中用字符串 String 类型去接收这个字段的数据时,报错,提示没有对应的sett ...

  3. Blob类型存储中文

    目录 一.数据库中文乱码 二.数据库中文正常展示 三.gbk和utf8 GBK和UTF-8文字编码的特点: GBK和UTF-8文字编码的区别: 编码方案: 一.数据库中文乱码 一般来说,我们的数据库都 ...

  4. mysql数据库blob换行_mysql数据库blob类型

    Java -- JDBC 学习--处理Blob Oracle LOB LOB,即Large Objects(大对象),是用来存储大量的二进制和文本数据的一种数据类型(一个LOB字段可存储可多达4GB的 ...

  5. java以Blob形式存储,读取图片并在jsp页面显示图片流

    2019独角兽企业重金招聘Python工程师标准>>> 废话少说代码伺候: 封装好的ImageUtil类:目的读取本地的图片文件并存入数据库,然后读出数据库中以Blob形式存储的图片 ...

  6. Mybatis 解决数据库字段名和实体类属性名不一致问题

    一.问题描述 1.1 查询 password 字段为 null 现象 数据库字段名: 实体类属性名: @Data @NoArgsConstructor @AllArgsConstructor publ ...

  7. Oracle数据库Blob字段存储文本文件

    创建一个表来存储文本文件 CREATE TABLE text_files(id NUMBER,file_data BLOB ); 将文本文件插入到表中 INSERT INTO text_files(i ...

  8. Java接受blob类型图片_利用blob类型存储图片

    SavePicture.java : public class SavePicture { public static void main(String[] args) { Connection co ...

  9. mysql mybatis类型对应_Mybatis与数据库的类型对应

    Mybatis与数据库的类型对应 由于业务的改变,在首次存入数据库时某些int属性并没有赋值,于是默认值就开始污染数据库了. java实体属性对应mysql和SQL Server 和Oracle 数据 ...

最新文章

  1. GitHub使用教程for Eclipse
  2. 不正确 有三种形式 说法 通配泛型_一看就懂 详解JAVA泛型通配符T,E,K,V区别...
  3. Google 鼓励的 13 条代码审查标准,建议收藏!
  4. Python Study:GUI-Tkinter
  5. 1-36随机生成6个不重复的数
  6. fanuc机器人与视觉通信_要说工厂干起活来:工业机器人和数控机床才是真正的一对!...
  7. NumPy Matplotlib PIP安装
  8. pyhton链式赋值在可变类型/不可变类型上的区别以及其本质
  9. 失业几个月找不到工作是一种怎样的体验?
  10. es 安装 ik 分词器
  11. 大数据精准运营需要注意的点
  12. 基于Linux的系统的文件/文件夹的权限
  13. 【先定一个小目标】Asp.net Core 在IIS上的托管运行
  14. 华三服务器管理口地址_各种服务器、存储默认管理IP地址以及用户名密码
  15. 算法题9-最短路径问题-Dijkstra算法
  16. 数据库周刊62丨央企2021年数据库成交公告,国产占90%;流数据库HStreamDB开源;MySQL主从双写导致数据丢失;Oracle 19c升级最佳实践;PG日常工作分享;MySQL MGR运维指
  17. 工作中有可能用到的运维小知识《现查现用》
  18. Visitor模式实践
  19. 64注意力机制 10章
  20. 数据库服务器搭建系统,服务器系统搭建SQL数据库

热门文章

  1. 国库券收益计算matlab,Excel 计算国库券收益率:TBILLYIELD函数
  2. 建站集成软件php,XAMPP - 建站集成软件包
  3. robocopy命令行管理
  4. VMware CentOS7克隆虚拟机并设置网络
  5. PAT甲级1082 Read Number in Chinese(JAVA版)
  6. Android的java基本知识总结【入门篇】
  7. C++Builder 概述
  8. 计算机应用基础 教学案例,案例教学法在计算机应用基础的应用(word版)
  9. css入门(七)—— 超链接样式
  10. 高速运放型号 常用轨到轨运放型号 高精密 零温漂