zoukankan      html  css  js  c++  java
  • jdbc pool java连接池技术

       1 ConnectPool .java:
       2 
       3   package pool;
       4 
       5 /**
       6  * Title: ConnectPool.Java
       7  * Description: 连接池治理器
       8  * Copyright: Copyright (c) 2002/12/25
       9  * Company:
      10  * Author :
      11  * Version 2.0
      12  */
      13 
      14 import java.io.*;
      15 import java.sql.*;
      16 import java.util.*;
      17 import java.util.Date;
      18 
      19 /**
      20  * 治理类DBConnectionManager支持对一个或多个由属性文件定义的数据库连接
      21  * 池的访问.客户程序可以调用getInstance()方法访问本类的唯一实例.
      22  */
      23 public class ConnectPool {
      24     static public ConnectPool instance; // 唯一实例
      25     static public int clients;
      26     public Vector drivers = new Vector(); //驱动
      27     public PrintWriter log;
      28     public Hashtable pools = new Hashtable(); //连接
      29 
      30     /**
      31      * 返回唯一实例.假如是第一次调用此方法,则创建实例
      32      *
      33      * @return DBConnectionManager 唯一实例
      34      */
      35     static synchronized public ConnectPool getInstance() {
      36         if (instance == null) {
      37             instance = new ConnectPool();
      38         }
      39 
      40         clients++;
      41         return instance;
      42     }
      43 
      44     /**
      45      * 返回唯一实例.假如是第一次调用此方法,则创建实例
      46      *
      47      * @return DBConnectionManager 唯一实例
      48      */
      49     static synchronized public ConnectPool getInstance(String url) {
      50         if (instance == null) {
      51             instance = new ConnectPool(url);
      52         }
      53         clients++;
      54         return instance;
      55     }
      56 
      57 
      58     /**
      59      * 建构函数私有以防止其它对象创建本类实例
      60      */
      61     public ConnectPool() {
      62         init();
      63     }
      64 
      65     /**
      66      * 建构造带参数的函数
      67      *
      68      */
      69     public ConnectPool(String url) {
      70         init(url);
      71     }
      72 
      73     /**
      74      * 将连接对象返回给由名字指定的连接池
      75      *
      76      * @param name 在属性文件中定义的连接池名字
      77      * @param con 连接对象
      78      */
      79     public void freeConnection(String name, Connection con) {
      80         DBConnectionPool pool = (DBConnectionPool) pools.get(name);
      81         if (pool != null) {
      82             pool.freeConnection(con);
      83         } else {
      84             // System.out.println("pool ==null");
      85         }
      86         clients--;
      87     }
      88 
      89     /**
      90      * 获得一个可用的(空闲的)连接.假如没有可用连接,且已有连接数小于最大连接数
      91      * 限制,则创建并返回新连接
      92      *
      93      * @param name 在属性文件中定义的连接池名字
      94      * @return Connection 可用连接或null
      95      */
      96     public Connection getConnection(String name) {
      97         DBConnectionPool pool = (DBConnectionPool) pools.get(name);
      98         if (pool != null) {
      99             //return pool.getConnection();
     100             return pool.returnConnection();
     101         }
     102         return null;
     103     }
     104 
     105     /**
     106      * 获得一个可用连接.若没有可用连接,且已有连接数小于最大连接数限制,
     107      * 则创建并返回新连接.否则,在指定的时间内等待其它线程释放连接.
     108      *
     109      * @param name 连接池名字
     110      * @param time 以毫秒计的等待时间
     111      * @return Connection 可用连接或null
     112      */
     113     public Connection getConnection(String name, long time) {
     114         DBConnectionPool pool = (DBConnectionPool) pools.get(name);
     115         if (pool != null) {
     116             return pool.getConnection(time);
     117         }
     118         return null;
     119     }
     120 
     121     /**
     122      * 关闭所有连接,撤销驱动程序的注册
     123      */
     124     public synchronized void release() {
     125 // 等待直到最后一个客户程序调用
     126         if (--clients != 0) {
     127             return;
     128         }
     129 
     130         Enumeration allPools = pools.elements();
     131         while (allPools.hasMoreElements()) {
     132             DBConnectionPool pool = (DBConnectionPool) allPools.nextElement();
     133             pool.release();
     134         }
     135         Enumeration allDrivers = drivers.elements();
     136         while (allDrivers.hasMoreElements()) {
     137             Driver driver = (Driver) allDrivers.nextElement();
     138             try {
     139                 DriverManager.deregisterDriver(driver);
     140 
     141                 log("撤销JDBC驱动程序 " + driver.getClass().getName() + "的注册");
     142             } catch (SQLException e) {
     143                 log(e, "无法撤销下列JDBC驱动程序的注册: " + driver.getClass().getName());
     144             }
     145         }
     146     }
     147 
     148     /**
     149      * 根据指定属性创建连接池实例.
     150      *
     151      * @param props 连接池属性
     152      */
     153     private void createPools(Properties props) {
     154         Enumeration propNames = props.propertyNames();
     155         while (propNames.hasMoreElements()) {
     156             String name = (String) propNames.nextElement();
     157             if (name.endsWith(".url")) {
     158                 String poolName = name.substring(0, name.lastIndexOf("."));
     159                 String url = props.getProperty(poolName + ".url");
     160                 if (url == null) {
     161                     log("没有为连接池" + poolName + "指定URL");
     162                     continue;
     163                 }
     164                 String user = props.getProperty(poolName + ".user");
     165                 String passWord = props.getProperty(poolName + ".password");
     166                 String maxconn = props.getProperty(poolName + ".maxconn", "0");
     167                 int max;
     168                 try {
     169                     max = Integer.valueOf(maxconn).intValue();
     170                 } catch (NumberFormatException e) {
     171                     log("错误的最大连接数限制: " + maxconn + " .连接池: " + poolName);
     172                     max = 0;
     173                 }
     174                 DBConnectionPool pool = new DBConnectionPool(poolName, url,
     175                         user, passWord, max);
     176                 pools.put(poolName, pool);
     177                 log("成功创建连接池" + poolName);
     178             }
     179         }
     180     }
     181 
     182     /**
     183      * 读取属性完成初始化
     184      */
     185     private void init() {
     186         try {
     187             Properties p = new Properties();
     188             String configs = System.getProperty("user.dir") + "//conf//poolName.properties";
     189             //String configs = System.getProperty("user.dir") + "//conf//poolName.properties";
     190 
     191             //System.out.println("configs file local at " + configs);
     192             FileInputStream is = new FileInputStream(configs);
     193             Properties dbProps = new Properties();
     194             try {
     195                 dbProps.load(is);
     196             } catch (Exception e) {
     197                 System.err.println("不能读取属性文件. " +
     198                                    "请确保db.properties在CLASSPATH指定的路径中");
     199                 return;
     200             }
     201             String logFile = dbProps.getProperty("logfile",
     202                                                  "DBConnectionManager.log");
     203             try {
     204 
     205                 log = new PrintWriter(new FileWriter(logFile, true), true);
     206             } catch (IOException e) {
     207                 System.err.println("无法打开日志文件: " + logFile);
     208                 log = new PrintWriter(System.err);
     209             }
     210             loadDrivers(dbProps);
     211             createPools(dbProps);
     212         } catch (Exception e) {}
     213     }
     214 
     215     /**
     216      * 读取属性完成初始化
     217      */
     218     private void init(String url) {
     219         try {
     220             Properties p = new Properties();
     221             String configs = System.getProperty("user.dir") +
     222                              "//conf//"+url;
     223             //System.out.println("configs file local at " + configs);
     224             FileInputStream is = new FileInputStream(configs);
     225             Properties dbProps = new Properties();
     226             try {
     227                 dbProps.load(is);
     228             } catch (Exception e) {
     229                 System.err.println("不能读取属性文件. " +
     230                                    "请确保db.properties在CLASSPATH指定的路径中");
     231                 return;
     232             }
     233             String logFile = dbProps.getProperty("logfile",
     234                                                  "DBConnectionManager.log");
     235             try {
     236 
     237                 log = new PrintWriter(new FileWriter(logFile, true), true);
     238             } catch (IOException e) {
     239                 System.err.println("无法打开日志文件: " + logFile);
     240                 log = new PrintWriter(System.err);
     241             }
     242             loadDrivers(dbProps);
     243             createPools(dbProps);
     244         } catch (Exception e) {}
     245     }
     246 
     247 
     248     /**
     249      171 * 装载和注册所有JDBC驱动程序
     250      172 *
     251      173 * @param props 属性
     252      174 */
     253     private void loadDrivers(Properties props) {
     254         String driverClasses = props.getProperty("drivers");
     255         StringTokenizer st = new StringTokenizer(driverClasses);
     256         while (st.hasMoreElements()) {
     257             String driverClassName = st.nextToken().trim();
     258             try {
     259                 Driver driver = (Driver)
     260                                 Class.forName(driverClassName).newInstance();
     261                 DriverManager.registerDriver(driver);
     262                 drivers.addElement(driver);
     263                 //System.out.println(driverClassName);
     264                 log("成功注册JDBC驱动程序" + driverClassName);
     265             } catch (Exception e) {
     266                 log("无法注册JDBC驱动程序: " +
     267                     driverClassName + ", 错误: " + e);
     268             }
     269         }
     270     }
     271 
     272     /**
     273      * 将文本信息写入日志文件
     274      */
     275     private void log(String msg) {
     276         log.println(new Date() + ": " + msg);
     277     }
     278 
     279     /**
     280      * 将文本信息与异常写入日志文件
     281      */
     282     private void log(Throwable e, String msg) {
     283         log.println(new Date() + ": " + msg);
     284         e.printStackTrace(log);
     285     }
     286 
     287     /**
     288      * 此内部类定义了一个连接池.它能够根据要求创建新连接,直到预定的最
     289      * 大连接数为止.在返回连接给客户程序之前,它能够验证连接的有效性.
     290      */
     291 
     292     class DBConnectionPool {
     293 //private int checkedOut;
     294         private Vector freeConnections = new Vector();
     295         private int maxConn;
     296         private String name;
     297         private String password;
     298         private String URL;
     299         private String user;
     300 
     301         /**
     302          * 创建新的连接池
     303          *
     304          * @param name 连接池名字
     305          * @param URL 数据库的JDBC URL
     306          * @param user 数据库帐号,或 null
     307          * @param password 密码,或 null
     308          * @param maxConn 此连接池答应建立的最大连接数
     309          */
     310         public DBConnectionPool(String name, String URL, String user,
     311                                 String password, int maxConn) {
     312             this.name = name;
     313             this.URL = URL;
     314             this.user = user;
     315             this.password = password;
     316             this.maxConn = maxConn;
     317         }
     318 
     319         /**
     320          * 将不再使用的连接返回给连接池
     321          *
     322          * @param con 客户程序释放的连接
     323          */
     324         public synchronized void freeConnection(Connection con) {
     325 // 将指定连接加入到向量末尾
     326             try {
     327                 if (con.isClosed()) {
     328                     //  System.out.println("before freeConnection con is closed");
     329                 }
     330                 freeConnections.addElement(con);
     331                 Connection contest = (Connection) freeConnections.lastElement();
     332                 if (contest.isClosed()) {
     333                     // System.out.println("after freeConnection contest is closed");
     334                 }
     335                 notifyAll();
     336             } catch (SQLException e) {
     337                 // System.out.println(e);
     338             }
     339         }
     340 
     341         /**
     342          * 从连接池获得一个可用连接.如没有空闲的连接且当前连接数小于最大连接
     343          * 数限制,则创建新连接.如原来登记为可用的连接不再有效,则从向量删除之,
     344          * 然后递归调用自己以尝试新的可用连接.
     345          */
     346         public synchronized Connection getConnection() {
     347             Connection con = null;
     348             if (freeConnections.size() > 0) {
     349 // 获取向量中第一个可用连接
     350                 con = (Connection) freeConnections.firstElement();
     351                 freeConnections.removeElementAt(0);
     352                 try {
     353                     if (con.isClosed()) {
     354                         log("从连接池" + name + "删除一个无效连接");
     355                         System.out.println("从连接池" + name + "删除一个无效连接");
     356 // 递归调用自己,尝试再次获取可用连接
     357                         con = getConnection();
     358                     }
     359                 } catch (SQLException e) {
     360                     log("从连接池" + name + "删除一个无效连接时错误");
     361                     System.out.println("从连接池" + name + "删除一个无效连接出错");
     362 // 递归调用自己,尝试再次获取可用连接
     363                     con = getConnection();
     364                 }
     365                 if (freeConnections.size() > maxConn) {
     366                     System.out.println(" 删除一个溢出连接 ");
     367                     releaseOne();
     368                 }
     369             } else if ((maxConn == 0) || (freeConnections.size() < maxConn)) {
     370                 con = newConnection();
     371             }
     372 
     373             return con;
     374         }
     375 
     376         public synchronized Connection returnConnection() {
     377             Connection con = null;
     378 //假如闲置小于最大连接,返回一个新连接
     379             if (freeConnections.size() < maxConn) {
     380                 con = newConnection();
     381             }
     382 //假如闲置大于最大连接,返回一个可用的旧连接
     383             else if (freeConnections.size() >= maxConn) {
     384 
     385                 con = (Connection) freeConnections.firstElement();
     386                 System.out.println(" [a 连接池可用连接数 ] : " + "[ " +
     387                                    freeConnections.size() + " ]");
     388                 freeConnections.removeElementAt(0);
     389                 System.out.println(" [b 连接池可用连接数 ] : " + "[ " +
     390                                    freeConnections.size() + " ]");
     391                 try {
     392                     if (con.isClosed()) {
     393                         log("从连接池" + name + "删除一个无效连接");
     394                         System.out.println("从连接池" + name + "删除一个无效连接");
     395                         returnConnection();
     396                     }
     397                 } catch (SQLException e) {
     398                     log("从连接池" + name + "删除一个无效连接时错误");
     399                     System.out.println("从连接池" + name + "删除一个无效连接出错");
     400                     returnConnection();
     401                 }
     402             }
     403             return con;
     404         }
     405 
     406         /**
     407          * 从连接池获取可用连接.可以指定客户程序能够等待的最长时间
     408          * 参见前一个getConnection()方法.
     409          *
     410          * @param timeout 以毫秒计的等待时间限制
     411          */
     412         public synchronized Connection getConnection(long timeout) {
     413             long startTime = new Date().getTime();
     414             Connection con;
     415             while ((con = getConnection()) == null) {
     416                 try {
     417                     wait(timeout);
     418                 } catch (InterruptedException e) {}
     419                 if ((new Date().getTime() - startTime) >= timeout) {
     420 // wait()返回的原因是超时
     421                     return null;
     422                 }
     423             }
     424             return con;
     425         }
     426 
     427         /**
     428          * 关闭所有连接
     429          */
     430         public synchronized void release() {
     431             Enumeration allConnections = freeConnections.elements();
     432             while (allConnections.hasMoreElements()) {
     433                 Connection con = (Connection) allConnections.nextElement();
     434                 try {
     435                     con.close();
     436                     log("关闭连接池" + name + "中的一个连接");
     437                 } catch (SQLException e) {
     438                     log(e, "无法关闭连接池" + name + "中的连接");
     439                 }
     440             }
     441             freeConnections.removeAllElements();
     442         }
     443 
     444         /**
     445          * 关闭一个连接
     446          */
     447         public synchronized void releaseOne() {
     448             if (freeConnections.firstElement() != null) {
     449                 Connection con = (Connection) freeConnections.firstElement();
     450                 try {
     451                     con.close();
     452                     System.out.println("关闭连接池" + name + "中的一个连接");
     453                     log("关闭连接池" + name + "中的一个连接");
     454                 } catch (SQLException e) {
     455 
     456                     System.out.println("无法关闭连接池" + name + "中的一个连接");
     457                     log(e, "无法关闭连接池" + name + "中的连接");
     458                 }
     459             } else {
     460                 System.out.println(
     461                         "releaseOne() bug.......................................................");
     462 
     463             }
     464         }
     465 
     466         /**
     467          * 创建新的连接
     468          */
     469         private Connection newConnection() {
     470             Connection con = null;
     471             try {
     472                 if (user == null) {
     473                     con = DriverManager.getConnection(URL);
     474                 } else {
     475                     con = DriverManager.getConnection(URL, user, password);
     476                 }
     477                 log("连接池" + name + "创建一个新的连接");
     478 
     479             } catch (SQLException e) {
     480                 log(e, "无法创建下列URL的连接: " + URL);
     481                 return null;
     482             }
     483             return con;
     484         }
     485     }
     486 }
     487 
     488 -----------------------------------------------------------------------------------------------------------------
     489 
     490 PoolMan.java:
     491 
     492 package pool;
     493 
     494 /**
     495  * Title: ConnectPool.java
     496  * Description: 数据库操作
     497  * Copyright: Copyright (c) 2002/12/25
     498  * Company:
     499  * Author :
     500  * remark : 加入指针回滚
     501  * Version 2.0
     502  */
     503 
     504 import java.io.*;
     505 import pool.*;
     506 import java.sql.*;
     507 import java.util.*;
     508 import java.util.Date;
     509 import java.net.*;
     510 
     511 public class PoolMan extends ConnectPool {
     512 
     513     private ConnectPool connMgr;
     514     private Statement stmt;
     515     private Connection con;
     516     private ResultSet rst;
     517 
     518     /**
     519      *对象连接初始化
     520      * */
     521 
     522     public Connection getPool(String name) throws Exception {
     523         try {
     524             connMgr = ConnectPool.getInstance();
     525             con = connMgr.getConnection(name);
     526         } catch (Exception e) {
     527             System.err.println("不能创建连接!请尝试重启应用服务器");
     528 
     529         }
     530         return con;
     531     }
     532 
     533     /**
     534      * 2008-10-14
     535      *对象连接初始化
     536      * */
     537 
     538     public Connection getPool(String name,String url) throws Exception {
     539         try {
     540             connMgr = ConnectPool.getInstance(url);
     541             con = connMgr.getConnection(name);
     542         } catch (Exception e) {
     543             System.err.println("不能创建连接!请尝试重启应用服务器");
     544 
     545         }
     546         return con;
     547     }
     548 
     549 
     550     /**
     551      *同以上方法,加入连接空闲等待时间
     552      *待用方法
     553      * */
     554 
     555     public Connection getPool_t(String name, long time) throws Exception {
     556         try {
     557             connMgr = ConnectPool.getInstance();
     558             con = connMgr.getConnection(name, time);
     559         } catch (Exception e) {
     560             System.err.println("不能创建连接!");
     561 
     562         }
     563         return con;
     564     }
     565 
     566     /**
     567      *执行查询方法1
     568      * */
     569     public ResultSet executeQuery(String SqlStr) throws Exception {
     570         ResultSet result = null;
     571         try {
     572             stmt = con.createStatement();
     573             result = stmt.executeQuery(SqlStr);
     574 // here add one line by jnma 12.11
     575             con.commit();
     576         } catch (java.sql.SQLException e) {
     577             throw new Exception("执行查询语句出错");
     578         }
     579         return result;
     580     }
     581 
     582     /**
     583      *执行查询方法2
     584      * */
     585     public ResultSet getRst(String SqlStr) throws Exception {
     586 // ResultSet result = null;
     587         try {
     588             stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
     589                                        ResultSet.CONCUR_UPDATABLE);
     590             rst = stmt.executeQuery(SqlStr);
     591 // here add one line by jnma 12.11
     592             con.commit();
     593         } catch (java.sql.SQLException e) {
     594             throw new Exception("执行查询语句出错");
     595         }
     596         return rst;
     597     }
     598 
     599     /**
     600      *执行更新
     601      * */
     602     public int Update(String SqlStr) throws Exception {
     603         int result = -1;
     604         try {
     605             stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
     606                                        ResultSet.CONCUR_UPDATABLE);
     607             result = stmt.executeUpdate(SqlStr);
     608 // here add one line by jnma 12.11
     609             con.commit();
     610             if (result == 0) {
     611                 System.out.println("执行delete,update,insert SQL出错");
     612             }
     613         } catch (java.sql.SQLException e) {
     614             System.err.println("执行delete,update,insert SQL出错");
     615         }
     616         return result;
     617     }
     618 
     619     /**
     620      *执行事务处理
     621      * */
     622     public boolean handleTransaction(Vector SqlArray) throws Exception {
     623         boolean result = false;
     624         int ArraySize = SqlArray.size();
     625         try {
     626             stmt = con.createStatement();
     627             con.setAutoCommit(false);
     628             System.out.println("ArraySize is" + ArraySize);
     629             for (int i = 0; i < ArraySize; i++) {
     630                 System.out.println(" 开始执行语句" + (String) SqlArray.elementAt(i));
     631                 stmt.executeUpdate((String) SqlArray.elementAt(i));
     632                 System.out.println(" 执行成功");
     633             }
     634             con.commit();
     635             con.setAutoCommit(true); //必须
     636             System.out.println("事务执行成功");
     637             result = true;
     638         } catch (java.sql.SQLException e) {
     639             try {
     640                 System.out.println(e.toString());
     641                 System.out.println("数据库操作失败");
     642                 con.rollback();
     643             } catch (java.sql.SQLException Te) {
     644                 System.err.println("事务出错回滚异常");
     645             }
     646         }
     647         try {
     648             con.setAutoCommit(true);
     649         } catch (java.sql.SQLException e) {
     650             System.err.println("设置自动提交失败");
     651         }
     652         return result;
     653     }
     654 
     655     /**
     656      *释放连接
     657      * */
     658     public void close(String name) throws Exception {
     659         try {
     660             if (stmt != null) {
     661                 stmt.close();
     662             }
     663             if (con != null) {
     664                 connMgr.freeConnection(name, con);
     665 
     666                 System.out.println(" [c 正在释放一个连接 ] ");
     667 
     668             }
     669         } catch (java.sql.SQLException e) {
     670             System.err.println("释放连接出错");
     671         }
     672     }
     673 
     674 }
     675 
     676 -----------------------------------------------------------------------------------------------------------
     677 
     678 MyDB.java
     679 
     680  
     681 
     682 package db;
     683 
     684 import java.sql.*;
     685 import pool.PoolMan;
     686 import base.Constants;
     687 import java.util.List;
     688 import java.util.ArrayList;
     689 import java.util.HashMap;
     690 import java.util.Iterator;
     691 import org.apache.commons.beanutils.DynaBean;
     692 import org.apache.commons.beanutils.RowSetDynaClass;
     693 import java.util.Vector;
     694 import bean.Log;
     695 import bean.AdminBean;
     696 import base.FunctionStatic;
     697 import forms.system.DeptForm;
     698 import org.apache.commons.beanutils.BeanUtils;
     699 
     700 /*
     701 //数据层续承此类包
     702 例如:public class Function extends MyDB {。。。。。。
     703 注意:当调用数据层都必需关闭数据库
     704 Function fun=new Function()
     705 fun.Close
     706 */
     707 public class MyDB {
     708     public Connection conn = null;
     709     public ResultSet rs = null;
     710     public ResultSet rs1 = null;
     711     public java.sql.PreparedStatement prepar = null;
     712     public Statement stmt = null;
     713     public boolean flag = false;
     714     public java.sql.CallableStatement proc = null;
     715     public int pagecount = 0;
     716     public int pagedata = 0;
     717     PoolMan PoolMan = new PoolMan();
     718     public MyDB() {
     719 
     720         //通过名称得到连接池
     721         conn = PoolMan.getConnection(Constants.SYSTEM_DB_POOL_NAME);
     722        //System.out.println("连接成功");
     723     }
     724 
     725     //关闭连接
     726     public void Close() {
     727         try {
     728             if (rs != null) {
     729                 rs.close();
     730             }
     731             if (rs1 != null) {
     732                 rs1.close();
     733             }
     734             if (prepar != null) {
     735                 prepar.close();
     736             }
     737             if (proc != null) {
     738                 proc.close();
     739             }
     740             if (stmt != null) {
     741                 stmt.close();
     742             }
     743             if (conn != null) {
     744                 conn.close();
     745             }
     746         } catch (SQLException ex) {
     747             ex.printStackTrace();
     748         }
     749 //        System.out.println("关闭成功");
     750     }
     751 
     752     public int executeSql(String sql)throws DbAccessException{
     753         int flag = 0;
     754         try {
     755             stmt = conn.createStatement();
     756             flag = stmt.executeUpdate(sql);
     757            // return flag;
     758         } catch (Exception e) {
     759             throw new DbAccessException("操作数据库出错");
     760         }finally{
     761             //return flag;
     762         }
     763         return flag;
     764     }
     765 
     766     //结果集的数据转存入List
     767     public List setResultToList(ResultSet rs) {
     768         List list = new ArrayList();
     769         try {
     770             ResultSetMetaData md = rs.getMetaData();
     771 
     772             /*获取结果集的列数*/
     773             int columnCount = md.getColumnCount();
     774             while (rs.next()) {
     775                 HashMap map = new HashMap();
     776                 /*把每一行以(key,value)存入HashMap, 列名做为key,列值做为value */
     777                 for (int i = 1; i <= columnCount; ++i) {
     778                     String tempStr = rs.getString(i);
     779                     if (tempStr == null) {
     780                         tempStr = "";
     781                     }
     782                     map.put(md.getColumnName(i), tempStr);
     783                 }
     784                 /*把装有一行数据的HashMap存入list*/
     785                 list.add(map);
     786             }
     787         } catch (SQLException ex) {
     788             ex.printStackTrace();
     789         }
     790         //System.out.println(list.size());
     791         return list;
     792     }
     793 
     794     /*
     795      结果集的数据转存入List  3hsjc
     796 
     797      selectsql:查询的字段
     798      wheresql:查询条件的组合语句
     799      sortsql:排序的组合语句
     800      PageSize:每页显示的条数
     801      PageNum:当前条数
     802      tableName:表名
     803      keyName:表中的主键字段名
     804 
     805      页面调查方法:
     806      <%@page import="java.util.*"%>
     807 
     808      List list = (List) request.getAttribute("list"); //得到类包里存的值
     809      if (list!=null){
     810        for (int i = 0; i < list.size(); i++) {
     811           HashMap map = (HashMap) list.get(i);
     812           System.out.println(map.get("id"));    //字段名同库字段名
     813        }
     814      }
     815 
     816      */
     817     public List getListByMap(String selectsql, String wheresql, String sortsql,
     818                           int PageSize, int PageNum, String tableName,
     819                           String keyName) { //获取 列表信息
     820         List list = new ArrayList();
     821 
     822         String sql = "";
     823         try {
     824             if ("".equals(selectsql)) {
     825                 selectsql = "*";
     826             }
     827             if ("".equals(tableName) || "".equals(keyName)) {
     828                 return null;
     829             }
     830             sql = "SELECT top " + PageSize + " " + selectsql + "  FROM " +
     831                   tableName + " WHERE 1=1 " + wheresql +
     832                   " and " + keyName + " not in (select top " +
     833                   PageSize * (PageNum - 1) + " " + keyName + " from " +
     834                   tableName + " where 1=1 " + wheresql + sortsql + ")" +
     835                   sortsql + "";
     836 
     837             System.out.println("sql = " + sql );
     838             stmt = conn.createStatement();
     839             rs = stmt.executeQuery(sql);
     840 
     841             list = this.setResultToList(rs);
     842             return list;
     843         } catch (SQLException ex) {
     844             ex.printStackTrace();
     845         }
     846         return null;
     847     }
     848 
     849 
     850     /*
     851      结果集的数据转存入List  3hzyh
     852 
     853      selectsql:查询的字段
     854      wheresql:查询条件的组合语句
     855      sortsql:排序的组合语句
     856      PageSize:每页显示的条数
     857      PageNum:当前条数
     858      tableName:表名
     859      keyName:表中的主键字段名
     860 
     861      页面调查方法:
     862      <%@page import="org.apache.struts.util.RequestUtils"%>
     863      <%@page import="org.apache.commons.beanutils.*"%>
     864      <%@page import="java.util.*"%>
     865 
     866      Vector list = (Vector) request.getAttribute("list"); //得到类包里存的值
     867      if (list!=null){
     868        for (int i = 0; i < list.size(); i++) {
     869           DynaBean info = (DynaBean) list.get(i);
     870           System.out.println(BeanUtils.getSimpleProperty(info,"id"));    //字段名全小写
     871        }
     872      }
     873 
     874      */
     875     public Vector getList(String selectsql, String wheresql, String sortsql,
     876                           int PageSize, int PageNum, String tableName,
     877                           String keyName) { //获取 列表信息
     878         Vector vector = new Vector();
     879 
     880         String sql = "";
     881         try {
     882             if ("".equals(selectsql)) {
     883                 selectsql = "*";
     884             }
     885             if ("".equals(tableName) || "".equals(keyName)) {
     886                 return null;
     887             }
     888             sql = "SELECT top " + PageSize + " " + selectsql + "  FROM " +
     889                   tableName + " WHERE 1=1 " + wheresql +
     890                   " and " + keyName + " not in (select top " +
     891                   PageSize * (PageNum - 1) + " " + keyName + " from " +
     892                   tableName + " where 1=1 " + wheresql + sortsql + ")" +
     893                   sortsql + "";
     894 
     895             System.out.println(sql);
     896             stmt = conn.createStatement();
     897             rs = stmt.executeQuery(sql);
     898 
     899             /*对查询结果集RS进行行集的转换*/
     900             RowSetDynaClass rsdc = new RowSetDynaClass(rs);
     901             /*把行集的每一行另存为LIST,以便存取操作*/
     902             List rsDynaClass = rsdc.getRows();
     903 
     904             Iterator itr = rsDynaClass.iterator();
     905 
     906             int i = 0;
     907             while (itr.hasNext()) {
     908                 i++;
     909                 /*对LIST的每一行数据,动态生成虚拟BEAN*/
     910                 DynaBean dBean = (DynaBean) itr.next();
     911                 vector.add(dBean);
     912 
     913             }
     914             return vector;
     915         } catch (SQLException ex) {
     916             ex.printStackTrace();
     917         }
     918         return null;
     919     }
     920 
     921     //======================================================================
     922     //Created by linjunna 2009-08-13
     923     //增加用户操作日志
     924     /*
     925     ActionCode:
     926     1:登录系统
     927     2:......
     928     */
     929     public boolean InsertLog(Log log) {
     930         String sql = "INSERT INTO SU_UserLog(userName,note,userAction,ActionCode,dateCreated) VALUES (?,?,?,?,getdate() )";
     931         int flag=0;
     932         try {
     933             prepar = conn.prepareStatement(sql);
     934             prepar.setString(1, log.getUserName());
     935             prepar.setString(2, log.getNote());
     936             prepar.setString(3, log.getUserAction());
     937             prepar.setString(4, log.getActionCode());
     938             flag = prepar.executeUpdate();
     939             if (flag>1) return true;
     940         } catch (Exception ex) {
     941         }
     942         return false;
     943     }
     944 
     945     /*
     946     函数说明:获取表中某一字段的值
     947     参数说明你个:field:要获取字段的名称;keyName:判断的条件;keyValue:判断的条件的值;tableName:数据库表名
     948     返回值说明:String
     949      */
     950     public String getFieldValue(String field,String keyName,String keyValue,String tableName) {
     951         String result = "";
     952         FunctionStatic fun = new FunctionStatic();
     953         try {
     954             String sql = " select "+field+" from "+tableName+" where "+keyName+" ='" + keyValue + "' ";
     955 
     956             prepar = conn.prepareStatement(sql);
     957             rs = prepar.executeQuery();
     958             while (rs.next()){
     959                 result = fun.getNullString(rs.getString(field));
     960                 break;
     961             }
     962         } catch (Exception e) {
     963             e.printStackTrace();
     964         }
     965         return result;
     966     }
     967 
     968 
     969     /*
     970     函数描述:修改表的某一字段
     971     */
     972     public int updateTableField(String TableName, String FieldName,String FieldValue, String PKID) {
     973         int ret = 0;
     974         String sql = "update ? set ? = ? where ID=?";
     975         try {
     976             prepar = conn.prepareStatement(sql);
     977             prepar.setString(1, TableName);
     978             prepar.setString(2, FieldName);
     979             prepar.setString(3, FieldValue);
     980             prepar.setString(4, PKID);
     981 
     982             ret = prepar.executeUpdate(sql);
     983         } catch (Exception e) {
     984             e.printStackTrace();
     985         }
     986         return ret;
     987     }
     988 
     989     /*
     990       函数说明:批量删除
     991       参数说明:FieldName:表的字段名;FieldValues:字段值,以逗号分隔,形式如:"h0001,h0002,h0003,..."
     992       返回值:整数
     993       */
     994       public int BatchDeleteByIds( String TableName, String FieldName,String FieldValues)
     995       {
     996           String[] strs=base.FunctionStatic.splitSkins(FieldValues,",");
     997           int flag = strs.length;
     998           try {
     999 
    1000               conn.setAutoCommit(false);
    1001               for (int i=0;i<strs.length;i++)
    1002               {
    1003                  flag-= Delete(TableName,FieldName,strs[i]);
    1004               }
    1005               conn.commit();
    1006           } catch (Exception e) {
    1007               try {
    1008                   conn.rollback();
    1009               } catch (SQLException ex) {
    1010                   ex.printStackTrace();
    1011               }
    1012               e.printStackTrace();
    1013           }
    1014           if (flag==0)
    1015               return 1;
    1016           else
    1017               return 0;
    1018 
    1019       }
    1020 
    1021       /*
    1022       功能描述:根据表的主键id删除记录
    1023       参数:TableName为要删除记录的表名;tids为一个或多个主键id字符串,以逗号(,)隔开;AutoCommit为是否使用事务
    1024       author:曾令启
    1025       */
    1026       public int Delete(String TableName, String WhereSQL,boolean AutoCommit) {
    1027           int flag = 0;
    1028           try {
    1029               String sql = "";
    1030               conn.setAutoCommit(AutoCommit);
    1031               sql = " delete from " + TableName + " where 1=1 " + WhereSQL + " ";
    1032               flag = executeSql(sql);
    1033               conn.commit();
    1034           } catch (Exception e) {
    1035               try {
    1036                   conn.rollback();
    1037               } catch (SQLException ex) {
    1038                   ex.printStackTrace();
    1039               }
    1040               e.printStackTrace();
    1041           }
    1042           return flag;
    1043       }
    1044 
    1045       /**
    1046      * 获得用于数据交换的主键ID,使用的存储过程为生成通用主键ID的PR_MakeMax_TYPK
    1047      * @param @Bureau_id String 用户登录时选择的机构ID
    1048      * @param @lab_Id String 用户登录时选择的实验室ID
    1049      * @param @TableName String 表名
    1050      * @param @IDNewFormatOut String 输出的ID
    1051      * @return String 可以返回以下格式的ID:"Bureau_id+lab_id+0000000001"
    1052      */
    1053     public String getExchangePKID(String Bureau_id,String lab_Id,String TableName) {
    1054         String sql ="set nocount on  begin declare @NewID varchar(50)"
    1055                   +" set @NewID=NULL"
    1056                   +" exec PR_MakeMax_TYPK N'', N'"+Bureau_id+"', N'"+lab_Id+"',N'"+TableName+"',@NewID out "
    1057                   +" select @NewID end ";
    1058         String result ="";
    1059         try{
    1060             prepar = conn.prepareStatement(sql);
    1061             rs = prepar.executeQuery();
    1062             if (rs.next()) {
    1063                 result = rs.getString(1);
    1064             }
    1065         }
    1066         catch(SQLException e){
    1067             e.printStackTrace();
    1068         }
    1069         return result;
    1070     }
    1071 
    1072     public String getExchangePKID(AdminBean ab,String TableName) {
    1073     String result ="";
    1074     result=getExchangePKID(ab.getLoginBureaus(),ab.getLoginLab(),TableName);
    1075     return result;
    1076 }
    1077 
    1078  
    1079 
    1080  
    1081 
    1082  
    1083 
    1084  
    1085 
    1086  
    1087 
    1088  
    1089 
    1090       //====================私有方法 start=============================================================================
    1091 
    1092       /*
    1093            功能描述:根据表的主键id删除记录
    1094            参数:TableName为要删除记录的表名;FieldName为数据表字段名;FieldValue为数据库表字段值
    1095            返回值:int。成功返回1,失败返回0
    1096        */
    1097       private int Delete(String TableName, String FieldName, String FieldValue) {
    1098           int flag = 0;
    1099           String where = " and " + FieldName + " ='" + FieldValue + "'";
    1100           flag = Delete(TableName, where);
    1101           return flag;
    1102       }
    1103 
    1104 
    1105       //用于批量删除
    1106       private int Delete(String TableName, String WhereSQL) {
    1107          int flag = 0;
    1108          try {
    1109              String sql = "";
    1110              sql = " delete from " + TableName + " where 1=1 " + WhereSQL + " ";
    1111              flag = executeSql(sql);
    1112 
    1113          } catch (Exception e) {
    1114              e.printStackTrace();
    1115          }
    1116          return flag;
    1117    }
    1118 
    1119    //====================私有方法 end=============================================================================
    1120 
    1121    public String getListToJason(String sql) throws Exception {
    1122        StringBuffer jasonStr= new StringBuffer();
    1123        stmt = conn.createStatement();
    1124        rs = stmt.executeQuery(sql);
    1125        ResultSetMetaData rsmd = rs.getMetaData();
    1126        RowSetDynaClass rsdc = new RowSetDynaClass(rs);
    1127        List list = rsdc.getRows();
    1128        Iterator ite = list.iterator();
    1129        int resultCout = list.size();
    1130        jasonStr.append("{totalCount:"+String.valueOf(resultCout)).append(",data:[");
    1131        while(ite.hasNext()){
    1132            DynaBean dyna = (DynaBean)ite.next();
    1133            jasonStr.append("{");
    1134            for(int i=1;i<=rsmd.getColumnCount();i++){
    1135                if (i==rsmd.getColumnCount())
    1136                    jasonStr.append( rsmd.getColumnName(i)).append(":/"").append(BeanUtils.getSimpleProperty(dyna,rsmd.getColumnName(i).toLowerCase())).append("/"");
    1137                else
    1138                    jasonStr.append( rsmd.getColumnName(i)).append(":/"").append(BeanUtils.getSimpleProperty(dyna,rsmd.getColumnName(i).toLowerCase())).append("/",");
    1139            }
    1140            jasonStr.append("},");
    1141        }
    1142        String te = jasonStr.toString();
    1143        te = te.substring(0,te.length()-1)+"],success:true}";
    1144        return te;
    1145    }
    1146 
    1147    public String getListToJason(String sql,int start,int limit) throws Exception {
    1148         StringBuffer jasonStr= new StringBuffer();
    1149         stmt = conn.createStatement();
    1150         rs = stmt.executeQuery(sql);
    1151         ResultSetMetaData rsmd = rs.getMetaData();
    1152         RowSetDynaClass rsdc = new RowSetDynaClass(rs);
    1153         List list = rsdc.getRows();
    1154         int resultCout = list.size();
    1155         list = list.subList(start,start+limit);
    1156         Iterator ite = list.iterator();
    1157         jasonStr.append("{totalCount:"+String.valueOf(resultCout)).append(",data:[");
    1158         while(ite.hasNext()){
    1159             DynaBean dyna = (DynaBean)ite.next();
    1160             jasonStr.append("{");
    1161             for(int i=1;i<=rsmd.getColumnCount();i++){
    1162                 if (i==rsmd.getColumnCount())
    1163                     jasonStr.append( rsmd.getColumnName(i)).append(":/"").append(BeanUtils.getSimpleProperty(dyna,rsmd.getColumnName(i).toLowerCase())).append("/"");
    1164                 else
    1165                     jasonStr.append( rsmd.getColumnName(i)).append(":/"").append(BeanUtils.getSimpleProperty(dyna,rsmd.getColumnName(i).toLowerCase())).append("/",");
    1166             }
    1167             jasonStr.append("},");
    1168         }
    1169         String te = jasonStr.toString();
    1170         te = te.substring(0,te.length()-1)+"],success:true}";
    1171         return te;
    1172     }
    1173 
    1174 }
    1175 
    1176 -----------------------------------------------------------------------------------------------------------------------------
    1177 
    1178 connect.properties
    1179 
    1180 drivers=net.sourceforge.jtds.jdbc.Driver
    1181 #drivers=com.microsoft.jdbc.sqlserver.SQLServerDriver
    1182 logfile=D://DBConnectPool-logfile.txt
    1183 
    1184 poolName.maxconn=100
    1185 poolName.url=jdbc:jtds:sqlserver://localhost:1433;DatabaseName=my_DB;tds=8.0;lastupdatecount=true
    1186 #poolName.url=jdbc:jtds:sqlserver://localhost:1433;DatabaseName=my_db;tds=8.0;lastupdatecount=true
    1187 poolName.user=sa
    1188 poolName.password=
  • 相关阅读:
    CGCDSSQ
    100200H
    斗地主
    借教室
    bzoj 3743
    17B
    能量项链
    589
    16-求连续数组和最大
    15-幸运数组4、7
  • 原文地址:https://www.cnblogs.com/zhangyongjian/p/3647490.html
Copyright © 2011-2022 走看看