name="jdbc/webdb"
auth="Container"
type="javax.sql.DataSource"
driverClassName="org.gjt.mm.mysql.Driver"
url="jdbc:
mysql:
//localhost:
3306/LibraryOA"
username="root"
password="root"
maxActive="50"
maxIdle="20"
maxWait="10000"/>
以上代码配置了数据库驱动,数据库地址,数据库用户名、密码,默认提供的连接数,最大提供的连接数,最长等待时间等参数。
2、Java中从连接池获取连接的类,使用了单例模式(来自GoF提出的设计模式):
//DataBaseConnectionPond.java
packagelibrary.util;
importjava.sql.Connection;
importjavax.sql.DataSource;
//作者:
赵伯涛
publicclassDataBaseConnectionPond{
privatestaticDataBaseConnectionPonddbcp=null;
privateDataSourceds=null;
privateDataBaseConnectionPond()throwsException{
javax.naming.Contextctx=newjavax.naming.InitialContext();
ds=(DataSource)ctx.lookup("java:
/comp/env/jdbc/webdb");
}
publicConnectionGetConnettion()throwsException{
returnds.getConnection();
}
publicstaticConnectiongetConnection()throwsException{
Connectionconn=null;
if(dbcp==null){
Thread.sleep((long)(Math.random()*200));
synchronized(DataBaseConnectionPond.class){
if(dbcp==null){
dbcp=newDataBaseConnectionPond();
}
}
}
try{
conn=dbcp.GetConnettion();
}catch(Exceptione){
}
returnconn;
}
}
该类在整个项目部署的过程中只实例化了一个对象,故称单例。
可以通过该类的static函数getConnection()获取连接。
3、Dao(DataAccessObject)的模板化实现,使用了模板方法模式(来自GoF提出的设计模式):
//SqlExecute.java
packagelibrary.execute;
importjava.sql.Connection;
importlibrary.util.*;
//作者:
赵伯涛
publicabstractclassSqlExecute{
publicConnectionconn;
publicObjectresult;
publicabstractvoidsetExecute()throwsException;
publicObjectexecute(){
try{
conn=DataBaseConnectionPond.getConnection();
conn.setAutoCommit(false);
setExecute();
mit();
}catch(Exceptione){
try{
conn.rollback();
}catch(Exceptionee){
}
e.printStackTrace();
}finally{
try{
conn.close();
}catch(Exceptione){
}
}
returnresult;
}
}
该类是一个抽象类,必须通过继承该类来实现具体的功能,其中的execute()函数是一个模板方法,将try-catch-finaly、获取connection及connection的事务处理提取出来,具体Dao的功能应该写在setExecute()函数中,在具体实现Dao的功能的时候可以不用重复这些代码,方便程序员编码,也方便程序员维护程序。
下面举例使用这个模板类:
//ReaderChangePasswordDao.java
packagelibrary.dao;
importjava.sql.PreparedStatement;
importlibrary.execute.SqlExecute;
importlibrary.model.ReaderModel;
//作者:
赵伯涛
publicclassReaderChangePasswordDaoextendsSqlExecute{
privateReaderModelrm;
//传入readerID,password,password2(旧密码)
//返回影响行数
publicReaderChangePasswordDao(ReaderModelrm){
this.rm=rm;
}
@Override
publicvoidsetExecute()throwsException{
Stringsql="updateReaderssetpassword=?
wherereaderID=?
andpassword=?
";
PreparedStatementps=conn.prepareStatement(sql);
ps.setString(1,rm.getPassword());
ps.setInt(2,rm.getReaderID());
ps.setString(3,rm.getPassword2());
this.result=ps.executeUpdate();
}
}
上面的类继承了SqlExecute类,重写了它的setExecute()函数,通过构造函数传入操作时需要的参数,在写代码的时候可以更加专注于数据库的操作,因为其它操作由模板类做好了。
这对写一个数据库操作或许没什么大不了的,但是一个项目里边数据库操作肯定是几十个,几百个,甚至几千个,使用模板类减少的编码量是非常客观的。
下面举例使用ReaderChangePasswordDao类:
//来自UserCommonService.java的部分代码
//读者修改密码
publicbooleanreaderChangePassword(intreaderID,StringnewPassword,
StringoldPassword){
ReaderModelrm=newReaderModel();
rm.setReaderID(readerID);
rm.setPassword(newPassword);
rm.setPassword2(oldPassword);
ReaderChangePasswordDaorcpd=newReaderChangePasswordDao(rm);
intcount=(Integer)rcpd.execute();
if(count>0){
returntrue;
}else{
returnfalse;
}
}
注意:
使用Dao的时候调用的应该是它的execute()方法(在抽象类中)。
五、效果截图
六、实验心得。
通过本次实验,我们不单单巩固了我们的Jsp技术,同时业务逻辑能力得到了提高,能通过业务逻辑设计一个数据库,并且在实现业务逻辑的过程中初步使用了GoF提出的设计模式,同时也体验到它带来的好处。
在共同合作开发的过程中,学会如何分工及沟通
七·参考文献。
【1】刘宝林。
Java程序设计与案例【M】。
北京。
高等教育出版社。
2004.11
【2】吴亚峰。
纪超。
JavaSE。
6.6编程指南【M】。
北京。
人民邮局出版社。
2007.11
【3】刘精华。
JavaWeb整合开发王者归来【M】。
北京。
高等教育出版社。
2003.9
【4】孙伟琴。
《Tomcat与javaweb开发技术讲解(第二版)》【M】北京:
电子工业出版社、2009.1-220
【5】黄嘉辉《java网络程序设计》【M】北京。
清华大学出版社。
2002:
445-470