当前位置:Gxlcms > 数据库问题 > 使用JDBC处理MySQL大文本和大数据

使用JDBC处理MySQL大文本和大数据

时间:2021-07-01 10:21:17 帮助过:3人阅读

        LOB,Large Objects,是一种用于存储大对象的数据类型,一般LOB又分为BLOB与CLOB。BLOB通常用于存储二进制数据,比如图片、音频、视频等。CLOB通常用于存储大文本,比如小说。

        MySQL数据库中没有专门的CLOB数据类型,而如果要存储大文本,MySQL采用的是TEXT类型。TEXT类型又有TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT之分。MySQL中的BLOB类型又可分为TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。

使用JDBC处理大文本

        向MySQL中存储大文本,可调用JDBC API中PreparedStatement的如下方法:

// 将指定参数设置为给定 Reader 对象

void setCharacterStream(int parameterIndex, Reader reader) throws SQLException

// 将给定参数设置为给定 Reader 对象,该对象具有给定字符数长度(int型)

 void setCharacterStream(int parameterIndex, Reader reader, int length) throws SQLException

// 将指定参数设置为给定 Reader 对象,该对象具有给定字符数长度(long型)

void setCharacterStream(int parameterIndex, Reader reader, long length) throws SQLException

        如果需要从MySQL数据库中获取大文本列字段值,则可以使用ResultSet的如下方法:

// 以 java.io.Reader 对象的形式获取此 ResultSet 对象的当前行中指定列的值

Reader getCharacterStream(int columnIndex) throws SQLException Reader getCharacterStream(String columnLabel) throws SQLException

// 以 String 的形式获取此 ResultSet 对象的当前行中指定列的值

String getString(int columnIndex) throws SQLException String getString(String columnLabel) throws SQLException

示例:

        代码:

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

import java.io.Reader;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

/**  * 使用JDBC操作大文本

 *  * @author

 *  */

public class ClobTest {

    /**      * 使用JDBC向数据库表中插入大文本数据    

    *      * @throws SQLException  

    */  

   public static void add() throws SQLException {    

     Connection conn = null;    

     PreparedStatement pstmt = null;    

     // 获取数据库会话对象     

    JdbcSession session = JdbcSessionFactory.getCurrentSession();     

    // 获取数据库连接     

    conn = session.getConnection();   

    // 创建SQL语句:向小说表中添加一条章节内容的记录     

    String sql = "INSERT INTO novel(content) VALUES(?)";     

    // 创建PreparedStatement对象    

     pstmt = conn.prepareStatement(sql);    

     // 创建Reader对象    

     File file = new File(Thread.currentThread().getClass().getResource("/novel/1.txt").getPath());    

     Reader reader = null;   

      try {      

       reader = new FileReader(file);    

     } catch (FileNotFoundException e) {     

        e.printStackTrace();   

      }    

     // 设置参数      

       pstmt.setCharacterStream(1, reader, (int) file.length());     

    // 执行SQL语句     

        int count = pstmt.executeUpdate();    

     // 处理结果    

        if (count > 0)    

         System.out.println("添加成功");  

       else   

          System.out.println("添加失败");   

      // 释放资源    

     JdbcResourceManager.close(pstmt);    

     JdbcResourceManager.close(conn);   

      JdbcSessionFactory.closeSession();   

  }

    public static void read() throws SQLException {   

      Connection conn = null;   

      PreparedStatement pstmt = null;    

     ResultSet rs = null;    

     // 获取数据库会话对象    

     JdbcSession session = JdbcSessionFactory.getCurrentSession();    

     // 获取数据库连接    

     conn = session.getConnection();     

    // 创建SQL语句     

    String sql = "SELECT id, content FROM novel";    

     // 创建PreparedStatement对象   

      pstmt = conn.prepareStatement(sql);    

     // 执行SQL语句     

    rs = pstmt.executeQuery();    

     // 处理结果    

     while (rs.next()) {      

       // 读取小说内容     

        Reader reader = rs.getCharacterStream("content");       

        int ch;     

        try {        

         while((ch = reader.read()) != -1){          

           System.out.print((char)ch);     

            }      

       } catch (IOException e) {        

         e.printStackTrace();       

      }   

      }     

    // 释放资源      

      JdbcResourceManager.close(rs);   

      JdbcResourceManager.close(pstmt);

       JdbcResourceManager.close(conn);  

       JdbcSessionFactory.closeSession();  

   }

    public static void main(String[] args) {    

     try {     

        add();      

       read();    

     } catch (SQLException e) {     

        e.printStackTrace();   

      }   

  }

}

 

使用JDBC处理二进制数据     

         向MySQL中存储二进制数据,可调用JDBC API中PreparedStatement的如下方法:

// 将指定参数设置为给定输入流。

void setBinaryStream(int parameterIndex, InputStream x)

// 将指定参数设置为给定输入流,该输入流将具有给定字节数(int型)。

void setBinaryStream(int parameterIndex, InputStream x, int length)

// 将指定参数设置为给定输入流,该输入流将具有指定字节数(long型)。

void setBinaryStream(int parameterIndex, InputStream x, long length)

         如果需要从MySQL数据库中获取二进制列字段值,则可以使用ResultSet的如下方法:

// 以未解释字节的流的形式获取此 ResultSet 对象的当前行中指定列的值。

InputStream getBinaryStream(int columnIndex)

// 以未解释的 byte 流的形式获取此 ResultSet 对象的当前行中指定列的值。

InputStream getBinaryStream(String columnLabel)

// 以 Java 编程语言中 Blob 对象的形式获取此 ResultSet 对象的当前行中指定列的值。

Blob getBlob(int columnIndex)

// 以 Java 编程语言中 Blob 对象的形式获取此 ResultSet 对象的当前行中指定列的值。

Blob getBlob(String columnLabel)

         获取Blob对象后可以继续调用getBinaryStream()方法获取输入流。

示例:

代码:

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.OutputStream;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

/**  * 使用JDBC操作二进制数据

 *  * @author 

 *  */

public class BlobTest {

    /**      * 插入二进制数据到数据库   

     *      * @throws Exception  

    */  

   public static void add() throws Exception {    

     Connection conn = null;     

    PreparedStatement pstmt = null;    

     // 获取数据库会话对象    

     JdbcSession session = JdbcSessionFactory.getCurrentSession();   

      // 获取数据库连接     

    conn = session.getConnection();    

     // 插入音乐数据的SQL语句     

    String sql = "INSERT INTO music(content) VALUES(?)";    

     pstmt = conn.prepareStatement(sql);    

     // 创建PreparedStatement对象    

     pstmt = conn.prepareStatement(sql);     

    // 创建Reader对象    

     File file = new File(Thread.currentThread().getClass().getResource("/music/08.Along_in_the_night.mp3").getPath());   

      InputStream fis = new FileInputStream(file);

     // 生成的流    

     pstmt.setBinaryStream(1, fis, file.length());    

     // 执行SQL语句     

    int count = pstmt.executeUpdate();     

    // 处理结果    

     if (count > 0)       

      System.out.println("添加成功");     

    else      

       System.out.println("添加失败");    

     // 释放资源   

      JdbcResourceManager.close(pstmt);     

    JdbcResourceManager.close(conn);     

    JdbcSessionFactory.closeSession();  

   }

    /**      * 从数据库中读二进制数据   

   *      * @throws Exception    

  */  

   public static void read() throws Exception {      

   Connection conn = null;     

    PreparedStatement pstmt = null;     

    ResultSet rs = null;    

     // 获取数据库会话对象     

    JdbcSession session = JdbcSessionFactory.getCurrentSession();    

     // 获取数据库连接     

    conn = session.getConnection();   

      // 创建SQL语句     

    String sql = "SELECT id, content FROM music WHERE id=?";     

    // 创建PreparedStatement对象    

     pstmt = conn.prepareStatement(sql);   

      pstmt.setInt(1, 1);   

      // 执行SQL语句     

    rs = pstmt.executeQuery();    

     // 处理结果   

      if (rs.next()) {     

        InputStream in = rs.getBinaryStream("content");

// 获取列字段InputStream对象      

       // 缓冲数组     

        byte buf[] = new byte[1024];      

       int len;       

      // 输出流,将读取到的音乐数据保存到D盘      

       OutputStream out = new FileOutputStream("D:\\1.mp3");      

       while ((len = in.read(buf)) != -1) {         

        out.write(buf, 0, len);     

        }   

          in.close();      

       out.close();       

  }      

   // 释放资源     

    JdbcResourceManager.close(rs);    

     JdbcResourceManager.close(pstmt);   

      JdbcResourceManager.close(conn);    

     JdbcSessionFactory.closeSession();   

  }

    public static void main(String[] args) throws Exception {   

      add();    

     read();   

  }

}

 

使用JDBC处理MySQL大文本和大数据

标签:

人气教程排行