Java知識點總結(JDBC-二進位制物件的使用)
@(Java知識點總結)[Java, JDBC]
BLOB(Binary Large Object)
- 用於儲存大量的二進位制資料
- 大欄位有些特殊,不同資料庫處理的方式不一樣,大欄位的操作常常是以流的方式來處理的。而非一般的欄位,一次即可讀出資料。
Mysql中相關型別 :
- TINYBLOB最大長度為255(2^[8]-1)位元組的BLOB列。
- BLOB[(M)]最大長度為65,535(2^[24]-1)位元組的BLOB列。
- MEDIUMBLOB最大長度為16,777,215(2^[24]-1)位元組的BLOB列。
- LONGBLOB最大長度為4,294,967,295或4GB[2^[32]-1]位元組的BLOB列。
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 二進位制物件的使用
* 插入一張圖片,並讀取出來
* @author Administrator
*
*/
public class Demo03 {
//存
private static void insert(Connection conn) {
String sql = "insert into users(NAME,IMG) values(?,?)";
PreparedStatement ps = null;
try {
ps = conn.prepareStatement(sql);
ps.setString(1, "baby");
ps.setBlob(2, new FileInputStream("E:/a.jpg"));
ps.execute();
} catch (SQLException | FileNotFoundException e) {
e.printStackTrace();
} finally {
DBUtil. close(ps);
DBUtil. close(conn);
}
}
// 讀
private static void read(Connection conn) {
String sql = "select * from users where USERID = ?";
PreparedStatement ps = null;
ResultSet rs = null;
InputStream is = null;
FileOutputStream fos = null;
try {
ps = conn.prepareStatement(sql);
ps.setObject(1, 14);
rs = ps.executeQuery();
while (rs.next()) {
Blob b = rs.getBlob("IMG");
is = b.getBinaryStream();
fos = new FileOutputStream("E:/b.jpg");
int temp = 0;
while ((temp = is.read()) != -1) {
fos.write(temp);
}
}
} catch (SQLException | IOException e) {
e.printStackTrace();
} finally {
try {
if(is !=null){
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if(fos != null){
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
DBUtil. close(rs);
DBUtil. close(ps);
DBUtil. close(conn);
}
}
public static void main(String[] args) {
insert(DBUtil.getConn());
read(DBUtil.getConn());
}
}