一個Jsp初學者的學習過程(七)

來源:互聯網
上載者:User
js|初學|過程 一個Jsp初學者的學習過程(七)

TheUnforgiven


第七章 超長文本的操作——Clob類型資料的存取

回到我編寫留言板的時候,當時要存放留言板的本文內容,發現VARCHAR2()(可變長度的字串)只能存4000位元組,也就是2000個漢字,這也太少了啊,查一下資料庫類型的資料,發現有這麼幾個類型:LONG,2G(要是我沒記錯的話,它是為了向前相容,不推薦使用);CLOB,4G,字元;BLOB,4G,二進位。看來超長文本應該使用CLOB了,圖片自然是用BLOB了,詢問了一下別人,知道這兩種類型是不能像VARCHAR2()那樣直接存的,只好作罷,先用VARCHAR2()頂一陣。
後來我終於有空了,決心要完成這個任務,在網上查了一番資料,看了別人的例子,總算是無師自通看明白了:存的時候需要使用empty_clob()(這個不是Java的函數)先存一個空的標識(用我的理解就是先初始化一下),然後通過“流”將資料寫入。下面是代碼,其中try裡面的是CLOB類型的存操作:
-----------------------------------save_new.jsp------------------------------------------
<%@ include file="include.inc"%>
<%@ page contentType="text/html;charset=gb2312" errorPage="request_error.htm"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>無標題文檔</title>
</head>
<body>
<%
String title = request.getParameter("title");
String kind=request.getParameter("kind");
String newtitle=title.replaceAll("'","''");//用replaceAll()將text字串中所有的單引號改成連續兩個單引號

String text = request.getParameter("text");
//String text1=text.replaceAll("'","''");存clob時不需將單引號改成連續兩個單引號
String text2=text.replaceAll("<","<");//用replaceAll()將字串中所有的<改成<
String newtext=text2.replaceAll(">",">");//用replaceAll()將字串中所有的>改成>
//replace只能處理單個字元!!
//改'是為了不影響資料庫的查詢語句
//改<>是防止網頁把他們產生標籤,比如:<table>,<form>等
String author=session.getAttribute("name").toString();
out.println(author);
long ID=System.currentTimeMillis();//取得一個時間,從1970-1-1 0:00:00開始到目前時間的毫秒數,用這個數作為該文章的ID標識
java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //格式化日期
java.util.Date currentTime_1 = new java.util.Date();//得到當前系統時間
String strdate = formatter.format(currentTime_1); //將日期時間轉換成字串形式

Connection con = null;
PreparedStatement stmt = null;//不能用Statement,我也不知道為什麼,查了API,說這個PreparedStatement可以用於
//高效的多次執行語句,沒查到Statement這個類
ResultSet rs = null;
try
{
Class.forName(CLASSFORNAME);//載入驅動程式類別
con=DriverManager.getConnection(SERVANDDB);//建立資料庫連接
con.setAutoCommit(false);//設定不自動認可
String sql="insert into article(id,author,title,time,kind,text_clob) values ('"+ID+"','"+author+"','"+newtitle+"','"+strdate+"','"+kind+"',empty_clob())";//我的資料庫中存文本的CLOB型欄位名為:text_clob
stmt=con.prepareStatement(sql);//添加一條clob欄位為空白的記錄,
stmt.executeUpdate();//執行
stmt=null;//下次使用前清空
sql="select text_clob from article where id='"+ID+"' for update";//正是由於這條語句,id這個標識就必須得唯一!!!!
//如果資料庫中已有一條記錄的id與當前的id值相同,那麼會查到那條記錄,也就無法向新插入的記錄中的clob欄位進行寫入!
stmt=con.prepareStatement(sql);//尋找剛剛添加的那條記錄
rs=stmt.executeQuery();

oracle.sql.CLOB osc = null;//初始化一個空的clob對象
if (rs.next())
osc=(oracle.sql.CLOB)rs.getClob("text_clob");
Writer w=osc.getCharacterOutputStream();//使用字元輸出資料流
w.write(newtext);//將字串str_text寫到流中
w.flush();//輸出資料流中資料,大概是正式向clob中寫了
w.close();
con.commit();//執行
response.sendRedirect("index.jsp?page=1");//回首頁面
}
catch(Exception e)
{out.println(e);}
finally
{
if (rs!=null)
rs.close();
if (stmt!=null)
stmt.close();
if (con!=null)
con.close();
}
%>
</body>
</html>
--------------------------------------------------------------------------
取的時候就相對簡單了,主要就兩句,看下面的代碼:
--------------------------------------------------------------------------
<%
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
long ID=Long.parseLong(request.getParameter("ID"));//將接收到的字串轉成long型
try
{
Class.forName(CLASSFORNAME);//載入驅動程式類別
con=DriverManager.getConnection(SERVANDDB);//建立資料庫連接
stmt=con.createStatement();
String sql="select * from Article where ID='"+ID+"'";
rs=stmt.executeQuery(sql);
if (rs.next())
{ //下2行是用於從clob類型裡讀資料的,轉成字串。
oracle.sql.CLOB osc=(oracle.sql.CLOB)rs.getClob("text_clob");//我的資料庫中存文本的CLOB型欄位名為:text_clob
String str_text=osc.getSubString((long)1,(int)osc.length());//subString是截取字串(從1截到length),如果用 osc.getString的話出錯。
out.print(str_text);
}//if
}//try
catch(Exception e){}
rs.close();
stmt.close();
con.close();
%>
--------------------------------------------------------------------------
現在對CLOB類型的存取問題已經解決,但是當你操作文本字串的時候你會發現很多問題,比如說,文本裡有單引號(')、標籤(如<table>、<br>),還有斷行符號和空格的問題等等,都需要你在實踐中發現並解決。
下一章說說BLOB。



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.