useBeanclass="anni.ContactDao"id="contactDao"scope="application"/>
<%
Stringid=request.getParameter("id");
contactDao.remove(Long.parseLong(id));
response.sendRedirect("list.jsp");
%>
因为只需要id和contactDao,remove.jsp的代码十分单纯,首先从request中获得id,然后删除id对应的记录,最后页面重定向到list.jsp。
删除便成功了。
5.6. 用jdbc操作数据库
虽然有人说JDBC是JavaDatabaseBridgeConnection(java数据库桥接)的缩写,但sun公司一直没有承认这种解释。
不过jdbc确实是一种桥接方式,所有服务器厂商都为jdbc提供对应自己数据库的驱动,我们只要学会使用jdbc中的类和方法,就可以通过它操作任何一款数据库了。
这次我们使用的是一个名叫hsqldb的嵌入型数据库,它是使用java编写的,把hsqldb-1.8.0.7.jar放到WEB-INF/lib/目录下就可以使用了。
现在看我们是如何连接数据库的,hsqldb-1.8.0.7.jar中已经为我们提供了jdbc驱动,为了方便调用我们将jdbc的配置封装在anni.DbUtils中。
1.Class.forName("org.hsqldb.jdbcDriver");加载jdbc驱动。
Class.forName()是惯用写法,可以强制加载指定的类,org.hsqldb.jdbcDriver是hsqldb驱动的名称,只需要记忆即可。
2.与数据库建立连接。
3.DriverManager.getConnection("jdbc:
hsqldb:
res:
/hsqldb/contact","sa","");
三个参数分别是连接数据库使用的url,登录用户名和密码。
url以jdbc:
hsqldb:
开头,表明它将使用hsqldb的驱动,后面的res:
/hsqldb/contact是hsqldb的一种连接方式,它将去classpath下的hsqldb目录中读取名为contact的数据库文件作为初始配置,在这里classpath就是指的WEB-INF/classes/,你可以在WEB-INF/classes/hsqldb/下看到两个数据库文件,contact.properties和contact.script。
4.数据库连接十分消耗系统资源,一定要记得在使用完成后关闭,一旦忘记关闭,资源很快就会耗尽,你会得到一连串无法连接数据库的错误。
anni.DbUtils中我们提供了一个close()方法来关闭连接。
完整的anni.DbUtils代码在WEB-INF/src/DbUtils.java。
数据库contact的表结构写在WEB-INF/sql/import.sql中。
createtablecontact(
idbigint,
usernamevarchar(100),
sexvarchar(100),
emailvarchar(100),
qqvarchar(100),
descnvarchar(200)
);
与之对应的anni.Contact的结构大致如下。
packageanni;
publicclassContact{
privateLongid;
privateStringusername;
privateStringsex;
privateStringemail;
privateStringqq;
privateStringdescn;
//getterandsetter
}
javabean中的属性与数据库中的字段一一对应,习惯上将属性定义为private,并配上对应的getter与setter方法,这样就构成了一个典型的javabean。
anni.Contact的源代码在WEB-INF/src/Contact.java。
anni.ContactDao是完成CRUD操作的主体,在这里集合了anni.Contact和anni.DbUtils为jsp提供调用的方法。
1.Read(读取)。
2./**
3.*获得所有联系簿.
4.*
5.*@returncontact列表
6.*/
7.publicListgetAll()throwsException{
8.Connectionconn=null;
9.Statementstate=null;
10.ResultSetrs=null;
11.
12.Listlist=newArrayList();
13.try{
14.conn=DbUtils.getConn();
15.state=conn.createStatement();
16.rs=state.executeQuery("select*fromcontact");
17.
18.while(rs.next()){
19.Contactcontact=newContact();
20.contact.setId(rs.getLong("id"));
21.contact.setUsername(rs.getString("username"));
22.contact.setSex(rs.getString("sex"));
23.contact.setEmail(rs.getString("email"));
24.contact.setQq(rs.getString("qq"));
25.contact.setDescn(rs.getString("descn"));
26.
27.list.add(contact);
28.}
29.}finally{
30.DbUtils.close(rs,state,conn);
31.}
32.returnlist;
33.}
第一步,使用DbUtils.getConn()建立与数据库的连接Connection。
第二步,从Connection创建一个Statement。
第三步,使用Statement执行sql查询语句,返回查询结果集ResultSet。
第四步,将ResultSet中的数据转换成Contact队列。
第五步,关闭数据库的连接,并返回Contact队列作为结果。
Connection->Statement->ResultSet->close()是一个查询功能的基本结构。
这里使用的sql语句会获得数据库中所有的联系信息,所以我们循环读取ResultSet最后得到一个Contact队列。
另一个方法publicContactget(Longid)中会根据指定的主键获得一条对应记录,虽然依然返回ResultSet,但这次ResultSet中只包含一条数据,所以最终只会获得一个Contact对象。
34.Create(创建)
35./**
36.*向数据库插入一条数据.
37.*
38.*@paramcontact联系信息
39.*/
40.publicvoidsave(Contactcontact)throwsException{
41.Connectionconn=null;
42.PreparedStatementstate=null;
43.
44.try{
45.conn=DbUtils.getConn();
46.state=conn.prepareStatement("insertintocontact(username,sex,email,qq,descn)values(?
?
?
?
?
)");
47.state.setString(1,contact.getUsername());
48.state.setString(2,contact.getSex());
49.state.setString(3,contact.getEmail());
50.state.setString(4,contact.getQq());
51