zoukankan      html  css  js  c++  java
  • Hibernate保存Blob和Clob类型的数据

    然非常不建议在数据库中保存Blob和Clob类型的数据,但真的要有这样的需求呢?这里记录一下使用Hibernate如何向数据库中保存Blob和Clob数据。

    Oracle和MySql在Blob类型上没什么区别,但是Mysql没有Clob类型,取而代之的是Text类型,所以这里还有点区别。BLOB在数据库中是以二进制的形式存在的,所以无法直接看到,如果是图片的话,使用一些数据库管理软件还是可以看到图片的,而CLOB就是大文本,可以直接就看到内容。

    Oracle

    这是一个名为Student的实体类:

    package cn.entity;
    
    import java.sql.Blob;
    import java.sql.Clob;
    
    public class Student {
        
        private String stuid;
    
        private Blob stuimage;
        
        private Clob studesc;
    
        /*setter and getter*/
        
    }

    Student.hbm.xml:

    <property name="stuimage"  type="blob"/>
    <property name="studesc" type="clob"/>

    使用Hibernate操作CLOB和BLOB:

    @Test
        public void saveBlobAndClob() {
            try {
                //123.jpg
                InputStream in=new FileInputStream("d:\123.jpg");
                byte[] byteArray=new byte[in.available()];
                in.read(byteArray);
                in.close();
                
                //新建文本文档.txt
                InputStream in2=new FileInputStream("d:\新建文本文档.txt");
                byte[] byteArray2=new byte[in2.available()];
                in2.read(byteArray2);
                in2.close();
                String string=new String(byteArray2);
                
                User user=new User();
                user.setPhoto(Hibernate.createBlob(byteArray));
                user.setInfo(Hibernate.createClob(byteArray2));
                
                session.save(user);
                
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    这里主要是使用Hibernate的静态方法createBlob或createClob即可

    MySql

    mysql中并没有CLOB类型的数据,使用的Text类型,映射的Java类型使用String而不能再使用java.sql.Clob类型,

    注意点有两个

    User.java:(注意点一:使用String的Java类型)

    package cn.entity;
    
    import java.sql.Blob;
    
    public class User {
    
        private Integer id;
        private Blob photo;
        private String info;
        
       /*setter and getter*/                        
    
    }

    User.hbm.xml:(注意点二:映射类型为text)

         <property name="photo" type="blob"></property>
         <property name="info" type="text"/> 

    要使用text的type,而不是clob的type,不然会映射不成功

    使用Hibernate操作CLOB和BLOB的代码和Oracle中的大致一样,不同之处在于使用string操作:

        @Test
        public void saveBlobAndClob() {
            try {
                //123.jpg
                InputStream in=new FileInputStream("d:\123.jpg");
                byte[] byteArray=new byte[in.available()];
                in.read(byteArray);
                in.close();
                
                //新建文本文档.txt
                InputStream in2=new FileInputStream("d:\新建文本文档.txt");
                InputStreamReader reader=new InputStreamReader(in2,"gbk");
                char[] cbuf=new char[1024];
                reader.read(cbuf);
                reader.close();
                
                User user=new User();
                user.setPhoto(Hibernate.createBlob(in));
                user.setInfo(new String(cbuf));
                
                session.save(user);
                
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    读的操作

    对于CLOB的读操作使用:

    • getCharacterStream()
    • getAsciiStream()

    对于BLOB的读操作使用:

    • getBinaryStream()
    • getBytes(long pos, int length)

    都是对应类中的方法,需要时可以查API,其实使用JDBC也可以操作这两种类型,PreparedStatement中都有对应方法,如

    ps.setBinaryStream  操作BLOB

    ps.setClob 操作CLOB类型的数据
    ps.setAsciiStream 使用流的方式处理CLOB(ASDII编码)
    ps.setUnicodeStream 使用流的方式处理CLOB(Unicode编码)
    ps.setCharacterStream 使用字符流处理CLOB

    所以纯使用JDBC也是可以操作这两种数据类型的
    
    
  • 相关阅读:
    013.ES6 -对象字面量增强型写法
    012. ES6
    011. ES6 语法
    10. 9. Vue 计算属性的setter和getter 以及 计算属性的缓存讲解
    4. Spring MVC 数据响应方式
    3. SpringMVC 组件解析
    9. Vue 计算属性
    【洛谷 2984】给巧克力
    【洛谷 1821】捉迷藏 Hide and Seek
    【洛谷 1821】银牛派对Silver Cow Party
  • 原文地址:https://www.cnblogs.com/lz2017/p/7771282.html
Copyright © 2011-2022 走看看