CREATE TABLE TUSER
(
ID VARCHAR2(32 BYTE) NOT NULL,
NAME VARCHAR2(20 BYTE) NOT NULL,
SEX VARCHAR2(1 BYTE),
AGE NUMBER(3),
ADDRESS VARCHAR2(100 BYTE),
PHONE NUMBER(10),
EMAIL VARCHAR2(255 BYTE),
IMAGE BLOB,
RESUME CLOB
)
public class test2 {
public static void main(String[] args) {
// testWriteLob();
testReadLob();
}
public static void testReadLob() {
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
String hql = "from ynn.hibernate.model.TUser";
Query query = session.createQuery(hql);
List<TUser> list = query.list();
Iterator<TUser> iter = list.iterator();
while (iter.hasNext()) {
TUser user = (TUser) iter.next();
try {
InputStream is = user.getImage().getBinaryStream();
OutputStream os = new FileOutputStream("a.jpg");
// 通过is.availabel()得不到总长度
byte[] buf = new byte[1024];
int i = 0;
while((i=is.read(buf))!=-1){
os.write(buf,0,i);
}
// 以下读Clob
is = user.getResume().getAsciiStream();
while((i=is.read(buf))!=-1){
System.out.println(new String(buf,0,i));
}
is.close();
os.close();
} catch (SQLException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
session.close();
}
// Clob ,Blob在SQLSERVER下的读写操作 P138
// Oracle的Clob, Blob都有自己的游标
public static void testWriteLob() {
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
TUser user = new TUser();
user.setAge(new Long(20));
user.setName("Shark");
user.setImage(Hibernate.createBlob(new byte[1]));
user.setResume(Hibernate.createClob(" "));
Transaction tx = session.beginTransaction();
session.save(user);
// flush() 强制Hibernate立即执行insert sql
session.flush();
// 通过refresh(), 强制Hibernate执行select for update
session.refresh(user, LockMode.UPGRADE);
System.out.println(user.getImage().getClass());
/* 向Blob写入实际内容 */
// 返回的是SerializableBlob类型的对象,这是个实现了Blob接口的对象,但
// 不能直接转型为BLOB
SerializableBlob sb = (SerializableBlob) user.getImage();
// 需要调用它的getWrappedBlob来转型
BLOB blob = (BLOB) sb.getWrappedBlob();
try {
// 将某个问件读入后,写到Blob字段的输出流中
OutputStream out = blob.getBinaryOutputStream();
FileInputStream imgis = new FileInputStream("C:\\kb3.jpg");
byte[] buf = new byte[102400]; // 10k缓存
int len;
while ((len = imgis.read(buf)) > 0) {
out.write(buf, 0, len);
}
imgis.close();
out.close();
} catch (SQLException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// 向Clob写入实际内容
SerializableClob sc = (SerializableClob) user.getResume();
CLOB clob = (CLOB) sc.getWrappedClob();
java.io.Writer writer;
try {
writer = clob.getCharacterOutputStream();
writer.write("this is my resume");
writer.close();
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// save
session.save(user);
tx.commit();
session.close();
}
转载自:http://huazhouji.iteye.com
Hibernate读写Oracle BLOB
最新推荐文章于 2020-12-19 05:12:58 发布