Hibernate對與Oracle中Clob類型的使用
一.了解和分析:
1.為何實用Clob:
oracle資料庫當需要存入大資料量(大于4000)時,varchar2不夠用,可以使用clob,本文描述clob怎麼和Hibernate一起使用。
2.Clob類型的屬性的指派方式—— String轉Clob:
String content = request.getParameter("content");//1.從request請求中取值(String類型的)
Clob clob = Hibernate.createClob(content);//2.通過hibernate将string轉化為clob
news.setContent(clob);//3.給實體類對應屬性指派
3.Clob類型的屬性的取值方式—— Clob轉String:
List<News> list = query.addEntity(News.class).list();//1.從資料庫取值
News news = (News)list.get(0);//2.取News對象
String content = ClobUtil.ClobToString(news.getContent());//3.将news對象中的clob類型的content轉化為String字元串
二.執行個體分析:
1.建表:News新聞表
2.建立實體類和映射檔案:
public class News {
private Long id;
private String dir;
private String fileName;
private String title;
private String tag;
private String imgUrl;
private Integer type;
private String creator;
private Date createDate;
private String remark;
private Integer ishot;
private Clob content;
......
}
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2014-11-28 9:58:10 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.datanew.czfc.frontPage.entity.News" table="NEWS">
<id name="id" column="ID">
<generator class="sequence">
<param name="sequence">SQ_NEWS</param>
</generator>
</id>
<property name="dir" type="java.lang.String">
<column name="DIR" />
</property>
<property name="fileName" type="java.lang.String">
<column name="FILE_NAME" />
</property>
<property name="title" type="java.lang.String">
<column name="TITLE" />
</property>
<property name="tag" type="java.lang.String">
<column name="TAG" />
</property>
<property name="imgUrl" type="java.lang.String">
<column name="IMG_URL" />
</property>
<property name="type" type="java.lang.Integer">
<column name="TYPE" />
</property>
<property name="creator" type="java.lang.String">
<column name="CREATOR" />
</property>
<property name="createDate" type="java.util.Date">
<column name="CREATE_DATE" />
</property>
<property name="remark" type="java.lang.String">
<column name="REMARK" />
</property>
<property name="ishot" type="java.lang.Integer">
<column name="ISHOT" />
</property>
<property name="content" type="java.sql.Clob">
<column name="CONTENT" />
</property>
</class>
</hibernate-mapping>
3.增加News的Servlet::—— 需要對String資料轉化成Clob資料
String title = request.getParameter("title");
String tag = request.getParameter("tag");
String content = request.getParameter("content");
String typeStr = request.getParameter("type");
String ishotStr = request.getParameter("ishot");
int type = Integer.valueOf(typeStr);
int ishot = 0;
if("on".equals(ishotStr)){
ishot = 1;
}
Clob clob = Hibernate.createClob(content);
INewsDao newsDao = new NewsDaoImpl();
News news = new News();
news.setDir(htmlDir + detailDir);
news.setFileName(fileName);
news.setCreateDate(createDate);
news.setCreator(user.getUsername());
news.setTitle(title);
news.setTag(tag);
news.setType(type);
news.setIshot(ishot);
news.setContent(clob);
newsDao.saveNews(news);
注意:要對request擷取的字元串用hibernate轉化為clob類型
4.從資料庫擷取news中的Content:—— 需要對String資料轉化成Clob資料
public String getNewsContentById(int id) {
Session s = null;
News news = null;
String content = null;
try {
s = HibernateUtil.getSession();
s.beginTransaction();
StringBuffer sb = new StringBuffer("select * from news where id = " + id);
SQLQuery query = s.createSQLQuery(sb.toString());
news = (News) query.addEntity(News.class).uniqueResult();
content = ClobUtil.ClobToString(news.getContent());
s.getTransaction().commit();
} catch (Exception e) {
logger.error(e.toString());
HibernateUtil.endSession(s);
} finally {
HibernateUtil.endSession(s);
}
return content;
}
注意:要對擷取到的實體類中的Clob類型資料轉化為String類型
5.Clob工具類:
public class ClobUtil {
public static String ClobToString(Clob clob) {
String clobStr = "";
Reader is = null;
try {
is = clob.getCharacterStream();
// 得到流
BufferedReader br = new BufferedReader(is);
String s = null;
s = br.readLine();
StringBuffer sb = new StringBuffer();
//執行循環将字元串全部取出指派給StringBuffer,由StringBuffer轉成String
while (s != null) {
sb.append(s);
s = br.readLine();
}
clobStr = sb.toString();
} catch (IOException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return clobStr;
}
}
注意:通過流的方式讀取Clob類型資料