天天看點

Hibernate對與Oracle中Clob類型的使用

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新聞表  

Hibernate對與Oracle中Clob類型的使用

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;
	......
}      
Hibernate對與Oracle中Clob類型的使用
<?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>      
Hibernate對與Oracle中Clob類型的使用

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類型  

Hibernate對與Oracle中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類型  

Hibernate對與Oracle中Clob類型的使用

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類型資料