深入分析JavaWeb Item29 -- 使用JDBC处理大数据(MySql + Oracle)(3)

* @author: 孤傲苍狼
* @date: 2014-9-19 下午10:10:04
*
*/
public class JdbcOperaClob {

/\*\*

* @Method: add
* @Description:向数据库中插入大文本数据
* @Anthor:孤傲苍狼
*
*/
@Test
public 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);
//这种方式获取的路径,其中的空格会被使用“%20”代替
String path = JdbcOperaClob.class.getClassLoader().getResource(“data.txt”).getPath();
//将“%20”替换回空格
path = path.replaceAll(“%20”, " ");
File file = new File(path);
reader = new FileReader(file);
st.setCharacterStream(1, reader,(int) file.length());
int num = st.executeUpdate();
if(num>0){
System.out.println(“插入成功!!”);
}
//关闭流
reader.close();
}catch (Exception e) {
e.printStackTrace();
}finally{
JdbcUtils.release(conn, st, rs);
}
}

/\*\*

* @Method: read
* @Description: 读取数据库中的大文本数据
* @Anthor:孤傲苍狼
*
*/
@Test
public 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;
            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();
        }
        System.out.println(content);
        System.out.println("-----------------------------------------------");
        System.out.println(contentStr);
    }catch (Exception e) {
        e.printStackTrace();
    }finally{
        JdbcUtils.release(conn, st, rs);
    }
}

}


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


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



PreparedStatement. setBinaryStream(i, inputStream, length);


  对MySQL中的BLOB类型,可调用如下方法获取:



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


##### **4.1、 测试范例**


  1、编写SQL测试脚本



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


  2、编写测试代码如下:



package me.gacl.demo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import me.gacl.utils.JdbcUtils;
import org.junit.Test;

/**
* @ClassName: JdbcOperaClob
* @Description: 使用JDBC操作MySQL的二进制数据(例如图像、声音、二进制文)
* @author: 孤傲苍狼
* @date: 2014-9-19 下午10:10:04
*
*/
public class JdbcOperaBlob {

/\*\*

* @Method: add
* @Description:向数据库中插入二进制数据
* @Anthor:孤傲苍狼
*
*/
@Test
public void add(){
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
try{
conn = JdbcUtils.getConnection();
String sql = “insert into testblob(image) values(?)”;
st = conn.prepareStatement(sql);
//这种方式获取的路径,其中的空格会被使用“%20”代替
String path = JdbcOperaBlob.class.getClassLoader().getResource(“01.jpg”).getPath();
//将“%20”替换会空格
path = path.replaceAll(“%20”, " ");
File file = new File(path);
FileInputStream fis = new FileInputStream(file);//生成的流
st.setBinaryStream(1, fis,(int) file.length());
int num = st.executeUpdate();
if(num>0){
System.out.println(“插入成功!!”);
}
fis.close();
}catch (Exception e) {
e.printStackTrace();
}finally{
JdbcUtils.release(conn, st, rs);
}
}

/\*\*

* @Method: read
* @Description: 读取数据库中的二进制数据
* @Anthor:孤傲苍狼
*
*/
@Test
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.getBlob(“image”).getBinaryStream();//这种方法也可以
InputStream in = rs.getBinaryStream(“image”);
int len = 0;
byte buffer[] = new byte[1024];

            FileOutputStream out = new FileOutputStream("D:\\1.jpg");
            while ((len = in.read(buffer)) > 0) {
                out.write(buffer, 0, len);
            }
            in.close();
            out.close();
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        JdbcUtils.release(conn, st, rs);
    }
}

}


  关于使用JDBC处理MySQL大数据的内容就总结这么多!


### 五、Oracle中大数据处理


  在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了。因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种类型的字段,很灵活,适用于数据 量非常大的业务领域(如图象、档案等)。


  LOB类型分为BLOB和CLOB两种:BLOB即二进制大型对象(Binary Large Object),适用于存贮非文本的字节流数据(如程序、图象、影音等)。而CLOB,即字符型大型对象(Character Large Object),则与字符集相关,适于存贮文本型的数据(如历史档案、大部头著作等)。


**六、搭建测试环境**


##### **6.1、建立两个测试用的数据库表**


  建表SQL语句为:



CREATE TABLE TEST_CLOB ( ID NUMBER(3), CLOBCOL CLOB)
CREATE TABLE TEST_BLOB ( ID NUMBER(3), BLOBCOL BLOB)


##### **6.2、搭建测试项目架构**


  ![这里写图片描述](https://img-blog.csdn.net/20151220102251389)


##### **6.3、编写db.properties配置文件**



oracleDb_Driver=oracle.jdbc.driver.OracleDriver
oracleDb_Url=jdbc:oracle:thin:@localhost:1521:GACL
oracleDb_UserName=GACL_XDP
oracleDb_Password=P


##### **6.4、编写JdbcUtils工具类**



package me.gacl.utils;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JdbcUtils {

private static String oracleDb_Driver = null;
private static String oracleDb_Url = null;
private static String oracleDb_UserName = null;
private static String oracleDb_Password = null;

static{
    try{
        //读取db.properties文件中的数据库连接信息
        InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
        Properties prop = new Properties();
        prop.load(in);

        //获取数据库连接驱动
        oracleDb_Driver = prop.getProperty("oracleDb\_Driver");
        //获取数据库连接URL地址
        oracleDb_Url = prop.getProperty("oracleDb\_Url");
        //获取数据库连接用户名
        oracleDb_UserName = prop.getProperty("oracleDb\_UserName");
        //获取数据库连接密码
        oracleDb_Password = prop.getProperty("oracleDb\_Password");

        //加载数据库驱动
        Class.forName(oracleDb_Driver);

    }catch (Exception e) {
        throw new ExceptionInInitializerError(e);
    }
}

/\*\*

* @Method: getOracleConnection
* @Description: 获取Oracle数据库连接对象
* @Anthor:孤傲苍狼
*
* @return Connection数据库连接对象
* @throws SQLException
*/
public static Connection getOracleConnection() throws SQLException{
return DriverManager.getConnection(oracleDb_Url, oracleDb_UserName,oracleDb_Password);
}

/\*\*

* @Method: release
* @Description: 释放资源,
* 要释放的资源包括Connection数据库连接对象,负责执行SQL命令的Statement对象,存储查询结果的ResultSet对象
* @Anthor:孤傲苍狼
*
* @param conn
* @param st
* @param rs
*/
public static void release(Connection conn,Statement st,ResultSet rs){
if(rs!=null){
try{
//关闭存储查询结果的ResultSet对象
rs.close();
}catch (Exception e) {
e.printStackTrace();
}
rs = null;
}
if(st!=null){
try{
//关闭负责执行SQL命令的Statement对象
st.close();
}catch (Exception e) {
e.printStackTrace();
}
}

    if(conn!=null){
        try{
            //关闭Connection数据库连接对象
            conn.close();
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}

}


### 七、JDBC处理Oracle大数据


##### **7.1、JDBC处理CLOB数据**



package me.gacl.demo;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.junit.Test;
import me.gacl.utils.JdbcUtils;

/**
* @ClassName: JdbcOperaOracleClob
* @Description:Oracle中字符型大型对象(Character Large Object)数据处理
* @author: 孤傲苍狼
* @date: 2014-10-7 下午3:53:19
*
*/
public class JdbcOperaOracleClob {

/\*\*

CREATE TABLE TEST_CLOB ( ID NUMBER(3), CLOBCOL CLOB)
*/
/**
* @Method: clobInsert
* @Description:往数据库中插入一个新的CLOB对象
* @Anthor:孤傲苍狼
*
* @throws Exception
*/
@Test
public void clobInsert() throws Exception {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
conn = JdbcUtils.getOracleConnection();
boolean defaultCommit = conn.getAutoCommit();
/*开启事务,设定不自动提交 */
conn.setAutoCommit(false);
try {
/* 插入一个空的CLOB对象 */
String sql = “INSERT INTO TEST_CLOB VALUES (?, EMPTY_CLOB())”;
stmt = conn.prepareStatement(sql);
stmt.setInt(1, 1);
stmt.executeUpdate();
/* 查询此CLOB对象并锁定 */
sql = “SELECT CLOBCOL FROM TEST_CLOB WHERE ID=? FOR UPDATE”;
stmt = conn.prepareStatement(sql);
stmt.setInt(1, 1);
rs = stmt.executeQuery();
if (rs.next()) {
/* 取出此CLOB对象 */
oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob(“CLOBCOL”);
/* 向CLOB对象中写入数据 */
BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());
//这种方式获取的路径,其中的空格会被使用“%20”代替
String path = JdbcOperaClob.class.getClassLoader().getResource(“data.txt”).getPath();
//将“%20”替换回空格
path = path.replaceAll(“%20”, " ");
BufferedReader in = new BufferedReader(new FileReader(path));
int c;
while ((c = in.read()) != -1) {
out.write©;
}
in.close();
out.close();
}
/* 正式提交 */
conn.commit();
System.out.println(“插入成功”);
} catch (Exception ex) {
/* 出错回滚 */
conn.rollback();
throw ex;
}finally{
/* 恢复原提交状态 */
conn.setAutoCommit(defaultCommit);
JdbcUtils.release(conn,stmt,rs);
}

}

/\*\*

* @Method: clobRead
* @Description: CLOB对象读取
* @Anthor:孤傲苍狼
*
* @throws Exception
*/
@Test
public void clobRead() throws Exception {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
conn = JdbcUtils.getOracleConnection();
boolean defaultCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
try {
/* 查询CLOB对象 */
String sql = “SELECT * FROM TEST_CLOB WHERE ID=?”;
stmt = conn.prepareStatement(sql);
stmt.setInt(1, 1);
rs = stmt.executeQuery();
if (rs.next()) {
/* 获取CLOB对象 */
oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob(“CLOBCOL”);
/* 以字符形式输出 */
BufferedReader in = new BufferedReader(clob.getCharacterStream());
BufferedWriter out = new BufferedWriter(new FileWriter(“D:\2.txt”));
int c;
while ((c = in.read()) != -1) {
out.write©;
}
out.close();
in.close();
}
} catch (Exception ex) {
conn.rollback();
throw ex;
}finally{
/* 恢复原提交状态 */
conn.setAutoCommit(defaultCommit);
JdbcUtils.release(conn,stmt,rs);
}
}

/\*\*

* @Method: clobModify
* @Description:修改CLOB对象(是在原CLOB对象基础上进行覆盖式的修改)
* @Anthor:孤傲苍狼
*
* @throws Exception
*/
@Test
public void clobModify() throws Exception {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
conn = JdbcUtils.getOracleConnection();
boolean defaultCommit = conn.getAutoCommit();
// 开启事务
conn.setAutoCommit(false);
try {
/* 查询CLOB对象并锁定 */
String sql = “SELECT CLOBCOL FROM TEST_CLOB WHERE ID=? FOR UPDATE”;
stmt = conn.prepareStatement(sql);
stmt.setInt(1, 1);
rs = stmt.executeQuery();
if (rs.next()) {
/* 获取此CLOB对象 */
oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob(“CLOBCOL”);
/* 进行覆盖式修改 */
BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());
// 这种方式获取的路径,其中的空格会被使用“%20”代替
String path = JdbcOperaClob.class.getClassLoader().getResource(“data2.txt”).getPath();
// 将“%20”替换回空格
path = path.replaceAll(“%20”, " ");
BufferedReader in = new BufferedReader(new FileReader(path));
int c;
while ((c = in.read()) != -1) {
out.write©;
}
in.close();
out.close();
}
/*提交事务 */
conn.commit();
} catch (Exception ex) {
/*出错回滚事务 */
conn.rollback();
throw ex;
}finally{
/*恢复原提交状态 */
conn.setAutoCommit(defaultCommit);
JdbcUtils.release(conn,stmt,rs);
}
}

/\*\*

* @Method: clobReplace
* @Description:替换CLOB对象(将原CLOB对象清除,换成一个全新的CLOB对象)
* @Anthor:孤傲苍狼
*
* @throws Exception
*/
@Test
public void clobReplace() throws Exception {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
conn = JdbcUtils.getOracleConnection();
boolean defaultCommit = conn.getAutoCommit();
// 开启事务
conn.setAutoCommit(false);
try {
/* 清空原CLOB对象 */
String sql = “UPDATE TEST_CLOB SET CLOBCOL=EMPTY_CLOB() WHERE ID=?”;
stmt = conn.prepareStatement(sql);
stmt.setInt(1, 1);
stmt.executeUpdate();

        /\* 查询CLOB对象并锁定 \*/
        sql = "SELECT CLOBCOL FROM TEST\_CLOB WHERE ID=? FOR UPDATE";
        stmt = conn.prepareStatement(sql);
        stmt.setInt(1, 1);
        rs = stmt.executeQuery();
        if (rs.next()) {
            /\* 获取此CLOB对象 \*/
            oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("CLOBCOL");
            /\* 更新数据 \*/
            BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());
            // 这种方式获取的路径,其中的空格会被使用“%20”代替
            String path = JdbcOperaClob.class.getClassLoader().getResource("db.properties").getPath();
            // 将“%20”替换回空格
            path = path.replaceAll("%20", " ");
            BufferedReader in = new BufferedReader(new FileReader(path));
            int c;
            while ((c = in.read()) != -1) {
                out.write(c);
            }
            in.close();
            out.close();
        }
        /\* 正式提交 \*/
        conn.commit();
    } catch (Exception ex) {
        /\* 出错回滚 \*/
        conn.rollback();
        throw ex;
    } finally {
        /\* 恢复原提交状态 \*/
        conn.setAutoCommit(defaultCommit);
        JdbcUtils.release(conn, stmt, rs);
    }
}

}


##### **7.2、JDBC处理BLOB数据**


  Oracle定义了一个BLOB字段用于保存二进制数据,但这个字段并不能存放真正的二进制数据,只能向这个字段存一个指针,然后把数据放到指针所指向的Oracle的LOB段中, LOB段是在数据库内部表的一部分。因而在操作Oracle的Blob之前,必须获得指针(定位器)才能进行Blob数据的读取和写入。   
   如何获得表中的Blob指针呢? 可以先使用insert语句向表中插入一个空的blob(调用oracle的函数empty\_blob()),这将创建一个blob的指针,然后再把这个empty的blob的指针查询出来,这样就可得到BLOB对象,从而读写blob数据了。


  1、插入空blob:`insert into testblob(id,image) values(?,empty_blob())`   
   2、获得blob的cursor:



select image from testblob where id=? for update //注意: 必 须加for update锁定该行,直至该行被修改完毕,保证不产生并发冲突。

Blob b = rs.getBlob(“image”);


       
   3、利用 io和获取到的cursor往数据库读写数据   
   **注意:以上操作需开启事务。**


  BLOB对象的存取范例



package me.gacl.demo;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.junit.Test;
import me.gacl.utils.JdbcUtils;

/**
* @ClassName: JdbcOperaOracleBlob
* @Description:Oracle中大数据处理
* @author: 孤傲苍狼
* @date: 2014-10-7 下午3:53:19
*
*/
public class JdbcOperaOracleBlob {

/\*\*

* @Method: blobInsert
* @Description: 向数据库中插入一个新的BLOB对象
* @Anthor:孤傲苍狼
*
* @throws Exception
*/
@Test
public void blobInsert() throws Exception {
Connection conn = null;
PreparedStatement stmt = null;

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

@author: 孤傲苍狼
* @date: 2014-10-7 下午3:53:19
*
*/
public class JdbcOperaOracleBlob {

/\*\*

* @Method: blobInsert
* @Description: 向数据库中插入一个新的BLOB对象
* @Anthor:孤傲苍狼
*
* @throws Exception
*/
@Test
public void blobInsert() throws Exception {
Connection conn = null;
PreparedStatement stmt = null;

[外链图片转存中…(img-7mvCBW8p-1714833950972)]
[外链图片转存中…(img-MyJr9d9z-1714833950972)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 15
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaSE、Redis和JavaWeb、Spring、Hibernate、MyBatis、MySQLOracle都是Java开发中非常常用的技术,每个技术都有着不同的难点和学习曲线。 JavaSE是Java标准版,是Java编程的基础,包括了Java的基本语法、面向对象编程、集合框架、输入输出、多线程、网络编程等内容。对于初学者来说,JavaSE的学习难度较低。 Redis是一款基于内存的高性能键值存储系统,用于缓存、消息队列和实时数据处理等场景。Redis的学习难度较低,但要深入了解其底层原理和使用场景,需要更多的实践和经验。 JavaWeb是指在Java平台上进行Web开发,包括了Servlet、JSP、JDBC、HTML等内容。JavaWeb的学习难度较低,但需要掌握一些基本的Web开发技能和常用的Web框架。 Spring是一个开源的企业级应用开发框架,主要用于简化企业级应用的开发。Spring的学习难度较高,需要深入理解其设计思想和核心原理,同时需要掌握许多Spring相关的技术和工具。 Hibernate是一个开源的对象关系映射框架,用于将Java对象映射到关系数据库表中。Hibernate的学习难度较高,需要掌握一些ORM相关的基础知识和Hibernate的使用方法。 MyBatis是一个开源的持久层框架,用于将SQL语句和Java对象进行映射。MyBatis的学习难度较高,需要掌握一些基本的ORM相关知识和MyBatis的使用方法。 MySQLOracle都是关系型数据库管理系统,用于存储和管理数据。MySQL的学习难度较低,但需要掌握一些基本的SQL语句和MySQL使用方法。Oracle的学习难度较高,需要掌握一些高级SQL语句和Oracle使用方法,同时还需要了解Oracle的体系结构和底层原理。 综上所述,每个技术都有着不同的难点和学习曲线,没有哪个技术一定比其他技术更难。学习Java开发需要全面掌握这些技术,并且注重理论和实践的结合,才能够成为一名优秀的Java程序员。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值