![Java Web編程技術(shù) 課件 第5章Web數(shù)據(jù)庫編程_第1頁](http://file4.renrendoc.com/view14/M05/20/2E/wKhkGWcdkp-AG6bwAAKabzrXYX8043.jpg)
![Java Web編程技術(shù) 課件 第5章Web數(shù)據(jù)庫編程_第2頁](http://file4.renrendoc.com/view14/M05/20/2E/wKhkGWcdkp-AG6bwAAKabzrXYX80432.jpg)
![Java Web編程技術(shù) 課件 第5章Web數(shù)據(jù)庫編程_第3頁](http://file4.renrendoc.com/view14/M05/20/2E/wKhkGWcdkp-AG6bwAAKabzrXYX80433.jpg)
![Java Web編程技術(shù) 課件 第5章Web數(shù)據(jù)庫編程_第4頁](http://file4.renrendoc.com/view14/M05/20/2E/wKhkGWcdkp-AG6bwAAKabzrXYX80434.jpg)
![Java Web編程技術(shù) 課件 第5章Web數(shù)據(jù)庫編程_第5頁](http://file4.renrendoc.com/view14/M05/20/2E/wKhkGWcdkp-AG6bwAAKabzrXYX80435.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
JavaWeb編程技術(shù)本章首先介紹MySQL數(shù)據(jù)庫的使用,然后介紹JDBC訪問數(shù)據(jù)庫的步驟,并通過一個實(shí)例演示Servlet訪問MySQL數(shù)據(jù)庫,接下來介紹數(shù)據(jù)源和連接池的概念及應(yīng)用,最后介紹使用DAO設(shè)計模式訪問數(shù)據(jù)庫。MySQL數(shù)據(jù)庫JDBC訪問數(shù)據(jù)庫步驟數(shù)據(jù)源的配置和使用DAO設(shè)計模式第5章Web數(shù)據(jù)庫編程Web應(yīng)用一般需要訪問數(shù)據(jù)庫,Java程序使用JDBC訪問數(shù)據(jù)庫,它是Java程序訪問數(shù)據(jù)庫的標(biāo)準(zhǔn),它是由一組Java語言編寫的類和接口組成,實(shí)現(xiàn)對數(shù)據(jù)庫操作。MySQL數(shù)據(jù)庫MySQL是一款開放源代碼的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS),目前屬于
Oracle旗下產(chǎn)品。MySQL軟件分為社區(qū)版和商業(yè)版,由于其體積小、速度快、成本低,尤其是開放源碼這一特點(diǎn),一般中小型網(wǎng)站的開發(fā)都選擇MySQL作為網(wǎng)站數(shù)據(jù)庫。5.1.1MySQL的下載與安裝5.1.2使用MySQL命令行工具5.1.3MySQLWorkbench5.1MySQL的下載與安裝5.1.1可以到Oracle官方網(wǎng)站下載最新的MySQL軟件,MySQL提供Windows下的安裝程序,本書使用的是MySQL社區(qū)版(CommunityServer),下載地址如下。/downloads/MySQL的最新版本是MySQL8.0,下載文件名為mysql-installer-community-.msi。雙擊該文件即開始安裝。安裝過程中需要選擇安裝類型(選擇DeveloperDefault即可)和安裝路徑頁面。安裝結(jié)束后需要配置MySQL,指定配置類型,這里選擇DevelopmentMachine,還需要打開TCP/IP網(wǎng)絡(luò)以及指定數(shù)據(jù)庫的端口號,默認(rèn)值為3306。單擊Next按鈕,在出現(xiàn)的頁面中需要指定root賬戶的密碼,這里輸入123456。在下一步指定Windows服務(wù)名,這里指定MySQL80。使用MySQL命令行工具5.1.2MySQL服務(wù)器自帶了一個字符界面命令行工具和一個MySQLWorkbench圖形界面管理工具。要使用命令行工具,選擇“開始”→“所有程序”→“MySQL8.0CommandLine”,打開命令行窗口,輸入root賬戶密碼,出現(xiàn)mysql>提示符,如圖5-1所示。使用MySQL命令行工具5.1.2在MySQL命令提示符下可以通過命令操作數(shù)據(jù)庫,使用showdatabases;命令可以顯示所有數(shù)據(jù)庫信息。mysql>showdatabases;MySQL命令行工具5.1.2還可以使用下面命令:使用createdatabase命令可以建立數(shù)據(jù)庫;使用createtable語句可完成對表的創(chuàng)建;使用altertable語句可以對創(chuàng)建后對的表進(jìn)行修改;使用describe命令可查看已創(chuàng)建的表的詳細(xì)信息;使用insert命令可以向表中插入數(shù)據(jù);使用delete命令可以刪除表中的數(shù)據(jù);使用update命令可以修改表中的數(shù)據(jù);使用select命令可以查詢表中的數(shù)據(jù)。MySQL命令行工具5.1.21.創(chuàng)建數(shù)據(jù)庫創(chuàng)建數(shù)據(jù)庫使用createdatabase命令,下面命令創(chuàng)建一個名為elearning的數(shù)據(jù)庫。默認(rèn)情況下,新建的數(shù)據(jù)庫屬于創(chuàng)建它的用戶,這里創(chuàng)建的數(shù)據(jù)庫屬于root用戶。也可以新建用戶并把數(shù)據(jù)庫上的操作權(quán)限授予新用戶。在對數(shù)據(jù)庫操作之前,必須使用use命令打開數(shù)據(jù)庫,下面命令打開elearning數(shù)據(jù)庫。mysql>createdatabaseelearning;mysql>useelearning;mysql>showtables;MySQL命令行工具5.1.22.使用DDL創(chuàng)建數(shù)據(jù)庫對象創(chuàng)建表使用CREATETABLE命令,使用下面SQL語句創(chuàng)建students學(xué)生表。CREATETABLEstudents(stud_idINTEGERNOTNULLPRIMARYKEYAUTO_INCREMENT,nameVARCHAR(20)NOTNULL,genderCHAR(2)NOTNULL,birthdayDATE,phoneVARCHAR(14));其中,字段stud_id表示學(xué)號、name表示姓名、gender表示性別、birthday表示出生日期、phone表示電話。MySQL命令行工具5.1.23.使用DML操縱表可以使用SQL的INSERT、DELETE和UPDATE語句插入、刪除和修改表中數(shù)據(jù),使用SELECT語句查詢表中數(shù)據(jù)。使用下面語句向students表中插入兩行數(shù)據(jù)。mysql>insertintostudents(stud_id,name,gender,birthday,phone)values(20220008,'張大海','男','1990-12-20';mysql>insertintostudents(name,gender,birthday,phone)values('李清泉','女','1983-10-01';MySQL命令行工具5.1.2使用下面語句可以查詢students表中所有信息。mysql>select*fromstudents;MySQLWorkbench5.1.3MySQLWorkbench是MySQL數(shù)據(jù)庫自帶的一個圖形界面的管理工具,使用該工具可以創(chuàng)建數(shù)據(jù)庫、創(chuàng)建表、對表數(shù)據(jù)、視圖、存儲過程和函數(shù)進(jìn)行管理。選擇“MySQL”程序組中的“SQLWorkbench8.0CE”打開Workbench界面,選擇Database菜單中的“ConnecttoDatabase”命令連接數(shù)據(jù)庫,之后在打開的界面中可以創(chuàng)建數(shù)據(jù)庫和表,界面如圖5-2所示。數(shù)據(jù)庫訪問步驟下面介紹使用JDBCAPI訪問數(shù)據(jù)庫的基本步驟。通常分為5個步驟:(1)加載驅(qū)動程序;(2)建立連接對象;(3)創(chuàng)建語句對象;(4)執(zhí)行語句并處理結(jié)果;(5)關(guān)閉有關(guān)對象。5.2.1加載驅(qū)動程序5.2.2建立連接對象5.2.3創(chuàng)建語句對象5.2.4執(zhí)行SQL語句并處理結(jié)果5.2.5關(guān)閉建立的對象5.2加載驅(qū)動程序5.2.1驅(qū)動程序是實(shí)現(xiàn)了Driver接口的類,一般由數(shù)據(jù)庫廠商提供。加載JDBC驅(qū)動程序最常用的方法是使用Class類的forName()靜態(tài)方法,該方法的聲明格式為:publicstaticClass<?>forName(StringclassName)throwsClassNotFoundException加載驅(qū)動程序5.2.1對不同的數(shù)據(jù)庫,驅(qū)動程序的類名不同。下面幾行代碼分別是加載MySQL數(shù)據(jù)庫、Oracle數(shù)據(jù)庫和PostgreSQL數(shù)據(jù)庫驅(qū)動程序。Class.forName("com.mysql.cj.jdbc.Driver");Class.forName("oracle.jdbc.driver.OracleDriver"); Class.forName("org.postgresql.Driver"); 建立連接對象5.2.2驅(qū)動程序加載成功后應(yīng)使用DriverManager類的getConnection()建立數(shù)據(jù)庫連接對象。下面代碼建立一個到MySQL數(shù)據(jù)庫的連接。Stringdburl="jdbc:mysql://:3306/elearning?useSSL=false&serverTimezone=UTC";Connectiondbconn=DriverManager.getConnection(dburl,"root","123456");上述代碼中為本機(jī)IP地址,也可以使用localhost,3306為MySQL數(shù)據(jù)庫服務(wù)器使用的端口號,數(shù)據(jù)庫名為elearning,用戶名為root,口令為123456。創(chuàng)建語句對象5.2.3在JDBCAPI中定義了三種語句類型,包括:Statement、PreparedStatement和CallableStatement。Statement用于執(zhí)行簡單的SQL語句,PreparedStatement用于執(zhí)行帶參數(shù)的SQL語句,CallableStatement主要用于執(zhí)行數(shù)據(jù)庫存儲過程。下面代碼創(chuàng)建一個預(yù)編譯的PreparedStatement對象。下面代碼創(chuàng)建一個用于插入記錄的語句對象。Stringsql="SELECT*FROMstudents";PreparedStatementpstmt=dbconn.prepareStatement(sql);Stringsql="INSERTINTOstudentsVALUES(?,?,?,?,?)";PreparedStatementpstmt=dbconn.prepareStatement(sql);執(zhí)行SQL語句并處理結(jié)果5.2.4對于查詢語句,調(diào)用executeQuery()返回ResultSet。ResultSet對象保存查詢的結(jié)果集,再調(diào)用ResultSet的方法可以對查詢結(jié)果的每行進(jìn)行處理。Stringsql="SELECT*FROMstudents";PreparedStatementpstmt=dbconn.prepareStatement(sql);ResultSetrst=stmt.executeQuery();while(rst.next()){out.print(rst.getString(1)+"\t");}對于DML語句如INSERT、UPDATE、DELETE和DDL語句如CREATE、ALTER、DROP等須使用語句對象的executeUpdate()方法。該方法返回值為整數(shù),用來指示被影響的行數(shù)。執(zhí)行SQL語句并處理結(jié)果5.2.4對于帶參數(shù)的語句對象,先設(shè)置參數(shù)值,然后才能執(zhí)行語句。對于前面的INSERT語句,可以使用下面的方法設(shè)置占位符的值。LocalDatelocalDate=LocalDate.of(2002,Month.NOVEMBER,20);java.sql.Dated=java.sql.Date.valueOf(localDate);
pstmt.setInt(1,20240001);pstmt.setString(2,"劉小明");pstmt.setString(3,"女");pstmt.setDate(4,d);pstmt.setString(5,"8899123");intn=pstmt.executeUpdate();關(guān)閉建立的對象5.2.5
在Connection接口、PreparedStatement接口和ResultSet接口中都定義了close()。當(dāng)這些對象使用完畢后應(yīng)使用close()關(guān)閉。
如果使用try-with-resources語句,則可以自動關(guān)閉這些對象。案例學(xué)習(xí):Servlet訪問數(shù)據(jù)庫5.3本案例根據(jù)用戶輸入的學(xué)號從數(shù)據(jù)庫中查詢該學(xué)生信息,或者查詢所有學(xué)生信息。本應(yīng)用的設(shè)計遵循了MVC設(shè)計模式,其中:視圖有find-student.jsp、show-student.jsp、show-all-student.jsp和error.jsp幾個頁面;Student類實(shí)現(xiàn)模型;FindStudentServlet類實(shí)現(xiàn)控制器。案例學(xué)習(xí):Servlet訪問數(shù)據(jù)庫5.3本書使用Maven管理項(xiàng)目,需要將下面的依賴項(xiàng)添加到pom.xml文件中。
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.29</version></dependency>本案例使用5.1.2節(jié)創(chuàng)建的students表,其中包含5個字段。根據(jù)表的定義,設(shè)計下面的Student類存放學(xué)生信息,該類實(shí)際是一個JavaBean,這里Student類的成員變量與表的字段對應(yīng)。。案例學(xué)習(xí):Servlet訪問數(shù)據(jù)庫5.3Student.java清單5.1packagecom.boda.domain;…@Data@NoArgsConstructor@AllArgsConstructorpublicclassStudentimplementsSerializable{privateIntegerstudId;privateStringname;privateStringgender;privateLocalDatebirthday;privateStringphone;}案例學(xué)習(xí):Servlet訪問數(shù)據(jù)庫5.3FindStudentServlet.java清單5.2packagecom.boda.domain;…@WebServlet(name="findStudentServlet",value="/find-student")publicclassFindStudentServletextendsHttpServlet{publicvoidinit(){Stringdriver="com.mysql.cj.jdbc.Driver";try{Class.forName(driver);//加載驅(qū)動程序}catch(ClassNotFoundExceptione){System.out.println(e);getServletContext().log("驅(qū)動程序類找不到!");}}
publicConnectiongetConnection()throwsSQLException{Stringusername="root";Stringpassword="123456";Stringdburl="jdbc:mysql://:3306/elearning"+"?useSSL=false&serverTimezone=UTC";Connectionconn=null
;try{ conn=DriverManager.getConnection(dburl,username,password);
}catch(SQLExceptione){ throwe;}catch(Exceptione){thrownewRuntimeException(e);}returnconn;}
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ArrayList<Student>studentList=newArrayList<Student>();Stringsql="SELECT*FROMstudents"; try(Connectionconn=getConnection();PreparedStatementpstmt=conn.prepareStatement(sql);ResultSetresult=pstmt.executeQuery();){while(result.next()){Studentstudent=newStudent();student.setStudId(result.getInt("stud_id"));student.setName(result.getString("name")); student.setGender(result.getString("gender"));student.setBirthday(result.getDate("birthday").toLocalDate()); student.setPhone(result.getString("phone")); studentList.add(student);}}catch(SQLExceptione){ e.printStackTrace();}if(!studentList.isEmpty()){request.getSession().setAttribute("studentList",studentList);response.sendRedirect("/chapter05/show-all-student.jsp");}else{response.sendRedirect("/chapter05/error.jsp");}}publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{Stringstudentid=request.getParameter("stud_id");Stringsql="SELECT*FROMstudentsWHEREstud_id=?";try(Connectionconn=getConnection();PreparedStatementpstmt=conn.prepareStatement(sql);){pstmt.setString(1,studentid);ResultSetrst=pstmt.executeQuery();if(rst.next()){Studentstudent=newStudent();student.setStudId(rst.getInt("stud_id"));student.setName(rst.getString("name"));student.setGender(rst.getString("gender"));student.setBirthday(rst.getDate("birthday").toLocalDate());student.setPhone(rst.getString("phone"));request.getSession().setAttribute("student",student);response.sendRedirect("/chapter05/show-student.jsp");}else{response.sendRedirect("/chapter05/error.jsp");} }catch(SQLExceptione){e.printStackTrace();}}案例學(xué)習(xí):Servlet訪問數(shù)據(jù)庫5.3find-student.jsp清單5.3<%@pagecontentType="text/html;charset=UTF-8"%><html><head><title>學(xué)生查詢</title></head><body><p><ahref="find-student">查詢所有學(xué)生</a></p><formaction="find-student"method="post">
請輸入學(xué)生學(xué)號:<inputtype="text"name="stud_id"size="15"><inputtype="submit"value="確定"></form></body></html>案例學(xué)習(xí):Servlet訪問數(shù)據(jù)庫5.3show-student.jsp清單5.4<%@pagecontentType="text/html;charset=utf-8"%><html><head><title>學(xué)生信息</title></head><body> <tableborder="0"> <tr><td>學(xué)號:</td><td>${student.studId}</td></tr> <tr><td>姓名:</td><td>${}</td></tr> <tr><td>性別:</td><td>${student.gender}</td></tr> <tr><td>出生日期:</td><td>${student.birthday}</td></tr> <tr><td>電話:</td><td>${student.phone}</td></tr> </table></body></html>案例學(xué)習(xí):Servlet訪問數(shù)據(jù)庫5.3show-all-student.jsp清單5.5<tableborder="1"><tr><td>學(xué)號</td><td>姓名</td><td>性別</td><td>出生日期</td><td>電話</td><td>是否刪除</td></tr><c:forEachvar="student"items="${studentList}"><tr><td>${student.studId}</td><td>${}</td><td>${student.gender}</td><td>${student.birthday}</td><td>${student.phone}</td><td><ahref="delete-student?id=${student.studId}">刪除</a></td></tr></c:forEach></table>案例學(xué)習(xí):Servlet訪問數(shù)據(jù)庫5.3error.jsp清單5.5當(dāng)查詢的學(xué)生不存在時,顯示清單5.6的error.jsp頁面。<%@pagecontentType="text/html;charset=UTF-8"%><html><body>
該學(xué)生不存在。<ahref="/chapter05/find-student.jsp">返回</a></body></html>使用數(shù)據(jù)源為了提高數(shù)據(jù)庫訪問效率,從JDBC2.0開始提供了一種更好的方法建立數(shù)據(jù)庫連接對象,即使用連接池和數(shù)據(jù)源的技術(shù)訪問數(shù)據(jù)庫。5.4.1數(shù)據(jù)源概述5.4.2配置JNDI數(shù)據(jù)源5.4.3使用JNDI數(shù)據(jù)源5.4數(shù)據(jù)源概述5.4.1數(shù)據(jù)源(datasource)的概念是在JDBC2.0中引入的,是目前Web應(yīng)用開發(fā)中獲取數(shù)據(jù)庫連接的首選方法。這種方法是事先建立若干連接對象,將它們存放在數(shù)據(jù)庫連接池(connectionpooling)中供數(shù)據(jù)訪問組件共享。使用這種技術(shù),應(yīng)用程序在啟動時只需創(chuàng)建少量的連接對象即可。數(shù)據(jù)源通過javax.sql.DataSource接口對象實(shí)現(xiàn),通過它可以獲得數(shù)據(jù)庫連接,因此它是對DriverManager工具的一個替代。通常DataSource對象是從連接池中獲得連接對象。連接池預(yù)定義了一些連接,當(dāng)應(yīng)用程序需要連接對象時就從連接池中取出一個,當(dāng)連接對象使用完畢將其放回連接池,從而可以避免在每次請求連接時都要創(chuàng)建連接對象。數(shù)據(jù)源概述5.4.1配置JNDI數(shù)據(jù)源5.4.2可以采用Java命名與目錄接口(JavaNamingandDirectoryInterface,JNDI)技術(shù)來獲得DataSource對象的引用。JNDI是一種將對象和名字綁定的技術(shù),對象由對象工廠創(chuàng)建,并將其綁定到唯一的名字,外部程序可以通過名字來獲得某個對象的訪問。在javax.naming包中提供了Context接口,該接口提供了將名字和對象綁定,通過名字檢索對象的方法??梢酝ㄟ^該接口的一個實(shí)現(xiàn)類InitialContext獲得上下文對象。在Tomcat中可以配置兩種數(shù)據(jù)源:局部數(shù)據(jù)源和全局?jǐn)?shù)據(jù)源。局部數(shù)據(jù)源只能被定義數(shù)據(jù)源的應(yīng)用程序使用,全局?jǐn)?shù)據(jù)源可被所有的應(yīng)用程序使用(本書不討論全局?jǐn)?shù)據(jù)源)。建立局部數(shù)據(jù)源非常簡單,首先在Web應(yīng)用程序的META-INF目錄中建立一個context.xml文件,下面代碼配置了連接MySQL數(shù)據(jù)庫的數(shù)據(jù)源,內(nèi)容如下。配置JNDI數(shù)據(jù)源5.4.2context.xml清單5.7
<?xmlversion="1.0"encoding="UTF-8"?>
<Contextreloadable="true"><Resourcename="jdbc/elearningDS"type="javax.sql.DataSource"maxTotal="4"maxIdle="2"
driverClassName="com.mysql.cj.jdbc.Driver"url="jdbc:mysql://:3306/elearning?useSSL=false&serverTimezone=UTC"username="root"password="123456"maxWaitMillis="5000"/></Context>使用JNDI數(shù)據(jù)源5.4.3配置了數(shù)據(jù)源后,就可以使用javax.naming.Context接口的lookup()查找JNDI數(shù)據(jù)源,如下面代碼可以獲得jdbc/elearningDS數(shù)據(jù)源的引用。Contextcontext=newInitialContext();DataSourcedataSource=(DataSource)context.lookup("java:comp/env/jdbc/elearningDS");查找數(shù)據(jù)源對象的lookup()的參數(shù)是數(shù)據(jù)源名字符串,但要加上“java:comp/env”前綴,它是JNDI命名空間的一部分。得到了DataSource對象的引用后,就可以通過它的getConnection()獲得數(shù)據(jù)庫連接對象。使用JNDI數(shù)據(jù)源5.4.3FindStudentServlet.java(修改)清單5.2publicclassFindStudentServletextendsHttpServlet{DataSourcedataSource;publicvoidinit(){ try{ Contextcontext=newInitialContext(); dataSource=(DataSource)context.lookup("java:comp/env/jdbc/elearningDS"); }catch(NamingExceptionne){ System.out.println("Exception:"+ne); }}//doGet()和doPost()方法中的Connection對象通過DataSource的getConnetion()方法獲得}使用JNDI數(shù)據(jù)源5.4.3代碼首先通過InitialContext類創(chuàng)建一個上下文對象context,然后通過它的lookup()查找JNDI數(shù)據(jù)源對象,最后通過數(shù)據(jù)源對象從連接池中返回一個數(shù)據(jù)庫連接對象。當(dāng)程序結(jié)束數(shù)據(jù)庫訪問后,應(yīng)該調(diào)用Connection的close()將連接對象返回到數(shù)據(jù)庫連接池。這樣,就避免了每次使用數(shù)據(jù)庫連接對象都要重新創(chuàng)建,從而可以提高應(yīng)用程序的效率。。
多學(xué)一招:在JavaWeb應(yīng)用中也可以使用第三方數(shù)據(jù)源API,比如,C3P0是一個開源的JDBC連接池,它實(shí)現(xiàn)了數(shù)據(jù)源和JNDI綁定,支持JDBC4規(guī)范的標(biāo)準(zhǔn)擴(kuò)展??傻骄W(wǎng)上下載最新版本C3P0,將有關(guān)庫復(fù)制到WEB-INF\lib目錄中即可。在Maven項(xiàng)目中也可以通過依賴項(xiàng)下載,請參閱本章習(xí)題14。DAO設(shè)計模式5.5DAO(DataAccessObject)稱為數(shù)據(jù)訪問對象。DAO設(shè)計模式可以在使用數(shù)據(jù)庫的應(yīng)用程序中實(shí)現(xiàn)業(yè)務(wù)邏輯和數(shù)據(jù)訪問邏輯分離,從而使應(yīng)用的維護(hù)變得簡單。它通過將數(shù)據(jù)訪問實(shí)現(xiàn)(通常使用JDBC技術(shù))封裝在DAO類中,提高應(yīng)用程序的靈活性。首先定義一個DAO接口,它負(fù)責(zé)建立數(shù)據(jù)庫連接。然后為每種實(shí)體的持久化操作定義一個接口,如ProductDao接口負(fù)責(zé)Product對象的持久化,CustomerDao接口負(fù)責(zé)Customer對象的持久化,最后定義這些接口的實(shí)現(xiàn)類。圖5-9給出Dao接口、ProductDao接口和CustomerDao接口的關(guān)系。DAO設(shè)計模式5.5在DAO模式中,通常要為需要持久存儲的每種實(shí)體類型編寫一個相應(yīng)的類。如要存儲Product信息就需要編寫一個類。實(shí)現(xiàn)類應(yīng)該提供以下功能:添加、刪除、修改、檢索、查找等功能。DAO設(shè)計模式5.5假設(shè)存儲商品信息的數(shù)據(jù)庫表使用下面SQL腳本定義,它包含4個字段,與Product類的4個成員對應(yīng)。清單5.8create_products.sqlCREATETABLEproducts(idINTEGERNOTNULLPRIMARYKEY,--商品號pnameVARCHAR(20)NOTNULL,--商品名brandVARCHAR(20)NOTNULL,--品牌priceFLOAT--價格);設(shè)計實(shí)體類5.5.1
實(shí)體類是用來存儲要與數(shù)據(jù)庫交互的數(shù)據(jù)。實(shí)體類通常不包含任何業(yè)務(wù)邏輯,業(yè)務(wù)邏輯由業(yè)務(wù)對象實(shí)現(xiàn),因此實(shí)體類有時也叫普通的Java對象(PlainOldJavaObject,POJO)。實(shí)體類必須是可序列化的,也就是它必須實(shí)現(xiàn)java.io.Serializable接口。下面的Product類就是實(shí)體類。設(shè)計實(shí)體類5.5.1Product.java清單5.9packagecom.boda.domain;…@Data@NoArgsConstructor@AllArgsConstructorpublicclassProductimplementsSerializable{privateIntegerid;privateStringname;privateStringbrand;privatedoubleprice;}設(shè)計DAO接口5.5.2本示例的數(shù)據(jù)訪問對象組件包含下面的接口和類:Dao接口是所有接口的根接口,其中定義了默認(rèn)方法建立到數(shù)據(jù)庫的連接。ProductDao接口和ProductDaoImpl實(shí)現(xiàn)類提供了對Product對象的各種操作方法。Dao接口如清單5.10所示,ProductDao接口如清單5.11所示,ProductDaoImpl類如清單5.12所示。DAO.java
清單5.10packagecom.boda.dao;…publicinterfaceDao{privateDataSourcegetDataSource(){ DataSourcedataSource=null; try{ Contextcontext=newInitialContext(); dataSource=(DataSource)context.lookup("java:comp/env/jdbc/elearningDS"); }catch(NamingExceptionne){ System.out.println("異常:"+ne); } returndataSource; }publicdefaultConnectiongetConnection()throwsSQLException{ DataSourcedataSource=getDataSource(); Connectionconn=null; try{ conn=dataSource.getConnection(); }catch(SQLExceptionsqle){ System.out.println("異常:"+sqle); } returnconn;} }getDataSource()方法用于查找并返回數(shù)據(jù)源對象,getConnection()方法是接口的默認(rèn)方法,它通過一個數(shù)據(jù)源對象創(chuàng)建并返回數(shù)據(jù)庫連接對象,該方法將被子接口或?qū)崿F(xiàn)類繼承。ProductDao.java清單5.11packagecom.boda.dao;importjava.util.List;importjava.sql.SQLException;importcom.boda.domain.Product;publicinterfaceProductDaoextendsDao{ //按id查詢商品方法
publicProductfindProductById(intid)throwsSQLException;//查詢所有商品方法
publicList<Product>findAllProduct()throwsSQLException;//添加商品方法
publicintaddProduct(Productproduct)throwsSQLException;}ProductDaoImpl.java清單5.12publicclassProductDaoImplimplementsProductDao{//按id查詢商品記錄publicProductfindProductById(intid)throwsSQLException{ Stringsql="SELECTid,pname,brand,price"+ "FROMproductsWHEREid=?";Productproduct=null;try( Connectionconn=getConnection(); PreparedStatementpstmt=conn.prepareStatement(sql)){ pstmt.setInt(1,id); try(ResultSetrst=pstmt.executeQuery()){ if(rst.next()){product=
newProduct(rst.getInt("id"),rst.getString("pname"),rst.getString("brand"),rst.getDouble("price")); } }}catch(SQLExceptionse){ returnnull; } returnproduct;}//查詢所有商品信息publicList<Product>findAllProduct()throwsSQLException{ Productproduct=null; ArrayList<Product>productList=newArrayList<Product>(); Stringsql="SELECT*FROMproducts"; try( Connectionconn=getConnection(); PreparedStatementpstmt=conn.prepareStatement(sql); ResultSetrst=pstmt.executeQuery()){ while(rst.next()){ product=newProduct(rst.getInt("id"),rst.getString("name"),rst.getString("brand"),rst.getDouble("price")); productList.add(product); } returnproductList; }catch(SQLExceptione){ e.printStackTrace();
returnnull; }}//插入一條商品記錄publicintaddProduct(Productproduct)throwsSQLException{ Stringsql="INSERTINTOproductsVALUES(?,?,?,?)"; intn=0;try( Connectionconn=getConnection();
PreparedStatementpstmt=conn.prepareStatement(sql)){ pstmt.setInt(1,product.getId()); pstmt.setString(2,product.getName()); pstmt.setString(3,product.getBrand()); pstmt.setDouble(4,product.getPrice());
n=pstmt.executeUpdate(); }catch(SQLExceptionse){
se.printStackTrace(); }returnn;}使用DAO對象5.5.3add-product.jsp清單5.13<body><fontcolor=red>${result}</font><p>請輸入一條商品記錄</p><formaction="add-product"method="post"><table><tr><td>商品號:</td><td><inputtype="text"name="id"></td></tr><tr><td>商品名:</td><td
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年化纖短褲項(xiàng)目可行性研究報告
- 2025年建筑工程意外傷害風(fēng)險管控及保險服務(wù)合同
- 2025年中國白芍提取物行業(yè)市場發(fā)展前景及發(fā)展趨勢與投資戰(zhàn)略研究報告
- 中國金合項(xiàng)目投資可行性研究報告
- 2025年度戶外廣告設(shè)施安裝維護(hù)合同
- 2025年度互換房屋裝修進(jìn)度及款項(xiàng)支付協(xié)議
- 中國禮品薄頁紙項(xiàng)目投資可行性研究報告
- 2025年建筑覆膜紙項(xiàng)目可行性研究報告
- 打造復(fù)合型人才的培養(yǎng)方案
- 2025年哺乳茶項(xiàng)目投資可行性研究分析報告
- 【基層版】中國房顫中心認(rèn)證標(biāo)準(zhǔn)
- 農(nóng)產(chǎn)品質(zhì)量安全及其檢測技術(shù)課件
- 外科學(xué)緒論課件
- 安全生產(chǎn)目標(biāo)責(zé)任制考核表
- 2023年廣東省中考試卷(語數(shù)英物化史生等共11套)帶答案解析
- DFX工藝設(shè)計方法介紹
- 違反八項(xiàng)規(guī)定問題典型案例、法規(guī)依據(jù)和關(guān)注點(diǎn)
- SCI期刊的名稱縮寫與全稱對照表
- 人機(jī)料法環(huán)測檢查表
- 一年級上冊綜合實(shí)踐活動導(dǎo)學(xué)案 各種各樣的汽車 全國通用
- 婦產(chǎn)科護(hù)理學(xué)會陰部手術(shù)病人的護(hù)理
評論
0/150
提交評論