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=