1. 在业务层使用jdbc直接操作数据库-最简单,最直接的操作
1)数据库url,username,password写死在代码中
class.forname("oracle.jdbc.driver.oracledriver").newinstance();
string url="jdbc:oracle:thin:@localhost:1521:orcl";
string user="scott";
string password="tiger";
connection conn= drivermanager.getconnection(url,user,password);
statement stmt=conn.createstatement(
resultset.type_scroll_sensitive,resultset.concur_updatable);
string sql="select * from test";
resultset rs=stmt.executequery(sql);
2)采用facade和command模式,使用dbutil类封装jdbc操作;
数据库url,username,password可以放在配置文件中(如xml,properties,ini等)。
这种方法在小程序中应用较多。
2.dao(data accessor object)模式-松耦合的开始
dao = data + accessor + domain object
例如user类-domain object (javabean)
userdao类-accessor ,提供的方法getuser(int id),save(user user)内包含了jdbc操作
在业务逻辑中使用这两个类来完成数据操作。
使用factory模式可以方便不同数据库连接之间的移植。
3.数据库资源管理模式
3.1 数据库连接池技术
资源重用,避免频繁创建,释放连接引起大大量性能开销;
更快的系统响应速度;
通过实现jdbc的部分资源对象接口( connection, statement, resultset ),可以使用decorator设计模式分别产生三种逻辑资源对象: pooledconnection, pooledstatement和 pooledresultset。
一个最简单地数据库连接池实现:
public class connectionpool {
private static vector pools;
private final int pool_maxsize = 25;
/**
* 获取数据库连接
* 如果当前池中有可用连接,则将池中最后一个返回;若没有,则创建一个新的返回
*/
public synchronized connection getconnection() {
connection conn = null;
if (pools == null) {
pools = new vector();
}
if (pools.isempty()) {
conn = createconnection();
} else {
int last_idx = pools.size() - 1;
conn = (connection) pools.get(last_idx);
pools.remove(last_idx);
}
return conn;
}
/**
* 将使用完毕的数据库连接放回池中
* 若池中连接已经超过阈值,则关闭该连接;否则放回池中下次再使用
*/
public synchronized void releaseconnection(connection conn) {
if (pools.size() >= pool_maxsize)
try {
conn.close();
} catch (sqlexception e) {
// todo自动生成 catch 块
e.printstacktrace();
} else
pools.add(conn);
}
public static connection createconnection() {
connection conn = null;
try {
class.forname("oracle.jdbc.driver.oracledriver").newinstance();
string url = "jdbc:oracle:thin:@localhost:1521:orcl";
string user = "scott";
string password = "tiger";
conn = drivermanager.getconnection(url, user, password);
} catch (instantiationexception e) {
// todo自动生成 catch 块
e.printstacktrace();
} catch (illegalaccessexception e) {
// todo自动生成 catch 块
e.printstacktrace();
} catch (classnotfoundexception e) {
// todo自动生成 catch 块
e.printstacktrace();
} catch (sqlexception e) {
// todo自动生成 catch 块
e.printstacktrace();
}
return conn;
}
}
注意:利用getconnection()方法得到的connection,程序员很习惯地调用conn.close()方法关闭了数据库连接,那么上述的数据库连接机制便形同虚设。在调用conn.close()方法方法时如何调用releaseconnection()方法?这是关键。这里,我们使用proxy模式和java反射机制。
public synchronized connection getconnection() {
connection conn = null;
if (pools == null) {
pools = new vector();
}
if (pools.isempty()) {
conn = createconnection();
} else {
int last_idx = pools.size() - 1;
conn = (connection) pools.get(last_idx);
pools.remove(last_idx);
}
connectionhandler handler=new connectionhandler(this);
return handler.bind(con);
}
public class connectionhandler implements invocationhandler {
private connection conn;
private connectionpool pool;
public connectionhandler(connectionpool pool){
this.pool=pool;
}
/**
* 将动态代理绑定到指定connection
* @param conn
* @return
*/
public connection bind(connection conn){
this.conn=conn;
connection proxyconn=(connection)proxy.newproxyinstance(
conn.getclass().getclassloader(), conn.getclass().getinterfaces(),this);
return proxyconn;
}
/* (非 javadoc)
* @see java.lang.reflect.invocationhandler#invoke(java.lang.object, java.lang.reflect.method, java.lang.object[])
*/
public object invoke(object proxy, method method, object[] args) throws throwable {
// todo自动生成方法存根
object obj=null;
if("close".equals(method.getname())){
this.pool.releaseconnection(this.conn);
}
else{
obj=method.invoke(this.conn, args);
}
return obj;
}
}
在实际项目中,并不需要你来从头开始来设计数据库连接池机制,现在成熟的开源项目,如c3p0,dbcp,proxool等提供了良好的实现。一般推荐使用apache dbcp,基本使用实例:
datasource ds = null;
try{
context initctx = new initialcontext();
context envctx = (context) initctx.lookup("java:comp/env");
ds = (datasource)envctx.lookup("jdbc/myoracle");
if(ds!=null){
out.println("connection is ok!");
connection cn=ds.getconnection();
if(cn!=null){
out.println("cn is ok!");
statement stmt = cn.createstatement();
resultset rst = stmt.executequery("select * from book");
out.println("<p>rst is ok!" + rst.next());
while(rst.next()){
out.println("<p>book_code:" + rst.getstring(1));
}
cn.close();
}else{
out.println("rst fail!");
}
}
else
out.println("fail!");
}catch(exception ne){ out.println(ne);
}
3.2 statement pool
普通预编译代码:
string strsql=”select name from items where id=?”;
preparedstatement ps=conn.preparestatement(strsql);
ps.setstring(1, “2”);
resultset rs=ps.executequery();
但是preparedstatement 是与特定的connection关联的,一旦connection关闭,则相关的preparedstatement 也会关闭。
为了创建preparedstatement 缓冲池,可以在invoke方法中通过sql语句判断池中还有没有可用实例。
4. 持久层设计与o/r mapping 技术
1) hernate:适合对新产品的开发,进行封闭化的设计
hibernate 2003年被jboss接管,通过把java pojo对象映射到数据库的table中,采用了xml/javareflection技术等。3.0提供了对存储过程和手写sql的支持,本身提供了hql语言。
开发所需要的文件:
hibernate配置文件: hibernate.cfg.xml 或 hibernate.properties
hibernate 映射文件: a.hbm.xml
pojo类源文件: a.java
导出表与表之间的关系:
a. 从java对象到hbm文件:xdoclet
b. 从hbm文件到java对象:hibernate extension
c. 从数据库到hbm文件:middlegen
d. 从hbm文件到数据库:schemaexport
2)iatis :适合对遗留系统的改造和对既有数据库的复用,有很强的灵活性 3) apache ojb:优势在于对标准的全面支持 4)ejb:适合集群服务器,其性能也不象某些人所诟病的那么差劲 5) jdo (java data object)
设置一个properties对象,从而获取一个jdo的persistencemanagerfactory(相当于jdbc连接池中的datasource),进而获得一个persistencemanager对象(相当于jdbc中的connection对象),之后,你可以用这个persistencemanager对象来增加、更新、删除、查询对象。
jdoql是jdo的查询语言;它有点象sql,但却是依照java的语法的。
5. 基于开源框架的struts+spring+hibernate实现方案
示例:这是一个3层架构的web 程序,通过一个action 来调用业务代理,再通过它来回调 dao类。下面的流程图表示了myusers是如何工作的。数字表明了流程的先后顺序,从web层(useraction)到中间层(usermanager),再到数据层(userdao),然后返回。
spring是aop, usermanager和userdao都是接口.
1) web层(useraction) :调用中间层的接口方法,将usermanager作为属性注入。
采用流行的struts框架,虽然有很多人不屑一顾,但是这项技术在业界用的比较普遍,能满足基本的功能,可以减少培训学习成本。
2) 中间层(usermanager):将userdao作为属性注入,其实现主要是调用数据层接口的一些方法;它处于事务控制中。
采用spring框架实现,ioc与aop是它的代名词,功能齐全,非常棒的一个架构。
3) 数据层(userdao):实现类继承hibernatedaosupport类,在该类中可以调用gethibernatetemplate()的一些方法执行具体的数据操作。
采用hibernate做o/r mapping,从种种迹象可以看出,hibernate就是ejb3.0的beta版。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器