javaweb學(xué)習(xí)總結(jié)——使用JDBC處理MySQL大數(shù)據(jù)
BLOB (binary large object),二進(jìn)制大對(duì)象,是一個(gè)可以存儲(chǔ)二進(jìn)制文件的容器。在計(jì)算機(jī)中,BLOB常常是數(shù)據(jù)庫(kù)中用來(lái)存儲(chǔ)二進(jìn)制文件的字段類型,BLOB是一個(gè)大文件,典型的BLOB是一張圖片或一個(gè)聲音文件,由于它們的尺寸,必須使用特殊的方式來(lái)處理(例如:上傳、下載或者存放到一個(gè)數(shù)據(jù)庫(kù))。
一、基本概念
在實(shí)際開(kāi)發(fā)中,有時(shí)是需要用程序把大文本或二進(jìn)制數(shù)據(jù)直接保存到數(shù)據(jù)庫(kù)中進(jìn)行儲(chǔ)存的。
對(duì)MySQL而言只有blob,而沒(méi)有clob,mysql存儲(chǔ)大文本采用的是Text,Text和blob分別又分為:
TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT
TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB
二、搭建測(cè)試環(huán)境
2.1、搭建的測(cè)試項(xiàng)目架構(gòu)
如圖:
2.2、編寫db.properties配置文件
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/jdbcStudy username=root password=XDP
2.3、編寫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 driver = null;
private static String url = null;
private static String username = null;
private static String password = null;
static{
try{
//讀取db.properties文件中的數(shù)據(jù)庫(kù)連接信息
InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
Properties prop = new Properties();
prop.load(in);
//獲取數(shù)據(jù)庫(kù)連接驅(qū)動(dòng)
driver = prop.getProperty("driver");
//獲取數(shù)據(jù)庫(kù)連接URL地址
url = prop.getProperty("url");
//獲取數(shù)據(jù)庫(kù)連接用戶名
username = prop.getProperty("username");
//獲取數(shù)據(jù)庫(kù)連接密碼
password = prop.getProperty("password");
//加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)
Class.forName(driver);
}catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
/**
* @Method: getConnection
* @Description: 獲取數(shù)據(jù)庫(kù)連接對(duì)象
* @Anthor:孤傲蒼狼
*
* @return Connection數(shù)據(jù)庫(kù)連接對(duì)象
* @throws SQLException
*/
public static Connection getConnection() throws SQLException{
return DriverManager.getConnection(url, username,password);
}
/**
* @Method: release
* @Description: 釋放資源,
* 要釋放的資源包括Connection數(shù)據(jù)庫(kù)連接對(duì)象,負(fù)責(zé)執(zhí)行SQL命令的Statement對(duì)象,存儲(chǔ)查詢結(jié)果的ResultSet對(duì)象
* @Anthor:孤傲蒼狼
*
* @param conn
* @param st
* @param rs
*/
public static void release(Connection conn,Statement st,ResultSet rs){
if(rs!=null){
try{
//關(guān)閉存儲(chǔ)查詢結(jié)果的ResultSet對(duì)象
rs.close();
}catch (Exception e) {
e.printStackTrace();
}
rs = null;
}
if(st!=null){
try{
//關(guān)閉負(fù)責(zé)執(zhí)行SQL命令的Statement對(duì)象
st.close();
}catch (Exception e) {
e.printStackTrace();
}
}
if(conn!=null){
try{
//關(guān)閉Connection數(shù)據(jù)庫(kù)連接對(duì)象
conn.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}
}
三、使用JDBC處理MySQL的大文本
對(duì)于MySQL中的Text類型,可調(diào)用如下方法設(shè)置
PreparedStatement.setCharacterStream(index, reader, length);//注意length長(zhǎng)度須設(shè)置,并且設(shè)置為int型
對(duì)MySQL中的Text類型,可調(diào)用如下方法獲取
reader = resultSet. getCharacterStream(String columnLabel);2 string s = resultSet.getString(String columnLabel);
3.1、 測(cè)試范例
1、編寫SQL測(cè)試腳本
create database jdbcstudy;
use jdbcstudy;
create table testclob
(
id int primary key auto_increment,
resume text
);
2、編寫測(cè)試代碼如下:
package me.gacl.demo;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.Reader;
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 JdbcOperaClob {
/**
* @Method: add
* @Description:向數(shù)據(jù)庫(kù)中插入大文本數(shù)據(jù)
* @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);
//這種方式獲取的路徑,其中的空格會(huì)被使用“%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("插入成功?。?);
}
//關(guān)閉流
reader.close();
}catch (Exception e) {
e.printStackTrace();
}finally{
JdbcUtils.release(conn, st, rs);
}
}
/**
* @Method: read
* @Description: 讀取數(shù)據(jù)庫(kù)中的大文本數(shù)據(jù)
* @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("字段名")獲取大文本數(shù)據(jù)的內(nèi)容
content = rs.getString("resume");
//使用resultSet.getCharacterStream("字段名")獲取大文本數(shù)據(jù)的內(nèi)容
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的二進(jìn)制數(shù)據(jù)
對(duì)于MySQL中的BLOB類型,可調(diào)用如下方法設(shè)置:
PreparedStatement. setBinaryStream(i, inputStream, length);
對(duì)MySQL中的BLOB類型,可調(diào)用如下方法獲?。?br />
InputStream in = resultSet.getBinaryStream(String columnLabel); InputStream in = resultSet.getBlob(String columnLabel).getBinaryStream();
4.1、 測(cè)試范例
1、編寫SQL測(cè)試腳本
create table testblob ( id int primary key auto_increment, image longblob );
2、編寫測(cè)試代碼如下:
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的二進(jìn)制數(shù)據(jù)(例如圖像、聲音、二進(jìn)制文)
* @author: 孤傲蒼狼
* @date: 2014-9-19 下午10:10:04
*
*/
public class JdbcOperaBlob {
/**
* @Method: add
* @Description:向數(shù)據(jù)庫(kù)中插入二進(jìn)制數(shù)據(jù)
* @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);
//這種方式獲取的路徑,其中的空格會(huì)被使用“%20”代替
String path = JdbcOperaBlob.class.getClassLoader().getResource("01.jpg").getPath();
//將“%20”替換會(huì)空格
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: 讀取數(shù)據(jù)庫(kù)中的二進(jìn)制數(shù)據(jù)
* @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);
}
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- JDBC用法小結(jié)
- Java 數(shù)據(jù)庫(kù)連接(JDBC)的相關(guān)總結(jié)
- Java JDBC連接數(shù)據(jù)庫(kù)常見(jiàn)操作總結(jié)
- 使用JDBC連接Mysql數(shù)據(jù)庫(kù)會(huì)出現(xiàn)的問(wèn)題總結(jié)
- JDBC連接mysql亂碼異常問(wèn)題處理總結(jié)
- JDBC常用接口總結(jié)
- Java中JDBC事務(wù)與JTA分布式事務(wù)總結(jié)與區(qū)別
- java開(kāi)發(fā)中基于JDBC連接數(shù)據(jù)庫(kù)實(shí)例總結(jié)
- JDBC連接Sql Server 2005總結(jié)
- 淺析JAVA常用JDBC連接數(shù)據(jù)庫(kù)的方法總結(jié)
- JDBC數(shù)據(jù)庫(kù)的使用操作總結(jié)
- JDBC的擴(kuò)展知識(shí)點(diǎn)總結(jié)
相關(guān)文章
SpringBoot+Vue項(xiàng)目打包部署完整步驟教程
這篇文章主要介紹了SpringBoot+Vue項(xiàng)目打包部署的相關(guān)資料,包括Vue項(xiàng)目的打包設(shè)置、SpringBoot的配置修改、跨域問(wèn)題處理、使用Nginx配置反向代理以及最終的項(xiàng)目啟動(dòng),教程假定開(kāi)發(fā)者已具備完整的前后端分離項(xiàng)目和配置好環(huán)境的服務(wù)器,需要的朋友可以參考下2024-10-10
springboot集成spring cache緩存示例代碼
本篇文章主要介紹了springboot集成spring cache示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
Java輕松使用工具類實(shí)現(xiàn)獲取wav時(shí)間長(zhǎng)度
在Java中,工具類定義了一組公共方法,這篇文章將介紹Java中使用工具類來(lái)獲取一個(gè)wav文件的時(shí)間長(zhǎng)度,感興趣的同學(xué)繼續(xù)往下閱讀吧2021-10-10
淺析Java的Hibernate框架中的緩存和延遲加載機(jī)制
這篇文章主要介紹了Java的Hibernate框架中的緩存和延遲加載機(jī)制,Hibernate是注明的Java下SSH三大web開(kāi)發(fā)框架之一,需要的朋友可以參考下2015-11-11
Hibernate環(huán)境搭建與配置方法(Hello world配置文件版)
這篇文章主要介紹了Hibernate環(huán)境搭建與配置方法,這里演示Hello world配置文件版的具體實(shí)現(xiàn)步驟與相關(guān)代碼,需要的朋友可以參考下2016-03-03
SpringBoot JPA實(shí)現(xiàn)查詢多值
這篇文章主要為大家詳細(xì)介紹了SpringBoot JPA實(shí)現(xiàn)查詢多值,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
springboot如何實(shí)現(xiàn)自動(dòng)裝配源碼解讀
這篇文章主要介紹了springboot如何實(shí)現(xiàn)自動(dòng)裝配源碼賞析,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
Java中Druid連接池連接超時(shí)獲取不到連接的解決
這篇文章主要介紹了Java中Druid連接池連接超時(shí)獲取不到連接的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11

