jdbc pool java连接池技术
2016-05-18 11:30
316 查看
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. 4000 } 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. 1176d 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= 分类: JDBC
相关文章推荐
- spring+mybatis+ehcache配置缓存
- spring mvc 拦截器路径问题,只拦截固定后缀
- Java实现-二叉树定义树结点及创建
- Java 对象实例化过程
- java实现身份证有效性验证
- Rxjava操作符学习博客
- 工厂模式
- 快速排序算法Java
- 【Java】String getBytes() toCharArray()
- 图文来教你在eclipse下用gradle 来打包Android
- Javac编译过程
- 在java代码中获取JVM参数
- 对Spring 数据访问的理解
- Java集合框架学习总结
- Spring MVC github showCase
- java当中的定时器的4种使用方式
- 解决java.lang.IllegalArgumentException: pointerIndex out of range 或者 arrayindexoutofboundsexception的错误
- Java ArrayList源码剖析
- Rxjava中的toMap操作符
- java中 this 和super的用法