1. 我们先在Tomcat 中创建一个DataSource- jdbc/Panabia,然后再创建一个java“基类”,这个类封装了数据库连接和连接的释放。
package Panabia.db; import javax.sql.DataSource; import javax.naming.*; import java.sql.*; public class SQLFactory { private static DataSource ds = null; private static Object Lock = new Object(); // 生成DataSource** public static DataSource gainDataSource() { try{ if(ds==null) { synchronized(Lock) { if(ds==null) { Context ctx=new InitialContext(); ds=(DataSource)ctx.lookup("java:comp/env/jdbc/Panabia"); } } } }catch(NamingException e){ e.printStackTrace(); } return ds; } // 生成SQL连接** public static synchronized Connection gainConnection() { Connection con = null; try{ if(ds == null) { gainDataSource(); } con = ds.getConnection(); }catch (SQLException e){ e.printStackTrace(); } return con; } // 释放SQL连接** public static void releaseConnection(ResultSet rs, PreparedStatement ps, Statement sql, Connection con) { try { if (rs != null) rs.close(); }catch (SQLException e) { e.printStackTrace(); } try { if (ps != null) ps.close(); }catch (SQLException e) { e.printStackTrace(); } try { if (sql != null) sql.close(); }catch(SQLException e) { e.printStackTrace(); } try { if (con != null && !con.isClosed()) con.close(); }catch (SQLException e) { e.printStackTrace(); } } }
大家都应该注意到了,这个类的所有的方法全部是static的,之所以这样,主要是为了方便其它“扩展类”的调用,当然,还有其它好处--- :)
2. 然后,这个类就封装完毕了,现在我们就可以针对不同的应用要求单独写javaBean了,比如一个简单的:在JSP中列出verify表中的所有用户名与密码列表。
该怎么做?--使用SQLFactory生成Connection,再生成Statement,再生成ResultSet--然后枚举吗?好象不错,哦,等等......这样做你难道没有一种“非常亲切”的感觉吗?---对了,ASP,PHP中就是如此-Faint~我们怎么又回到“原始社会”了....
有没有更好的方式?答案是肯定的,JAVA的能力是“通天”的强大,只要你能想得到,仔细看看它的API Document,就不难找出解决办法。
答案出来了:
我们在查询类中返回Iterator到JSP枚举,而不是ResultSet。
好了,我们的UserQuery类就产生了:
package Panabia.operate; import Panabia.db.SQLFactory; import java.util.*; import java.sql.*; public class UserQuery { private ArrayList list = null; private Connection con = null; private Statement sql = null; private ResultSet rs = null; public Iterator getResult() { try{ con=SQLFactory.gainConnection(); sql=con.createStatement(); rs=sql.executeQuery("select * from verify"); //verify表只有两个字段:username,password; list=new ArrayList(); while(rs.next()) { list.add(rs.getString(1)); list.add(rs.getString(2)); } }catch(SQLException e){ e.printStackTrace(); }finally{ SQLFactory.releaseConnection(rs,null,sql,con); } return list.iterator(); } }
3. 在jsp页面进行查询
Iterator it=UserQuery.getResult(); while(it.hasNext()) { out.print((String)it.next()); }
//尚不完善的地方:虽然情况好了一些,但当使用ArrayList取出体积很大的数据时,会相当耗费系统资源[系统会在内存单独开一块空间存放结果]---相关的优化方法是有的,我在这里就不作陈述了,大家可以参考一下其它的相关资料。