JDBC大数据的处理

作者: 小小蒜头 | 来源:发表于2017-09-25 22:38 被阅读72次

在实际开发中,程序需要把大文本或二进制数据保存到数据库。

基本概念:大数据也称之为LOB(Large Objects),LOB又分为clob(大文本,text)
和blob(二进制数据,图像、声音、二进制文等)

对MySQL而言只有blob,而没有clob,MySQL存储大文本采用的是Text,Text和blob分别又分为:
TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT
TINYBLOB、BLOB、MEDIUMBLOB和BLOB

对于MySQL中的Text类型,可调用如下方法设置:

PreparedStatement.setCharacterStream(index,reader,length);
//注意length长度须设置,并且为int型

对于MySQL中的Text类型,可调用如下方法设置:

reader = resultSet.getCharacterStream(i);
reader = resultSet.getClob(i).getCharacterStream();
String s = resultSet.getString(i);

先把数据库连接代码写好
db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/testclob
username=root
password=root

JdbcUtils

package cn.itcast.utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;

public class JdbcUtils {

    private static Properties prop = new Properties();

    static {
        try {
            prop.load(JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties"));
            Class.forName(prop.getProperty("driver"));
        } catch (Exception e) {
            throw new ExceptionInInitializerError(e);
        }
    }

    public static Connection getConnection() throws Exception {
        return DriverManager.getConnection(prop.getProperty("url"), prop.getProperty("username"), prop.getProperty("password"));
    }


    public static void release(Connection conn, Statement st, ResultSet rs) {

        if (rs != null) {
            try {
                rs.close();   //throw new
            } catch (Exception e) {
                e.printStackTrace();
            }
            rs = null;
        }
        if (st != null) {
            try {
                st.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            st = null;
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

然后在src下面新建一个1.txt文件

mysql中建表:

create table testClob(
   id varchar(40) primary key,
   resume text
);

写入数据:

 @Test
    public void insert() {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            conn = JdbcUtils.getConnection();
            String sql = "insert into testclob(id,resume) values(?,?)";
            ps = conn.prepareStatement(sql);
            ps.setString(1, "1");
            //第二个问号是一个大文本

            //注意,现在是java工程,web工程不这样写,如果非要这么写,1.txt文件应该在bin目录下
            File file = new File("src/1.txt");
            FileReader reader = new FileReader(file);
            int length = (int) file.length();
            ps.setCharacterStream(2, reader, length);//reader流与文件1.txt相关联
            int num = ps.executeUpdate();
            if (num > 0) {
                System.out.println("插入成功 ");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.release(conn, ps, rs);
        }
    }

读出数据:将数据读出来重新写到D盘

 @Test
    public void read() {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            conn = JdbcUtils.getConnection();
            String sql = "select id,resume from testclob where id='1'";
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
            if (rs.next()) {
                //读数据
                Reader reader = rs.getCharacterStream("resume");//作为流返回
                //写数据到D盘下
                FileWriter writer = new FileWriter("D:\\copy.txt");
                //从流里读数据
                try {
                    int len = 0;
                    char buffer[] = new char[1024];
                    while ((len = reader.read(buffer)) > 0) {
                        writer.write(buffer, 0, len);
                    }
                } finally {
                    if (reader != null) {
                        reader.close();
                    }
                    if (writer != null) {
                        writer.close();
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.release(conn, ps, rs);
        }
    }

对于MySQL中的BLOB类型,可调用如下方法设置:

PreparedStatement.setBinaryStream(i,inputStream,length);
//注意length长度须设置,并且为int型

对于MySQL中的BLOB类型,可调用如下方法设置:

InputStream in = resultSet.getBinaryStream(i);
InputStream in = resultSet.getBlob(i).getBinaryStream();

mysql中建表:

create table testblob(
   id varchar(40) primary key,
   image blob
);

读写数据

@Test
    public void insert() {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            conn = JdbcUtils.getConnection();
            String sql = "insert into testblob(id,image) values(?,?)";
            ps = conn.prepareStatement(sql);
            ps.setString(1, "1");
            //注意,现在是java工程,web工程不这样写,如果非要这么写,1.txt文件应该在bin目录下
            File file = new File("src/1.jpg");
            FileInputStream in = new FileInputStream(file);
            int length = (int) file.length();
            ps.setBinaryStream(2, in, length);
            ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.release(conn, ps, rs);
        }
    }

    @Test
    public void read() {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            conn = JdbcUtils.getConnection();
            String sql = "select id,image from testblob where id='1'";
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
            if (rs.next()) {
                InputStream in = rs.getBinaryStream("image");
                OutputStream out = new FileOutputStream("D:\\1.jpg");
                try {
                    int len = 0;
                    byte[] buffer = new byte[1024];
                    while ((len = in.read(buffer)) > 0) {
                        out.write(buffer, 0, len);
                    }
                } finally {
                    if (in != null) {
                        in.close();
                    }
                    if (out != null) {
                        out.close();
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.release(conn, ps, rs);
        }
    }

一般情况下,不会把大数据直接存到数据库里,而是存在硬盘上。

相关文章

  • 2019-05-23 Mybatis批量新增数据

    1.使用传统jdbc对数据进行插入 传统的jdbc插入包括2种方式,使用for循环和使用jdbc的批处理 (一)f...

  • MyBatis四大核心对象之StatementHandler

    StatementHandler是MyBatis四大核心对象之一,是专门处理数据库汇报的组件,封装了JDBC St...

  • JDBC批量处理数据

    批量处理数据:(代码优化:提高程序执行性能) 降低了java程序代码(客户端)和数据库之间的 网络通信的次数。 在...

  • JDBC大数据的处理

    在实际开发中,程序需要把大文本或二进制数据保存到数据库。 基本概念:大数据也称之为LOB(Large Object...

  • JDBC(四)JDBC元数据和反射的利用

    一、使用 JDBC 驱动程序处理元数据 Java 通过JDBC获得连接以后,得到一个Connection 对象,可...

  • Scala对JDBC的一些封装(1)

    by 壮衣 JDBC提供一套完善的API来处理数据库编程,利用JDBC我们可以完成数据的插入、查询、更新和删除。向...

  • JDBC中常用的类和接口

    JDBC中常用的类和接口利用JDBC的这些类和接口可以更方便地访问并处理存储在数据库中的数据。 DriverMan...

  • JDBC

    JDBC 执行SQL语句的java API JDBC三件事 建立数据库连接,发送SQL语句,处理返回结果 JDB...

  • SpringBoot学习笔记

    一、JDBC JDBC开发流程1、获取数据库连接2、创建statement3、执行sql语句并处理返回结果4、释放...

  • Java和MySQL简建立连接

    JDBC JDBC插入多条数据 JDBC查询 JDBC动态传参 JDBC回滚 JDBC将数据库中的信息装入List...

网友评论

    本文标题:JDBC大数据的处理

    本文链接:https://www.haomeiwen.com/subject/ozadextx.html