JSP基础(十五)——用JDBC处理MySQL大数据

来源:互联网 发布:知网查重入口 知乎 编辑:程序博客网 时间:2024/06/06 14:18

一、数据库中大数据处理相关概念

1.1、MySQL中大数据处理

     大数据也称之为LOB(Large Objects,大型对象),LOB又分为:

    clob(Character Large Object):与字符集相关,用于存储大文本数据即文本型数据(历史档案等)

     ▶blob(Binary Large Object):用于存储二进制数据即非文本的字节流数据(图像、声音、程序等)

     在实际开发中,有时是需要用程序把大文本或二进制数据直接保存到数据库中进行存储。

     对于MySQL而言只有blob,没有clob,MySQL存储大文本采用的是Text。

     ▶Text分为 :TINYTEXT、TEXT、 MEDIUMTEXT  和  LONGTEXT

     ▶blob分为:TINYBLOB、BLOB、MEDIUMBLOB  和 LONGBLOB


 1.2、Oracle中大数据处理

     在Oracle中,LOB类型的字段现在用的越来越多了。因为这种类型的字段:

    ①容量大(最多容纳4GB的数据)

    ②灵活(一个表中可以有多个这种类型的字段,适用于数据量非常大的业务领域,如图像、档案等)。

 

二、使用JDBC处理MySQL的大文本

 继续使用我上一篇博客搭建的实验环境(编写db.properties配置文件、JavaUtils工具类。另外,在src下放一张图片和一个文本文件)

设置MySQL中的Text类型:

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

获取MySQL中的Text类型的两种方法:

reader = ResultSet.getCharacterStream(String columnLabel);String s = ResultSet.getString(String columnLabel);


范例:

1.编写SQL测试脚本:

use jdbcstudy;create table testclob(         id int primary key auto_increment,         resume text);



2.编写Java测试代码:

package me.zl.demo;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.Reader;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import me.zl.utils.JdbcUtils;/** * @ClassName:JdbcOperaClob * @Description:使用JDBC操作MySQL的大文本 */public class JdbcOperaClob {/** * @Method:add * @Description:向数据库中插入大文本数据 */public static void add() {Connection conn = null;PreparedStatement st = null;ResultSet rs = null;Reader reader = null;try {conn = JdbcUtils.getConnection();String sql = "insert into testclob(resume) values(?)";st = conn.prepareStatement(sql);String path = JdbcOperaClob.class.getClassLoader().getResource("1.txt").getPath();//获取的路径中空格会被“20%”代替path = path.replaceAll("20%", " ");//将“20%”替换回空格File file = new File(path);try {reader = new FileReader(file);} catch (FileNotFoundException e) {e.printStackTrace();}st.setCharacterStream(1, reader,(int) file.length());int num = st.executeUpdate();if(num>0){System.out.println("插入成功!!!");}try {//关闭流reader.close();} catch (IOException e) {e.printStackTrace();}} catch (SQLException e) {e.printStackTrace();}finally {JdbcUtils.release(conn, st, rs);}}/** * @Method:read * @Description:读取数据库中的大文本数据 */public static void read() {Connection conn = null;PreparedStatement st = null;ResultSet rs = null;try {conn = JdbcUtils.getConnection();String sql = "select resume from testclob where id=2";st = conn.prepareStatement(sql);rs = st.executeQuery();String contentStr = "";String content = "";if(rs.next()) {//使用resultSet.getString("字段名")获取大文本数据的内容content = rs.getString("resume");//使用ResultSet.getCharacterStream("字段名")获取大文本数据的内容Reader reader = rs.getCharacterStream("resume");char buffer[] = new char[1024];int len = 0;try {FileWriter out = new FileWriter("D:\\1.txt");while((len = reader.read(buffer))>0) {contentStr += new String(buffer);out.write(buffer,0,len);}out.close();reader.close();} catch (IOException e) {e.printStackTrace();}}System.out.println(content);System.out.println("**********************************");System.out.println(contentStr);    } catch (SQLException e) {e.printStackTrace();}finally{JdbcUtils.release(conn, st, rs);}}//main用于检测而已public static void main(String[] args) {add();read();}}

三、使用JDBC处理MySQL的二进制数据

设置MySQL中的BLOB类型:

PreparedStatement.setBinaryStream(i,inputStream,length);

获取MySQL的BLOB类型的两种方法:

InputStream in = resultSet.getBinaryStream(String columnLabel);InputStream in = resultSet.getBlob(String columnLabel).getBinaryStream();

 范例:

 1.编写SQL测试脚本:

use jdbcstudycreate table testblob (     id int primary key auto_increment,     image longblob );

2.编写Java测试代码:

package me.zl.demo;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import me.zl.utils.JdbcUtils;/** * @ClassName:JdbcOperaBlob @Description:使用JDBC操作MySQL的二进制数据(图像、声音、二进制文件) */public class JdbcOperaBlob {// 向数据库中插入二进制数据public void add() {Connection conn = null;PreparedStatement st = null;ResultSet rs = null;try {conn = JdbcUtils.getConnection();String sql = "insert into testblob(image) value(?)";st = conn.prepareStatement(sql);String path = JdbcOperaBlob.class.getClassLoader().getResource("1.jpg").getPath();path = path.replaceAll("%20", " ");File file = new File(path);try {FileInputStream fis = new FileInputStream(file);} catch (FileNotFoundException e) {e.printStackTrace();} // 生成的流st.setBinaryStream(1, fis, (int) file.length());int num = st.executeUpdate();if (num > 0) {System.out.println("插入成功!!!");}fis.close();} catch (SQLException e) {e.printStackTrace();} finally {JdbcUtils.release(conn, st, rs);}}public void read() {Connection conn = null;PreparedStatement st = null;ResultSet rs = null;try {conn = JdbcUtils.getConnection();String sql = "select image from testblob where id=?";st = conn.prepareStatement(sql);st.setInt(1, 1);rs = st.executeQuery();if (rs.next()) {InputStream in = rs.getBinaryStream("image");int len = 0;byte buffer[] = new byte[1024];try {FileOutputStream out = new FileOutputStream("D:\\1.jpg");while ((len = in.read(buffer)) > 0) {out.write(buffer, 0, len);}in.close();out.close();} catch (IOException e) {e.printStackTrace();}}} catch (SQLException e) {e.printStackTrace();}finally {JdbcUtils.release(conn, st, rs);}}// public static void main(String[] args) {//// }}

四、获得MySQL数据库自动生成的主键

创建一个表:

use jdbcstudy;create table testprimary(         id int primary key auto_increment,         name Varchar(20));

Java代码:

package me.zl.demo;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.Statement;import me.zl.utils.JdbcUtils;public class GetPrimary {    public static void main(String[] args) {        Connection conn = null;        PreparedStatement st = null;        ResultSet rs = null;        try{            conn = JdbcUtils.getConnection();            String sql = "insert into testprimary(name) values(?)";            st = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);            st.setString(1, "aaa");            st.executeUpdate();            //获取数据库自动生成的主键            rs = st.getGeneratedKeys();            if(rs.next()){                System.out.println(rs.getInt(1));            }        }catch (Exception e) {            e.printStackTrace();        }finally{            JdbcUtils.release(conn, st, rs);        }    }}