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());
}
}