1.jdbc總結(jié)(模板、八股文):
try{
a.導(dǎo)入驅(qū)動(dòng)包、加載具體驅(qū)動(dòng)類Class.forName("具體驅(qū)動(dòng)類");
b.與數(shù)據(jù)庫(kù)建立連接connection = DriverManager.getConnection(...);
c.通過(guò)connection,獲取操作數(shù)據(jù)庫(kù)的對(duì)象(Statement\preparedStatement\callablestatement)
stmt = connection.createStatement();
d.(查詢)處理結(jié)果集rs = pstmt.executeQuery()
while(rs.next()){ rs.getXxx(..) ;}
}catch(ClassNotFoundException e )
{ ...}
catch(SQLException e)
{...
}
catch(Exception e)
{...
}
finally
{
//打開順序,與關(guān)閉順序相反
if(rs!=null)rs.close()
if(stmt!=null) stmt.close();
if(connection!=null)connection.close();
}
--jdbc中,除了Class.forName() 拋出ClassNotFoundException,其余方法全部拋SQLException
2.CallableStatement:調(diào)用 存儲(chǔ)過(guò)程、存儲(chǔ)函數(shù)
connection.prepareCall(參數(shù):存儲(chǔ)過(guò)程或存儲(chǔ)函數(shù)名)
參數(shù)格式:
存儲(chǔ)過(guò)程(無(wú)返回值return,用out參數(shù)替代):
{ call 存儲(chǔ)過(guò)程名(參數(shù)列表) }
存儲(chǔ)函數(shù)(有返回值return):
{ ? = call 存儲(chǔ)函數(shù)名(參數(shù)列表) }
create or replace procedure addTwoNum ( num1 in number,num2 in number,result out number ) -- 1 + 2 ->3
as
begin
result := num1+num2 ;
end ;
/
強(qiáng)調(diào):
如果通過(guò)sqlplus 訪問(wèn)數(shù)據(jù)庫(kù),只需要開啟:OracleServiceSID
通過(guò)其他程序訪問(wèn)數(shù)據(jù)(sqldevelop、navicate、JDBC),需要開啟:OracleServiceSID、XxxListener
3.1JDBC調(diào)用存儲(chǔ)過(guò)程的步驟:
a.產(chǎn)生 調(diào)用存儲(chǔ)過(guò)程的對(duì)象(CallableStatement) cstmt = connection.prepareCall( “…” ) ; b.通過(guò)setXxx()處理 輸出參數(shù)值 cstmt.setInt(1, 30); c.通過(guò) registerOutParameter(…)處理輸出參數(shù)類型 d.cstmt.execute()執(zhí)行 e.接受 輸出值(返回值)getXxx()
3.2調(diào)存儲(chǔ)函數(shù):
create or replace function addTwoNumfunction ( num1 in number,num2 in number) – 1 + 2 return number as result number ; begin result := num1+num2 ; return result ; end ; / JDBC調(diào)用存儲(chǔ)函數(shù):與調(diào)存儲(chǔ)過(guò)程的區(qū)別: 在調(diào)用時(shí),注意參數(shù):"{? = call addTwoNumfunction (?,?) }"
3.處理CLOB/BLOB類型
處理稍大型數(shù)據(jù):
a.存儲(chǔ)路徑 E:\JDK_API_zh_CN.CHM 通過(guò)JDBC存儲(chǔ)文件路徑,然后 根據(jù)IO操作處理 例如:JDBC將 E:\JDK_API_zh_CN.CHM 文件 以字符串形式“E:\JDK_API_zh_CN.CHM”存儲(chǔ)到數(shù)據(jù)庫(kù)中 獲取:1.獲取該路徑“E:\JDK_API_zh_CN.CHM” 2.IO
b. CLOB:大文本數(shù)據(jù) (小說(shuō)->數(shù)據(jù)) BLOB:二進(jìn)制
clob:大文本數(shù)據(jù) 字符流 Reader Writer 存 a.先通過(guò)pstmt 的? 代替小說(shuō)內(nèi)容 (占位符) b.再通過(guò)pstmt.setCharacterStream(2, reader, (int)file.length()); 將上一步的?替換為 小說(shuō)流, 注意第三個(gè)參數(shù)需要是 Int類型
取: a.通過(guò)Reader reader = rs.getCharacterStream(“NOVEL”) ; 將cloc類型的數(shù)據(jù) 保存到Reader對(duì)象中 b. 將Reader通過(guò)Writer輸出即可。
blob:二進(jìn)制 字節(jié)流 InputStream OutputStream 與CLOB步驟基本一致,區(qū)別:setBinaryStream(…) getBinaryStream(…)
4.JSP訪問(wèn)數(shù)據(jù)庫(kù)
JSP就是在html中嵌套的java代碼,因此 java代碼可以寫在jsp中(<% … %>)
導(dǎo)包操作:java項(xiàng)目 :1 Jar復(fù)制到工程中 2.右鍵該Jar :build path ->add to build Path Web項(xiàng)目:jar復(fù)制到WEB-INF/lib
核心:就是將 java中的JDBC代碼,復(fù)制到 JSP中的<% … %>
注意:如果jsp出現(xiàn)錯(cuò)誤:The import Xxx cannot be resolved
嘗試解決步驟: a.(可能是Jdk、tomcat版本問(wèn)題) 右鍵項(xiàng)目->build path,將其中 報(bào)錯(cuò)的 libary或Lib 刪除后 重新導(dǎo)入 b.清空各種緩存:右鍵項(xiàng)目->Clean tomcat… clean (Project -clean或者 進(jìn)tomcat目錄 刪除里面work的子目錄) c.刪除之前的tomcat,重新解壓縮、配置tomcat,重啟計(jì)算機(jī) d.如果類之前沒(méi)有包,則將該類加入包中
5.JavaBean
剛才我們將 jsp中 登錄操作的代碼 轉(zhuǎn)移到了LoginDao.java;其中LoginDao類 就稱之為JavaBean。 JavaBean的作用:
a.減輕的jsp復(fù)雜度
b.提高代碼復(fù)用(以后任何地方的 登錄操作,都可以通過(guò)調(diào)用LoginDao實(shí)現(xiàn))
JavaBean(就是一個(gè)Java類)的定義:滿足一下2點(diǎn) ,就可以稱為JavaBean a.public 修飾的類 ,public 無(wú)參構(gòu)造 b.所有屬性(如果有) 都是private,并且提供set/get (如果boolean 則get 可以替換成is)
使用層面,Java分為2大類: a.封裝業(yè)務(wù)邏輯的JavaBean (LoginDao.java封裝了登錄邏輯) 邏輯 可以將jsp中的JDBC代碼,封裝到Login.java類中 (Login.java)
b.封裝數(shù)據(jù)的JavaBean (實(shí)體類,Student.java Person.java ) 數(shù)據(jù) 對(duì)應(yīng)于數(shù)據(jù)庫(kù)中的一張表 Login login = new Login(uname,upwd) ;//即用Login對(duì)象 封裝了2個(gè)數(shù)據(jù)(用戶名 和密碼)
封裝數(shù)據(jù)的JavaBean 對(duì)應(yīng)于數(shù)據(jù)庫(kù)中的一張表 (Login(name,pwd)) 封裝業(yè)務(wù)邏輯的JavaBean 用于操作 一個(gè)封裝數(shù)據(jù)的JavaBean
可以發(fā)現(xiàn),JavaBean可以簡(jiǎn)化 代碼(jsp->jsp+java)、提供代碼復(fù)用(LoginDao.java)
public void sleep(String name,String place, int time) {
}
public void sleep(Person per) { per.getName() per.getPlace() … }
6.MVC設(shè)計(jì)模式:
M:Model ,模型 :一個(gè)功能。用JavaBean實(shí)現(xiàn)。
V:View,視圖: 用于展示、以及與用戶交互。使用html js css jsp jquery等前端技術(shù)實(shí)現(xiàn)
C:Controller,控制器 :接受請(qǐng)求,將請(qǐng)求跳轉(zhuǎn)到模型進(jìn)行處理;模型處理完畢后,再將處理的結(jié)果 返回給 請(qǐng)求處 。 可以用jsp實(shí)現(xiàn), 但是一般建議使用 Servlet實(shí)現(xiàn)控制器。
Jsp->Java(Servlet)->JSP
Servlet: Java類必須符合一定的 規(guī)范: a.必須繼承 javax.servlet.http.HttpServlet b.重寫其中的 doGet()或doPost()方法
doGet(): 接受 并處 所有g(shù)et提交方式的請(qǐng)求 doPost():接受 并處 所有post提交方式的請(qǐng)求
Servlet要想使用,必須配置 Serlvet2.5:web.xml Servle3.0: @WebServlet
Serlvet2.5:web.xml:
項(xiàng)目的根目錄:WebContent 、src
所在的jsp是在 WebContent目錄中,因此 發(fā)出的請(qǐng)求WelcomeServlet 是去請(qǐng)求項(xiàng)目的根目錄。
Servlet流程: 請(qǐng)求 -> -> 根據(jù)中的 去匹配 中的,然后尋找到,求中將請(qǐng)求交由該執(zhí)行。
2個(gè)/: jsp:/ localhost:8888 comeServlet 是去請(qǐng)求項(xiàng)目的根目錄。
Servlet流程: 請(qǐng)求 -> -> 根據(jù)中的 去匹配 中的,然后尋找到,求中將請(qǐng)求交由該執(zhí)行。
2個(gè)/: jsp:/ localhost:8888 web.xml: / http://localhost:8888/項(xiàng)目名/