目標:把***儲存到資料庫中!
在my.ini中新增如下配置!
max_allowed_packet=10485760
blob (binary large object): 二進位製大物件–>位元組資料大物件
clob(chractor large object): 字元資料大物件
1.什麼是sql當中的大資料
所謂sql當中的大資料,就是大的位元組資料,或大的字元資料。
標準sql中提供了如下型別來儲存大資料型別:
型別長度
tinyblob
28–1b(256b)
blob
216-1b(64k)
mediumblob
224-1b(16m)
longblob
232-1b(4g)
tinyclob
28–1b(256b)
clob
216-1b(64k)
mediumclob
224-1b(16m)
longclob
232-1b(4g)
但是,在mysql中沒有提供tinyclob、clob、mediumclob、longclob
四種型別,
mysql當中沒有字元資料大物件,只有位元組資料大物件
字元資料物件主要用來處理文字,位元組資料物件可以用來處理一切形式的資料。
在mysql當中用來處理文字的大資料物件是下面的格式
使用如下四種型別來處理文字大資料: 型別
長度tinytext
28–1b(256b)
text
216-1b(64k)
mediumtext
224-1b(16m)
longtext
232-1b(4g)
首先我們需要建立一張表,
表中要有乙個mediumblob(16m)型別的字段。
create
table tab_bin(
id int
primary
key auto_increment,
filename varchar(100),
data mediumblob
);
向資料庫插入二進位制資料需要使用preparedstatement
物件的setbinarystream(int, inputsteam)
方法來完成。
pstmt.executeupdate();讀取二進位制資料,
需要在查詢後使用resultset類
的getbinarystream()
方法來獲取輸入流物件。
也就是說,
preparedstatement
有set***()
,
那麼resultset
就有get***()
。
con = jdbcutils.getconnection();
string sql = "select filename,data from tab_bin where id=?"
;pstmt = con.preparestatement(sql);
pstmt.setint(1, 1);
rs = pstmt.executequery();
rs.next();
string filename = rs.getstring("filename");
outputstream out = new fileoutputstream("f:\\" + filename);
inputstream in = rs.getbinarystream("data");
ioutils.copy(in, out);
out.close();
還有一種方法,
就是把要儲存的資料報裝成blob型別,
然後呼叫preparedstatement的setblob()方法來設定資料
byte datas = fileutils.getbytes(file);//獲取檔案中的資料
blob blob = new serialblob(datas);//建立blob物件
pstmt.setblob(2, blob);//設定blob型別的引數
pstmt.executeupdate();
con = jdbcutils.getconnection();
string sql = "select filename,data from tab_bin where id=?"
;pstmt = con.preparestatement(sql);
pstmt.setint(1, 1);
rs = pstmt.executequery();
rs.next();
string filename = rs.getstring("filename");
file file = new file("f:\\" + filename) ;
blob blob = rs.getblob("data");
byte datas = blob.getbytes(0, (int)file.length());
fileutils.writebytearraytofile(file, datas);批處理就是一批一批的處理,而不是乙個乙個的處理!
當你有10條sql語句要執行時,一次向伺服器傳送一條sql語句,
這麼做效率上很差!處理的方案是使用批處理,
即一次向伺服器傳送多條sql語句,然後由伺服器一次性處理。
批處理只針對更新(增、刪、改)語句,
批處理沒有查詢什麼事兒!
可以多次呼叫statement類
的addbatch(string sql)
方法,
把需要執行的所有sql語句新增到乙個「批」中,
然後呼叫statement類
的executebatch()方法
來執行當前「批」中的語句。
for(int i = 0; i < 10; i++)
stmt.executebatch();
當執行了「批」之後,
「批」中的sql語句就會被清空!
也就是說,連續兩次呼叫executebatch()相當於呼叫一次!
因為第二次呼叫時,「批」中已經沒有sql語句了。
還可以在執行「批」之前,呼叫statement的clearbatch()方法來清空「批」!
preparedstatement
的批處理有所不同,
因為每個preparedstatement物件都繫結一條sql模板。
所以向preparedstatement中新增的不是sql語句,
而是給「?」賦值。
con = jdbcutils.getconnection();
string sql = "insert into stu values(?,?,?,?)"
;pstmt = con.preparestatement(sql);
for(int i = 0
; i < 10; i++)
pstmt.executebatch();
JDBC處理大資料 二進位制資料和批處理
例如,文字資料 儲存 preparestatement.setcharacterstream index,fis,length nt index 是預編譯sql語句中大文字資料的引數索引位置 fis 大文字資料的輸入流 length 大文字資料的長度 獲取 方法一 reader resultset....
JDBC處理大資料
使用mysql資料庫也可以處理大資料,在實際開發中需要把大文字或者二進位制資料儲存到資料庫中去。clob是用來儲存大文字的,mysql資料庫不支援。bclob用於儲存二進位制資料,例如 影象 聲音 二進位制檔案等。對於mysql的text型別,可呼叫如下方法設定 preparedstatment.s...
JDBC 批處理 插入大量資料
使用jdbc向資料庫插入100000條記錄,分別使用statement,preparedstatement,及preparedstatement 批處理3種方式進行測試 1 使用statement插入100000條記錄 public void exec connection conn catch s...