Java Tools

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            83 隨筆 :: 0 文章 :: 16 評(píng)論 :: 0 Trackbacks

          對(duì)一個(gè)簡(jiǎn)單的 JDBC 包裝器的擴(kuò)展及應(yīng)用

          developerWorks
          文檔選項(xiàng)
          將此頁(yè)作為電子郵件發(fā)送

          將此頁(yè)作為電子郵件發(fā)送

          未顯示需要 JavaScript 的文檔選項(xiàng)



          級(jí)別: 初級(jí)

          宗鋒 (zong_feng@263.net)西北大學(xué)計(jì)算機(jī)系碩士

          2001 年 12 月 16 日

          本文將對(duì) 《一個(gè)簡(jiǎn)單的 JDBC 包裝器》中的JDBC包裝器進(jìn)行一些擴(kuò)展,然后介紹一下其在jsp+javabean開(kāi)發(fā)模式中的應(yīng)用。

          最近看了 《一個(gè)簡(jiǎn)單的 JDBC 包裝器》,覺(jué)得這篇文章很有應(yīng)用價(jià)值,我便在自己的開(kāi)發(fā)中使用了它,不過(guò)這個(gè)包裝器也存在一些不足,于是我對(duì)它進(jìn)行了一些擴(kuò)展。首先原文中的Table類缺少刪除功能,我便增加了刪除功能。代碼如下:
          public void delRow(Row row) throws SQLException {
                                  String ss="";
                                  ss = "delete from "+name+" where ";
                                  for (int i=0; i<row.length(); ++i) {
                                  String k = row.getKey( i );
                                  String v = row.get( i );
                                  ss += k+"='"+v+"'";
                                  if (i != row.length()-1)
                                  ss += " and ";
                                  }
                                  Connection con = database.getConnection();
                                  Statement st = con.createStatement();
                                  st.executeUpdate( ss );
                                  }
                                  public void delRow(String conditions)throws SQLException {
                                  String ss="";
                                  ss = "delete from "+name+" where ";
                                  ss +=conditions;
                                  Connection con = database.getConnection();
                                  Statement st = con.createStatement();
                                  st.executeUpdate( ss );
                                  }

          這兩個(gè)函數(shù)分別用于刪除一個(gè)Row和滿足一定條件的記錄。對(duì)于具有主關(guān)鍵字的表,我們可以用下面代碼中的方法二來(lái)進(jìn)行刪除,如果沒(méi)有主關(guān)鍵字,我們可以用方法一刪除。

          示例如下:
          //方法一
                                  Row e = table.getRow( "id=2001" );
                                  table.delRow(e);
                                  //方法二
                                  table.delRow("id=2001");
                                  

          另外這個(gè)包裝器沒(méi)有對(duì)查詢結(jié)果為NULL的情況作處理,我通過(guò)修改Table類的execute函數(shù)和RowSet類的get函數(shù)對(duì)這種情況作了處理。具體代碼見(jiàn)附件。

          下面談?wù)劺眠@個(gè)JDBC包裝器實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的封裝,假定我們有一個(gè)表:student,創(chuàng)建表的Sql語(yǔ)句如下:
          create table student(
                                  id varchar(10) not null primary key,
                                  name varchar(16) not null,
                                  sex char(2) not null,
                                  password varchar(16) not null,
                                  department varchar(32) not null
                                  )

          我們對(duì)這個(gè)表進(jìn)行封裝,下面是Student類的主要代碼:
          public class Student{
                                  private Row r;
                                  public Student() {
                                  r=new Row();
                                  }
                                  public Student(Row row) {
                                  this.r=row;
                                  }
                                  private Table getTable() {
                                  Database db =
                                  new Database( "jdbc:mysql://localhost:3306/manger",
                                  "zf", "zf" );
                                  return db.getTable("student");
                                  }
                                  public void setName(String name){
                                  r.put("name",name);
                                  }
                                  public void setPassword(String pass){
                                  r.put("password",pass);
                                  }
                                  public void setId(String number){
                                  r.put("id",number);
                                  }
                                  public void setDepart(String depart){
                                  r.put("department",depart);
                                  }
                                  public void setSex(String sex){
                                  r.put("sex",sex);
                                  }
                                  public String getName(){
                                  return r.get("name");
                                  }
                                  public String getPassword(){
                                  return r.get("password");
                                  }
                                  public String getId(){
                                  return r.get("id");
                                  }
                                  public String getDepart(){
                                  return r.get("department");
                                  }
                                  public String getSex(){
                                  return r.get("sex");
                                  }
                                  /**
                                  *condition表示限制條件,如果為空,則插入新記錄,否則更新記錄
                                  */
                                  public void save(String conditions) throws SQLException{
                                  if(conditions==null)
                                  {getTable().putRow(r);}
                                  else
                                  getTable().putRow(r,conditions);
                                  }
                                  /**
                                  *由于id作為主關(guān)鍵字,所以我們使用字符串為參數(shù)的delRow()函數(shù)
                                  */
                                  public void delete()throws SQLException{
                                  //getTable().delRow(this.r);
                                  String conditions="";
                                  conditions = "id=" + "'"+getId()+"'";
                                  getTable().delRow(conditions);
                                  }
                                  }

          下面這個(gè)類是相應(yīng)的一個(gè)查詢類的主要代碼:
          public class StudentFactory{
                                  public static Student findStudentById(String id)
                                  throws SQLException{
                                  Row r=getTable().getRow("id="+id);
                                  if(r==null)
                                  return null;
                                  else
                                  return new Student(r);
                                  }
                                  public static Student[] findAllStudents()
                                  throws SQLException{
                                  RowSet rs=getTable().getRows("1>0");
                                  if (rs==null)
                                  return null;
                                  else
                                  Student[] stu=null;
                                  stu=new Student[rs.length()];
                                  for(int i=0;i<rs.length(); i++){
                                  stu[i]=new Student(rs.get(i));
                                  }
                                  return stu;
                                  }
                                  }

          我使用javabean來(lái)實(shí)現(xiàn)很多功能,這樣可以減少在jsp中的java代碼量,方便我們對(duì)界面的改進(jìn)。我們要實(shí)現(xiàn)的功能為對(duì)學(xué)生的編輯,添加,刪除和列表。這些功能定義在兩個(gè)javabean中:下面是兩個(gè)jsp文件的主要代碼:
          <%-- student.jsp --%>
                                  <%@ page contentType="text/html;charset=GB2312" %>
                                  <%@ page import="org.gjt.mm.mysql.*,manger.bean.*,manger.tools.*,manger.business.*" %>
                                  <html>
                                  <head>
                                  <SCRIPT TYPE="text/javascript" LANGUAGE="JavaScript" >
                                  <!--
                                  function doDelete()
                                  {
                                  if(confirm('你確定刪除嗎?')) {
                                  document.EditForm.event.value='delete';
                                  document.EditForm.submit();
                                  }
                                  }
                                  function doEdit()
                                  {
                                  if(confirm('你確定編輯嗎?')) {
                                  document.EditForm.event.value='showEdit';
                                  document.EditForm.submit();
                                  }
                                  }
                                  function showAddPage()
                                  {
                                  document.location='editstudent.jsp?event=showAdd';
                                  }
                                  </SCRIPT>
                                  </head>
                                  <body bgcolor="#FFFFFF" text="#000000">
                                  <%
                                  try {
                                  Class.forName("org.gjt.mm.mysql.Driver").newInstance();
                                  }
                                  catch (Exception E) {
                                  out.println("Unable to load driver.");
                                  } %>
                                  <jsp:useBean id="table" scope="page" class="manger.bean.ListStudentBean" />
                                  <%
                                  Student[] student=table.getStudent(pageContext);
                                  int total=0;
                                  int currPage=table.getCurPage();
                                  int pageCount=table.getPageCount();
                                  if(student!=null)
                                  {total=student.length;}%>
                                  <FORM NAME="EditForm" ACTION="editstudent.jsp">
                                  <INPUT TYPE="HIDDEN" NAME="event" VALUE="">
                                  <table width="75%" border="1">
                                  <tr>
                                  <td colspan="5">學(xué)生列表</td>
                                  </tr>
                                  <tr>
                                  <td>學(xué)號(hào)</td>
                                  <td>姓名</td>
                                  <td>班級(jí)</td>
                                  <td>備注一</td>
                                  <td>選擇</td>
                                  </tr>
                                  <%for (int i=0;i<total;i++){
                                  Student current=student[i];%>
                                  <tr>
                                  <td><%=current.getId()%></td>
                                  <td><%=current.getName()%></td>
                                  <td><%=current.getDepart()%></td>
                                  <td><%=current.getSex() %></td>
                                  <td>
                                  <input type="checkbox" name="id" value=<%=current.getId()%>>
                                  </td>
                                  <% } %>
                                  </tr><tr>
                                  <td colspan="5">
                                  <INPUT TYPE="BUTTON" onclick="doEdit();" VALUE="編輯">
                                  <INPUT TYPE="BUTTON" onclick="showAddPage()" VALUE="增加">
                                  <INPUT TYPE="BUTTON" onclick="doDelete();" VALUE="刪除">
                                  </td>
                                  </tr>
                                  </table>
                                  </form>
                                  </html>

          <%-- studentedit.jsp --%>
                                  <jsp:useBean id="table" scope="page" class="manger.bean.EditStudentBean" />
                                  <%table.processRequest(pageContext);%>
                                  <p>_lt;/p>
                                  <form name="EditForm" action="editstudent.jsp">
                                  <INPUT TYPE="hidden" NAME="event" VALUE="<%=table.getEvent()%>" >
                                  <table width="75%" border="1">
                                  <tr>
                                  <td colspan="2">
                                  <div align="center"><b>編輯學(xué)生信息</b></div>
                                  </td>
                                  </tr>
                                  <tr>
                                  <td width="40%">學(xué)號(hào):</td>
                                  <td width="60%">
                                  <input type="text" name="id" value="<%=table.getStudent().getId()%>">
                                  </td>
                                  </tr>
                                  <%--下面的一些學(xué)生信息我們省略了--%>
                                  <tr>
                                  <td colspan="2">
                                  <input type="submit" name="Submit" value="確定">
                                  </td>
                                  </tr>
                                  </table>
                                  </form>
                                  

          我的想法是在student.jsp中顯示學(xué)生列表,從這個(gè)頁(yè)面可以轉(zhuǎn)到增加和編輯頁(yè)面,也可以在這個(gè)頁(yè)面中刪除學(xué)生,這三個(gè)功能都是由editstudent.jsp完成的。在editstudent.jsp中非常關(guān)鍵的一行代碼就是<%table.processRequest(pageContext);%>,這會(huì)調(diào)用EditStudentBean類的processRequest方法:下面是EditStudentBean類processRequest方法和addStudent方法的代碼:
          public void processRequest (PageContext pageContext)
                                  throws SQLException,ServletException,IOException{
                                  this.student.setId("");
                                  this.student.setName("");
                                  this.student.setPassword("");
                                  this.student.setDepart("");
                                  this.student.setSex("");
                                  HttpServletRequest request=(HttpServletRequest)pageContext.getRequest();
                                  String event=request.getParameter("event");
                                  //this.event=event;
                                  if(event==null || event.equals("")||event.equals("showAdd"))
                                  {this.event="add";
                                  }
                                  else if(event.equals("showEdit"))
                                  {this.event="edit";
                                  String id=request.getParameter("id");
                                  Student stu=StudentFactory.findStudentById(id);
                                  this.student=stu;
                                  }
                                  else if(event.equals("add"))
                                  {this.addStudent(pageContext);
                                  }
                                  else if(event.equals("delete"))
                                  {this.deleteStudent(pageContext);
                                  }
                                  else if(event.equals("edit"))
                                  {this.editStudent(pageContext);
                                  }
                                  }
                                  public void addStudent(PageContext page)
                                  throws SQLException,ServletException,IOException{
                                  HttpServletRequest request=(HttpServletRequest)page.getRequest();
                                  HttpServletResponse response=(HttpServletResponse)page.getResponse();
                                  JspWriter out=page.getOut();
                                  String id=request.getParameter("id");
                                  String name=request.getParameter("name");
                                  String sex=request.getParameter("sex");
                                  String pass=request.getParameter("password");
                                  String depart=request.getParameter("depart");
                                  if (id!=null&&name!=null&&sex!=null&&pass!=null&&depart!=null
                                  &&!id.equals("")&&!name.equals("")&&!sex.equals("")&&!pass.equals("")&&!depart.equals(""))
                                  {Student s=new Student();
                                  s.setId(id);
                                  s.setName(name);
                                  s.setSex(sex);
                                  s.setPassword(pass);
                                  s.setDepart(depart);
                                  s.save(null);
                                  response.sendRedirect("student.jsp");
                                  }
                                  else
                                  {out.print("請(qǐng)?zhí)硗晁行畔?);
                                  }
                                  }

          processRequest方法的功能主要為獲取提交給editstudent.jsp的event的值,根據(jù)不同的event調(diào)用不同的函數(shù)。例如event=add,則調(diào)用addStudent函數(shù)。

          注意:在設(shè)置Student對(duì)象的各個(gè)屬性值時(shí),一定要按照表(見(jiàn)上面的SQL語(yǔ)句)中順序來(lái)設(shè)置,例如在表中,id字段在name字段的前面,所以setId方法在setName方法前面,這主要是由于Table類中的putRow函數(shù)中執(zhí)行插入操作的SQL語(yǔ)句有缺陷。在那個(gè)SQL語(yǔ)句中,它是按各屬性在Row中的順序來(lái)執(zhí)行插入操作的。如過(guò)你不愿意按表中字段的順序來(lái)設(shè)置Student的屬性,可以對(duì)putRow函數(shù)更改如下:
          String ss = "";
                                  if (conditions==null) {
                                  ss = "INSERT INTO "+name+'(";
                                  for (int i=0;i<row.length();++i) {
                                  String k = row.getKey( i );
                                  ss += k;
                                  if (i != row.length()-1)
                                  ss += ", ";
                                  }
                                  ss +=") VALUES (";
                                  for (int j=0; j<row.length(); ++j) {
                                  String v = row.get( j );
                                  ss += "'"+v+"'";
                                  if (j != row.length()-1)
                                  ss += ", ";
                                  }
                                  ss += ")";
                                  }

          限于篇幅,我省略了student.jsp文件中的一些內(nèi)容,對(duì)這個(gè)jsp文件進(jìn)行處理的bean為L(zhǎng)istStudentBean,這個(gè)類主要實(shí)現(xiàn)一個(gè)函數(shù)getStudent,這個(gè)函數(shù)主要通過(guò)StudentFactory查尋到所有的學(xué)生,由于我在此函數(shù)中進(jìn)行了分頁(yè)處理,因此此函數(shù)只返回當(dāng)前頁(yè)需要的Student數(shù)組。具體的代碼參看 附件

          總之,我改進(jìn)之后的這個(gè)JDBC封裝器還是比較有效的,它能滿足一般地需要,當(dāng)然你也可以根據(jù)你的情況對(duì)其進(jìn)行擴(kuò)充,以更好地適應(yīng)你的開(kāi)發(fā)。

          代碼在Tomcat4.01+mysql3.23.43下測(cè)試通過(guò)。



          關(guān)于作者

           

          宗鋒,男,西北大學(xué)計(jì)算機(jī)系碩士。興趣主要集中在:java,linux,enhydra,barracuda。希望能與有共同愛(ài)好的朋友進(jìn)行交流。E-mail: zong_feng@263.net.

          posted on 2007-07-03 17:22 和田雨 閱讀(225) 評(píng)論(0)  編輯  收藏 所屬分類: JDBC案例
          主站蜘蛛池模板: 犍为县| 肇庆市| 延边| 五家渠市| 临漳县| 卢氏县| 潼南县| 宝清县| 莲花县| 成武县| 龙南县| 建始县| 恩施市| 南部县| 汉源县| 邹平县| 青岛市| 阿鲁科尔沁旗| 建德市| 佛学| 三都| 营山县| 祁门县| 福海县| 伊宁县| 万州区| 徐汇区| 万盛区| 东宁县| 青铜峡市| 孝昌县| 定州市| 都昌县| 合川市| 井陉县| 巴东县| 台南县| 松溪县| 宜章县| 枣阳市| 台山市|