对一个简单的 JDBC 包装器的扩展及应用

宗锋 (zong_feng@263.net)
西北大学计算机系硕士
2001 年 12 月

本文将对《一个简单的 JDBC 包装器》中的JDBC包装器进行一些扩展,然后介绍一下其在jsp+javabean开发模式中的应用。

最近看了《一个简单的 JDBC 包装器》,觉得这篇文章很有应用价值,我便在自己的开发中使用了它,不过这个包装器也存在一些不足,于是我对它进行了一些扩展。首先原文中的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 );
}

这两个函数分别用于删除一个Row和满足一定条件的记录。对于具有主关键字的表,我们可以用下面代码中的方法二来进行删除,如果没有主关键字,我们可以用方法一删除。

示例如下:


//方法一
Row e = table.getRow( "id=2001" );
table.delRow(e);
//方法二
table.delRow("id=2001");

另外这个包装器没有对查询结果为NULL的情况作处理,我通过修改Table类的execute函数和RowSet类的get函数对这种情况作了处理。具体代码见附件。

下面谈谈利用这个JDBC包装器实现对数据库的封装,假定我们有一个表:student,创建表的Sql语句如下:


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
)

我们对这个表进行封装,下面是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作为主关键字,所以我们使用字符串为参数的delRow()函数
 */
public void delete()throws SQLException{
//getTable().delRow(this.r);
String conditions="";
conditions = "id=" + "'"+getId()+"'";
getTable().delRow(conditions);
}
}

下面这个类是相应的一个查询类的主要代码:


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来实现很多功能,这样可以减少在jsp中的java代码量,方便我们对界面的改进。我们要实现的功能为对学生的编辑,添加,删除和列表。这些功能定义在两个javabean中:下面是两个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">学生列表</td>
</tr>
<tr>
<td>学号</td>
<td>姓名</td>
<td>班级</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> </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>编辑学生信息</b><淘宝热门商品:
 

¥:59.00 

冉冉天使屋-外贸童装批发代理

冬季宝宝必备 加厚小老虎造型棉哈衣/可当包被 土黄色(0-1岁)

 

58.00 元  

淘宝生活 运动鞋专卖/正品ZIPPO热卖//淘宝职业信誉卖家

冲双钻 ADIDAS三叶草08夏季新款特价 漫画小子个性 休闲板鞋


来源:程序员网

小小豆叮

0 Responses to "对一个简单的 JDBC 包装器的扩展及应用"

发表评论