• JDBC:数据库操作:处理大对象CLOB数据


    目标:

    了解大对象处理基本原理,

    掌握CLOB数据的读,写操作。

    可以使用CLOB类处理大文本数据。

    大对象处理主要指CLOB和BLOB两种类型字段。可以大量存储文字。

    要想在程序中处理这样的大数据操作,则必须使用preparedStatement完成。所有文件内容通过IO流方式从大文本字段中保存和读取。

    写入大数据对象;

    使用PreparedStatement接口中的方法。

    void setAsciiStream(int parameterIndex, InputStream x, int length) 
              将指定输入流写入数据库文本字段
     void setBinaryStream(int parameterIndex, InputStream x, int length) 
              将二进制输入流数据写入二进制字段中。

    读取大数据对象

    使用ResultSet接口下方法读取:

    CLOB表示大文本数据,MySQL中提供了LONGTEXT表示大文本数据,此字段最大保存数据量4G。

    例如,下面数据库脚步:

    create table userclob
    (
        id int,
        name varchar(30),
        note longtext
    )

    将以上的文本写入到数据表的字段中。

    package 类集;
    import java.sql.Connection ;
    import java.sql.DriverManager ;
    import java.sql.SQLException ;
    import java.sql.PreparedStatement ;
    import java.io.File ;
    import java.io.FileInputStream ;
    import java.io.InputStream ;
    public class ClobDemo01{
        // 定义MySQL的数据库驱动程序
        public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
        // 定义MySQL数据库的连接地址
        public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ;
        // MySQL数据库的连接用户名
        public static final String DBUSER = "root" ;
        // MySQL数据库的连接密码
        public static final String DBPASS = "aaaaaa" ;
        public static void main(String args[]) throws Exception{    // 所有异常抛出
            Connection conn = null ;        // 数据库连接
            PreparedStatement pstmt = null ;//声明数据库预处理对象
            String name = "小华" ;    // 表示姓名
            String sql = "INSERT INTO userclob(name,note) VALUES (?,?) " ;
            Class.forName(DBDRIVER) ;    // 加载驱动程序
            conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;//建立连接
            pstmt = conn.prepareStatement(sql) ;    // 创建PreapredStatement对象
            File f = new File("d:" + File.separator + "mldn.txt") ;//创建文件对象实例
            InputStream input = null ;
            input = new FileInputStream(f) ;    // 通过输入流读取文件
            pstmt.setString(1,name) ;//设置第一个字段的值pstmt.setAsciiStream(2,input,(int)f.length()) ;//将input实例指定的输入流设置给第二个字段,
            pstmt.executeUpdate() ;//执行更新操作。
            conn.close() ;            // 数据库关闭
        }
    };

    执行后查看结果:

    下面使用IO流进行读取操作:

    package 类集;
    import java.sql.Connection ;
    import java.sql.DriverManager ;
    import java.sql.SQLException ;
    import java.sql.PreparedStatement ;
    import java.sql.ResultSet ;
    import java.io.InputStream ;
    import java.util.Scanner ;
    public class ClobDemo01{
        // 定义MySQL的数据库驱动程序
        public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
        // 定义MySQL数据库的连接地址
        public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ;
        // MySQL数据库的连接用户名
        public static final String DBUSER = "root" ;
        // MySQL数据库的连接密码
        public static final String DBPASS = "aaaaaa" ;
        public static void main(String args[]) throws Exception{    // 所有异常抛出
            Connection conn = null ;        // 数据库连接
            PreparedStatement pstmt = null ;
            ResultSet rs = null ;
            int id = 3 ;        // 读取的编号
            String sql = "SELECT name,note FROM userclob WHERE id=? " ;
            Class.forName(DBDRIVER) ;    // 加载驱动程序
            conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;
            pstmt = conn.prepareStatement(sql) ;    // 创建PreapredStatement对象
            pstmt.setInt(1,id) ;
            rs = pstmt.executeQuery() ;    //进行查询操作
            if(rs.next()){        //如果查询的结果有值的话,读取第一条数据
                String name = rs.getString(1) ;//读取这条数据的第一个字段值。
                StringBuffer note = new StringBuffer() ;
                System.out.println("姓名:" + name) ;
                InputStream input = rs.getAsciiStream(2) ;//通过ResultSet接口的方法读取字节流,读取这条数据第二个字段值,
                Scanner scan = new Scanner(input) ;    // 使用Scanner类读取内容
                scan.useDelimiter("
    ") ;    // 将文件换行作为分割符
                while(scan.hasNext()){
                    note.append(scan.next()).append("
    ") ;
                }
                System.out.println("内容:" + note) ;
                input.close() ;
            }
            rs.close() ;
            pstmt.close() ;
            conn.close() ;            // 数据库关闭
        }
    };

    输出结果:

    CLOB类

    以上做法是将大文本数据对象直接通过ResultSet读取进来的,当然也可使用ResultSet中提供的getClob()方法,将全部内容编成CLOB对象,

    直接使用CLOB可以方便取得大文本的数据。也可对这些文本进行简单操作,如截取指定字符串文本等。

    ResultSet类获取CLOB对象方法:

     Clob getClob(int columnIndex) 
              以 Java 编程语言中 Clob 对象的形式获取此 ResultSet 对象的当前行中指定列的值。 

    CLOB类有一个方法进行文本截取。

     String getSubString(long pos, int length) 
              获取此 Clob 对象指定的 CLOB 值中指定子字符串的副本

    CLOB类还有一个截断文本方法:

     void truncate(long len) 
              截取此 Clob 指定的 CLOB 值,使其长度为 len 个字符。 

     

    package 类集;
    import java.sql.Connection ;
    import java.sql.DriverManager ;
    import java.sql.SQLException ;
    import java.sql.PreparedStatement ;
    import java.sql.Clob ;
    import java.sql.ResultSet ;
    public class ClobDemo01{
        // 定义MySQL的数据库驱动程序
        public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
        // 定义MySQL数据库的连接地址
        public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ;
        // MySQL数据库的连接用户名
        public static final String DBUSER = "root" ;
        // MySQL数据库的连接密码
        public static final String DBPASS = "aaaaaa" ;
        public static void main(String args[]) throws Exception{    // 所有异常抛出
            Connection conn = null ;        // 数据库连接
            PreparedStatement pstmt = null ;
            ResultSet rs = null ;
            int id = 3 ;        // 读取的编号
            
            String sql = "SELECT name,note FROM userclob WHERE id=? " ;
            Class.forName(DBDRIVER) ;    // 加载驱动程序
            conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;
            pstmt = conn.prepareStatement(sql) ;    // 创建PreapredStatement对象
            pstmt.setInt(1,id) ;//设置第一个参数的值为变量id的值
            rs = pstmt.executeQuery() ;
            if(rs.next()){
                String name = rs.getString(1) ;
                System.out.println("姓名:" + name) ;
                Clob c = rs.getClob(2) ;
                String note = c.getSubString(1,200) ;//截取前200个字符串
                System.out.println("内容:" + note ) ;
                c.truncate(100) ;    // 只能读100个内容
                System.out.println("部分读取内容:" + c.getSubString(1,(int)c.length())) ;
            }
            rs.close() ;
            pstmt.close() ;
            conn.close() ;            // 数据库关闭
        }
    };

     

    输出结果:

    Tue Apr 18 23:18:51 CST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
    姓名:小华
    内容:345436453646fasdfdsagdfsadgwrtrfrgdsavdafsdfsadfdsaf345436453646fasdfdsagdfsadgwrtrfrgdsavdaf
    sdfsadfdsafsdafdsafasd345436453646fasdfdsagdfsadgwrtrfrgdsavdafsdfsadfdsafsdafdsafasd345436453646fasdfdsa
    部分读取内容:345436453646fasdfdsagdfsadgwrtrfrgdsavdafsdfsadfdsaf345436453646fasdfdsagdfsadgwrtrfrgdsavdaf
    sdfsa

     

    使用CLOB类可以非常方便的处理大数据的读取功能

  • 相关阅读:
    双指针
    git .gitignore文件修改后不生效
    Vue路由跳转携带固定参数
    GitLab 安装说明
    安装 PostgreSQL
    职场软素质&算法工程师的硬素质卓越的职场人需要的42种能力
    内存泄漏排查
    Oracle基本操作(登陆、用户、表空间、exp/imp、权限)
    oracle删除用户、表空间及数据⽂件⽅法
    oracle检查存储过程出错原因
  • 原文地址:https://www.cnblogs.com/alsf/p/6731116.html
Copyright © 2020-2023  润新知