zoukankan      html  css  js  c++  java
  • 构建一个高可扩展性javabean和jsp连接数据库操作

    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取出体积很大的数据时,会相当耗费系统资源[系统会在内存单独开一块空间存放结果]---相关的优化方法是有的,我在这里就不作陈述了,大家可以参考一下其它的相关资料。
  • 相关阅读:
    B树与B+详解
    SQLite占用资源少原因
    iOS SQLite详解
    YTKNetwork网络封装
    YTKNetwork源码详解
    AFNetworking封装-项目使用
    iOS网络请求-AFNetworking源码解析
    PHP 不使用第三个变量实现交换两个变量的值
    PHP public private protected 三种修饰符的区别
    PHP 汉字转拼音
  • 原文地址:https://www.cnblogs.com/haore147/p/3618220.html
Copyright © 2011-2022 走看看