我們常常在網頁中需要處理一些圖片或者其他的信息,而這些信息在數據庫中的存放,對程序員來說,怎麼存放可以不去理會,但我們從如何JDBCAPI層出發怎麼去處理它們纔是最重要的
我們處理大文本文件需要處理的一個存,一個取。
存:需要用到(statement或者preparedStatement)st.setCharacterStream(1, reader,(int)file.length());//設置存放的參數
取:Clob clob = rs.getClob(1);//獲取Clob存儲的值
reader = clob.getCharacterStream();//將他轉換爲字符流
具體實例:public class ClobTest {
public static void main(String[] args) throws Exception {
//create();
read();
}
static void create() throws Exception{
Connection conn = null;
PreparedStatement st = null;
try {
conn=JdbcUtils.getConnection();
String sql = "insert into user_test(big_text) values(?)";
st=conn.prepareStatement(sql);
File file=new File("src/cn/vickyi/jdbc/JdbcUtils.java");
Reader reader = new BufferedReader(new FileReader(file));
st.setCharacterStream(1, reader,(int)file.length());
//st.setAsciiStream(1, reader,(int)file.length());
int len=st.executeUpdate();
reader.close();
System.out.println(len);
} finally {
JdbcUtils.free(null, st, conn);
}
}
static void read() throws Exception{
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
Date birthday=null;
try {
conn=JdbcUtils.getConnection();
String sql = "select big_text from user_test";
//conn = JdbcUtils.getConnection();
st = conn.prepareStatement(sql);
rs = st.executeQuery();
Writer writer=null;
Reader reader=null;
while (rs.next()) {
Clob clob = rs.getClob(1);
reader = clob.getCharacterStream();
File file=new File("JdbcUtils_bak.java");
writer = new BufferedWriter(new FileWriter(file));
char[] buf=new char[1024];
int len;
while((len=reader.read(buf))>0){
writer.write(buf,0,len);
}
}
writer.close();
reader.close();
} finally {
JdbcUtils.free(rs, st, conn);
}
}
}
二進制文本的處理:
理論差不多,同樣的一個存,一個取,分別用到的函數是:InputStream in = new BufferedInputStream(new FileInputStream(file));//讀取流
st.setBinaryStream(1, in,(int)file.length());//設置Statement的?值
取:有二種方法
a、通過轉換來取得:Blob blob = rs.getBlob(1);
InputStream in = blob.getBinaryStream();
b、直接取得:in=rs.getBinaryStream(1);//這是直接就獲取,不需要取得Blob
具體實例:
package cn.vickyi.jdbc;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Writer;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Date;
public class Blobtest {
/** @param args
* @throws Exception */
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//create();
read();
}
static void create() throws Exception{
Connection conn = null;
PreparedStatement st = null;
try {
conn=JdbcUtils.getConnection();
String sql = "insert into Blod_test(big_bit) values(?)";
st=conn.prepareStatement(sql);
File file=new File("src/cn/vickyi/jdbc/2.jpg");
InputStream in = new BufferedInputStream(new FileInputStream(file));
st.setBinaryStream(1, in,(int)file.length());
int len=st.executeUpdate();
System.out.println(len);
in.close();
} finally {
JdbcUtils.free(null, st, conn);
}
}
static void read() throws Exception{
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
Date birthday=null;
try {
conn=JdbcUtils.getConnection();
String sql = "select big_bit from Blod_test";
//conn = JdbcUtils.getConnection();
st = conn.prepareStatement(sql);
rs = st.executeQuery();
//一般都要把列名寫出來
while (rs.next()) {
Blob blob = rs.getBlob(1);
InputStream in = blob.getBinaryStream();
in=rs.getBinaryStream(1);//這是直接就獲取,不需要取得Blob
File file=new File("1.jpg");
OutputStream out = new BufferedOutputStream(new FileOutputStream(file));
byte[] buf=new byte[1024];
int len;
while((len=in.read(buf))!=-1){
out.write(buf,0,len);
}
}
} finally {
JdbcUtils.free(rs, st, conn);
}
}
}
javabean:
javabean中的對應的屬性值和JSP中設置的屬性值的名稱一定要對稱
Javabean具有良好的跨平臺,通用性,易於不懂Java的程序員來讀程序,簡寫代碼
用來替代繁瑣的servlet程序中的表達示值。