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

本文介绍如何使用JDBC处理MySQL中的大数据,包括大文本和二进制数据的存储与读取,以及如何获取自动生成的主键。

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

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 jdbcstudy
create 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);
        }
    }
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值