﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-&lt;font color="red"&gt;中國男人&lt;/font&gt;&lt;font color="lightgreen"&gt;大鹏一曰同风起，扶摇直上九万里&lt;/font&gt;-随笔分类-DBMixture</title><link>http://www.blogjava.net/liaojiyong/category/11448.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 23 Mar 2007 14:09:36 GMT</lastBuildDate><pubDate>Fri, 23 Mar 2007 14:09:36 GMT</pubDate><ttl>60</ttl><item><title>Java jdbc数据库连接池总结（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105715.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 23 Mar 2007 01:33:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105715.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/105715.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105715.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/105715.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/105715.html</trackback:ping><description><![CDATA[1. 引言 
<p>　　近年来，随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及，计算机</p><p>　　应用程序已从传统的桌面应用转到Web应用。基于B/S（Browser/Server）架构的3层开发模式逐渐取代C/S（Client/Server）架构的开发模式，成为开发企业级应用和电子商务普遍采用的技术。在Web应用开发的早期，主要使用的技术是<a href="http://web.rdxx.com/CGI/" target="_blank"><font color="#3080cb">CGI</font></a>﹑<a href="http://web.rdxx.com/ASP/" target="_blank"><font color="#3080cb">ASP</font></a>﹑<a href="http://web.rdxx.com/PHP/" target="_blank"><font color="#3080cb">PHP</font></a>等。之后，Sun公司推出了基于<a href="http://dev.rdxx.com/Java/" target="_blank"><font color="#3080cb">Java</font></a>语言的Servlet+Jsp+JavaBean技术。相比传统的开发技术，它具有跨平台﹑<a href="http://net.rdxx.com/Safe/SafeTech/" target="_blank"><font color="#3080cb">安全</font></a>﹑有效﹑可移植等特性，这使其更便于使用和开发。</p><p>　　Java应用程序访问<a href="http://db.rdxx.com/" target="_blank"><font color="#3080cb">数据库</font></a>的基本原理</p><p>　　在Java语言中，JDBC（Java DataBase Connection）是应用程序与数据库沟通的桥梁,</p><p>　　即Java语言通过JDBC技术访问数据库。JDBC是一种“开放”的方案，它为数据库应用开发人员﹑数据库前台工具开发人员提供了一种标准的应用程序<a href="http://soft.rdxx.com/Design/" target="_blank"><font color="#3080cb">设计</font></a>接口，使开发人员可以用纯Java语言编写完整的数据库应用程序。JDBC提供两种API，分别是面向开发人员的API和面向底层的JDBC驱动程序API，底层主要通过直接的JDBC驱动和JDBC-ODBC桥驱动实现与数据库的连接。</p><p>　　一般来说，Java应用程序访问数据库的过程（如图1所示）是：</p><p>　　①装载数据库驱动程序；</p><p>　　②通过JDBC建立数据库连接；</p><p>　　③访问数据库，执行SQL语句；</p><p>　　④断开数据库连接。</p><div align="center"><img src="http://web.rdxx.com/Files/Pic/Img/JSP_Skill/0682916281387862.gif" border="0" /><br />图1 Java数据库访问机制</div><div align="left">　　JDBC作为一种数据库访问技术，具有简单易用的优点。但使用这种模式进行Web应用</div><div align="left">　　程序开发，存在很多问题：首先，每一次Web请求都要建立一次数据库连接。建立连接是一个费时的活动，每次都得花费0.05s～1s的时间，而且系统还要分配内存资源。这个时间对于一次或几次数据库操作，或许感觉不出系统有多大的开销。可是对于现在的Web应用，尤其是大型电子商务<a href="http://mg.rdxx.com/" target="_blank"><font color="#3080cb">网站</font></a>，同时有几百人甚至几千人在线是很正常的事。在这种情况下，频繁的进行数据库连接操作势必占用很多的系统资源，网站的响应速度必定下降，严重的甚至会造成服务器的崩溃。不是危言耸听，这就是制约某些电子商务网站发展的技术瓶颈问题。其次，对于每一次数据库连接，使用完后都得断开。否则，如果程序出现异常而未能关闭，将会导致数据库系统中的内存泄漏，最终将不得不重启数据库。还有，这种开发不能控制被创建的连接对象数，系统资源会被毫无顾及的分配出去，如连接过多，也可能导致内存泄漏，服务器崩溃。</div><div align="left"> </div><div align="left">　　数据库连接池（connection pool）的工作原理</div><div align="left">　　1、基本概念及原理<br />由上面的分析可以看出，问题的根源就在于对<a href="http://db.rdxx.com/" target="_blank"><font color="#3080cb">数据库</font></a>连接资源的低效管理。我们知道， 
<div align="left">　　对于共享资源，有一个很著名的<a href="http://soft.rdxx.com/Design/" target="_blank"><font color="#3080cb">设计</font></a>模式：资源池（Resource Pool）。该模式正是为了解决资源的频繁分配﹑释放所造成的问题。为解决上述问题，可以采用数据库连接池技术。数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接，当需要建立数据库连接时，只需从“缓冲池”中取出一个，使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况，为系统开发﹑测试及性能调整提供依据。连接池的基本工作原理见下图2。</div><div align="center"><img src="http://web.rdxx.com/Files/Pic/Img/JSP_Skill/0682916281311029.gif" border="0" /><br />图2 连接池的基本工作原理</div><div align="left">　　2、服务器自带的连接池</div><div align="left">　　JDBC的API中没有提供连接池的方法。一些大型的WEB应用服务器如BEA的WebLogic和IBM的WebSphere等提供了连接池的机制，但是必须有其第三方的专用类方法支持连接池的用法。</div><div align="left">　　连接池关键问题分析</div><div align="left">　　1、并发问题</div><div align="left">　　为了使连接管理服务具有最大的通用性，必须考虑多线程环境，即并发问题。这个问题相对比较好解决，因为<a href="http://dev.rdxx.com/Java/" target="_blank"><font color="#3080cb">Java</font></a>语言自身提供了对并发管理的支持，使用synchronized关键字即可确保线程是同步的。使用方法为直接在类方法前面加上synchronized关键字，如：</div><div align="left">public synchronized Connection getConnection（） </div><div align="left">　　2、多数据库服务器和多用户</div><div align="left">　　对于大型的企业级应用，常常需要同时连接不同的数据库（如连接<a href="http://db.rdxx.com/Oracle/" target="_blank"><font color="#3080cb">Oracle</font></a>和<a href="http://db.rdxx.com/Sybase/" target="_blank"><font color="#3080cb">Sybase</font></a>）。如何连接不同的数据库呢？我们采用的策略是：设计一个符合单例模式的连接池管理类，在连接池管理类的唯一实例被创建时读取一个资源文件，其中资源文件中存放着多个数据库的url地址（&lt;poolName.url&gt;）﹑用户名（&lt;poolName.user&gt;）﹑密码（&lt;poolName.password&gt;）等信息。如tx.url=192.168.1.123:5000/tx_it，tx.user=cyl，tx.password=123456。根据资源文件提供的信息，创建多个连接池类的实例，每一个实例都是一个特定数据库的连接池。连接池管理类实例为每个连接池实例取一个名字，通过不同的名字来管理不同的连接池。</div><div align="left">　　对于同一个数据库有多个用户使用不同的名称和密码访问的情况，也可以通过资源文件处理，即在资源文件中设置多个具有相同url地址，但具有不同用户名和密码的数据库连接信息。</div><div align="left">　　3、事务处理</div><div align="left">　　我们知道，事务具有原子性，此时要求对数据库的操作符合“ALL-ALL-NOTHING”原则,即对于一组SQL语句要么全做，要么全不做。<br />在<a href="http://dev.rdxx.com/Java/" target="_blank"><font color="#3080cb">Java</font></a>语言中，Connection类本身提供了对事务的支持，可以通过设置Connection的AutoCommit属性为false,然后显式的调用commit或rollback方法来实现。但要高效的进行Connection复用，就必须提供相应的事务支持机制。可采用每一个事务独占一个连接来实现，这种方法可以大大降低事务管理的复杂性。 
<div align="left">　　4、连接池的分配与释放</div><div align="left">　　连接池的分配与释放，对系统的性能有很大的影响。合理的分配与释放，可以提高连接的复用度，从而降低建立新连接的开销，同时还可以加快用户的访问速度。</div><div align="left">　　对于连接的管理可使用空闲池。即把已经创建但尚未分配出去的连接按创建时间存放到一个空闲池中。每当用户请求一个连接时，系统首先检查空闲池内有没有空闲连接。如果有就把建立时间最长（通过容器的顺序存放实现）的那个连接分配给他（实际是先做连接是否有效的判断，如果可用就分配给用户，如不可用就把这个连接从空闲池删掉，重新检测空闲池是否还有连接）；如果没有则检查当前所开连接池是否达到连接池所允许的最大连接数（maxConn）,如果没有达到，就新建一个连接，如果已经达到，就等待一定的时间（timeout）。如果在等待的时间内有连接被释放出来就可以把这个连接分配给等待的用户，如果等待时间超过预定时间timeout,则返回空值（null）。系统对已经分配出去正在使用的连接只做计数，当使用完后再返还给空闲池。对于空闲连接的状态，可开辟专门的线程定时检测，这样会花费一定的系统开销，但可以保证较快的响应速度。也可采取不开辟专门线程，只是在分配前检测的方法。</div><div align="left">　　5、连接池的配置与维护</div><div align="left">　　连接池中到底应该放置多少连接，才能使系统的性能最佳？系统可采取设置最小连接数（minConn）和最大连接数（maxConn）来控制连接池中的连接。最小连接数是系统启动时连接池所创建的连接数。如果创建过多，则系统启动就慢，但创建后系统的响应速度会很快；如果创建过少，则系统启动的很快，响应起来却慢。这样，可以在开发时，设置较小的最小连接数，开发起来会快，而在系统实际使用时设置较大的，因为这样对访问客户来说速度会快些。最大连接数是连接池中允许连接的最大数目，具体设置多少，要看系统的访问量，可通过反复测试，找到最佳点。</div><div align="left">　　如何确保连接池中的最小连接数呢？有动态和静态两种策略。动态即每隔一定时间就对连接池进行检测，如果发现连接数量小于最小连接数，则补充相应数量的新连接,以保证连接池的正常运转。静态是发现空闲连接不够时再去检查。<br />连接池的实现 
<div align="left">　　1、连接池模型</div><div align="left">　　本文讨论的连接池包括一个连接池类（DBConnectionPool）和一个连接池管理类（DBConnetionPoolManager）和一个配置文件操作类(ParseDSConfig)。连接池类是对某一<a href="http://db.rdxx.com/" target="_blank"><font color="#3080cb">数据库</font></a>所有连接的“缓冲池”，主要实现以下功能：①从连接池获取或创建可用连接；②使用完毕之后，把连接返还给连接池；③在系统关闭前，断开所有连接并释放连接占用的系统资源；④还能够处理无效连接（原来登记为可用的连接，由于某种原因不再可用，如超时，通讯问题），并能够限制连接池中的连接总数不低于某个预定值和不超过某个预定值。(5)当多数据库时,且数据库是动态增加的话,将会加到配置文件中。</div><div align="left">　　连接池管理类是连接池类的外覆类（wrapper）,符合单例模式，即系统中只能有一个连接池管理类的实例。其主要用于对多个连接池对象的管理，具有以下功能：①装载并注册特定数据库的JDBC驱动程序；②根据属性文件给定的信息，创建连接池对象；③为方便管理多个连接池对象，为每一个连接池对象取一个名字，实现连接池名字与其实例之间的映射；④跟踪客户使用连接情况，以便需要是关闭连接释放资源。连接池管理类的引入主要是为了方便对多个连接池的使用和管理，如系统需要连接不同的数据库，或连接相同的数据库但由于<a href="http://net.rdxx.com/Safe/SafeTech/" target="_blank"><font color="#3080cb">安全</font></a>性问题，需要不同的用户使用不同的名称和密码。<br />         2、连接池实现(经过本人改版,可以适用多数据库类型的应用以及一种数据库类型多个数据库且数据  库的数量可以动态增加的应用程序)<br />         1),DBConnectionPool.java   数据库连接池类<br />         2),DBConnectionManager .java   数据库管理类<br />         3),DSConfigBean .java                单个数据库连接信息Bean<br />         4),ParseDSConfig.java                操作多(这个'多'包括不同的数据库和同一种数据库有多个数据库)<br />                                                            数据 配置文件xml<br />         5),ds.config.xml                           数据库配置文件xml<br />         原代码如下: <br />        DBConnectionPool.java   <br />        ----------------------------------------------------------<br />      /**<br /> * 数据库连接池类<br /> */<br />package <a href="http://www.tjyj.account.db/"><font color="#000000">com.chunkyo.db</font></a>;</div><div align="left">import java.sql.Connection;<br />import java.sql.DriverManager;<br />import java.sql.SQLException;<br />import java.util.ArrayList;<br />import java.util.Iterator;<br />import java.util.Timer;</div><div align="left">/**<br /> * @author chenyanlin<br /> *<br /> */<br />public class DBConnectionPool implements TimerListener {</div><div align="left"> private Connection con=null;<br /> private int inUsed=0;    //使用的连接数<br /> private ArrayList freeConnections = new ArrayList();//容器，空闲连接<br /> private int minConn;     //最小连接数<br /> private int maxConn;     //最大连接<br /> private String name;     //连接池名字<br /> private String password; //密码<br /> private String url;      //数据库连接地址<br /> private String driver;   //驱动<br /> private String user;     //用户名<br /> public Timer timer;      //定时<br /> /**<br />  * <br />  */<br /> public DBConnectionPool() {<br />  // TODO Auto-generated constructor stub<br /> }<br /> /**<br />  * 创建连接池<br />  * @param driver<br />  * @param name<br />  * @param URL<br />  * @param user<br />  * @param password<br />  * @param maxConn<br />  */<br /> public DBConnectionPool(String name, String driver,String URL, String user, String password, int maxConn)<br /> {<br />  this.name=name;<br />  this.driver=driver;<br />  this.url=URL;<br />  this.user=user;<br />  this.password=password;<br />  this.maxConn=maxConn;<br /> }<br /> /**<br />  * 用完，释放连接<br />  * @param con<br />  */<br /> public synchronized void freeConnection(Connection con) <br /> {<br />  this.freeConnections.add(con);//添加到空闲连接的末尾<br />  this.inUsed--;<br /> }<br /> /**<br />  * timeout  根据timeout得到连接<br />  * @param timeout<br />  * @return<br />  */<br /> public synchronized Connection getConnection(long timeout)<br /> {<br />  Connection con=null;<br />  if(this.freeConnections.size()&gt;0)<br />  {<br />   con=(Connection)this.freeConnections.get(0);<br />   if(con==null)con=getConnection(timeout); //继续获得连接<br />  }<br />  else<br />  {<br />   con=newConnection(); //新建连接<br />  }<br />  if(this.maxConn==0||this.maxConn&lt;this.inUsed)<br />  {<br />   con=null;//达到最大连接数，暂时不能获得连接了。<br />  }<br />  if(con!=null)<br />  {<br />   this.inUsed++;<br />  }<br />  return con;<br /> }<br /> /**<br />  * <br />  * 从连接池里得到连接<br />  * @return<br />  */<br /> public synchronized Connection getConnection()<br /> {<br />  Connection con=null;<br />  if(this.freeConnections.size()&gt;0)<br />  {<br />   con=(Connection)this.freeConnections.get(0);<br />   this.freeConnections.remove(0);//如果连接分配出去了，就从空闲连接里删除<br />   if(con==null)con=getConnection(); //继续获得连接<br />  }<br />  else<br />  {<br />   con=newConnection(); //新建连接<br />  }<br />  if(this.maxConn==0||this.maxConn&lt;this.inUsed)<br />  {<br />   con=null;//等待 超过最大连接时<br />  }<br />  if(con!=null)<br />  {<br />   this.inUsed++;<br />   System.out.println("得到　"+this.name+"　的连接，现有"+inUsed+"个连接在使用!");<br />  }<br />  return con;<br /> }<br /> /**<br />  *释放全部连接<br />  *<br />  */<br /> public synchronized void release()<br /> {<br />  Iterator allConns=this.freeConnections.iterator();<br />  while(allConns.hasNext())<br />  {<br />   Connection con=(Connection)allConns.next();<br />   try<br />   {<br />    con.close();<br />   }<br />   catch(SQLException e)<br />   {<br />    e.printStackTrace();<br />   }<br />   <br />  }<br />  this.freeConnections.clear();<br />   <br /> }<br /> /**<br />  * 创建新连接<br />  * @return<br />  */<br /> private Connection newConnection()<br /> {<br />  try {<br />   Class.forName(driver);<br />   con=DriverManager.getConnection(url, user, password);<br />  } catch (ClassNotFoundException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />   System.out.println("sorry can't find db driver!");<br />  } catch (SQLException e1) {<br />   // TODO Auto-generated catch block<br />   e1.printStackTrace();<br />   System.out.println("sorry can't create Connection!");<br />  }<br />  return con;<br />  <br /> }<br /> /**<br />  * 定时处理函数<br />  */<br /> public synchronized void TimerEvent() <br /> {<br />     //暂时还没有实现以后会加上的<br /> }</div><div align="left"> /**<br />  * @param args<br />  */<br /> public static void main(String[] args) {<br />  // TODO Auto-generated method stub</div><div align="left"> }<br /> /**<br />  * @return the driver<br />  */<br /> public String getDriver() {<br />  return driver;<br /> }<br /> /**<br />  * @param driver the driver to set<br />  */<br /> public void setDriver(String driver) {<br />  this.driver = driver;<br /> }<br /> /**<br />  * @return the maxConn<br />  */<br /> public int getMaxConn() {<br />  return maxConn;<br /> }<br /> /**<br />  * @param maxConn the maxConn to set<br />  */<br /> public void setMaxConn(int maxConn) {<br />  this.maxConn = maxConn;<br /> }<br /> /**<br />  * @return the minConn<br />  */<br /> public int getMinConn() {<br />  return minConn;<br /> }<br /> /**<br />  * @param minConn the minConn to set<br />  */<br /> public void setMinConn(int minConn) {<br />  this.minConn = minConn;<br /> }<br /> /**<br />  * @return the name<br />  */<br /> public String getName() {<br />  return name;<br /> }<br /> /**<br />  * @param name the name to set<br />  */<br /> public void setName(String name) {<br />  this.name = name;<br /> }<br /> /**<br />  * @return the password<br />  */<br /> public String getPassword() {<br />  return password;<br /> }<br /> /**<br />  * @param password the password to set<br />  */<br /> public void setPassword(String password) {<br />  this.password = password;<br /> }<br /> /**<br />  * @return the url<br />  */<br /> public String getUrl() {<br />  return url;<br /> }<br /> /**<br />  * @param url the url to set<br />  */<br /> public void setUrl(String url) {<br />  this.url = url;<br /> }<br /> /**<br />  * @return the user<br />  */<br /> public String getUser() {<br />  return user;<br /> }<br /> /**<br />  * @param user the user to set<br />  */<br /> public void setUser(String user) {<br />  this.user = user;<br /> }</div><div align="left">}<br /><br />-------------------------------------------<br /> DBConnectionManager .java<br />------------------------------------------<br />/**<br /> * 数据库连接池管理类<br /> */<br />package <a href="http://www.tjyj.account.db/"><font color="#000000">com.chunkyo.db</font></a>;</div><div align="left">import java.sql.Connection;<br />import java.util.ArrayList;<br />import java.util.Enumeration;<br />import java.util.HashMap;<br />import java.util.Hashtable;<br />import java.util.Iterator;<br />import java.util.Properties;<br />import java.util.Vector;</div><div align="left">import <a href="http://www.tjyj.account.db.parsedsconfig/"><font color="#000000">com.chunkyo.db.ParseDSConfig</font></a>;<br />import <a href="http://www.tjyj.account.db.dsconfigbean/"><font color="#000000">com.chunkyo.db.DSConfigBean</font></a>;<br />import <a href="http://www.tjyj.account.db.dbconnectionpool/"><font color="#000000">com.chunkyo.db.DBConnectionPool</font></a>;</div><div align="left">/**<br /> * @author chenyanlin<br /> *<br /> */<br />public class DBConnectionManager {</div><div align="left"> static private DBConnectionManager instance;//唯一数据库连接池管理实例类<br /> static private int clients;                 //客户连接数<br /> private Vector drivers  = new Vector();//驱动信息<br /> private Hashtable pools=new Hashtable();//连接池<br /> <br /> /**<br />  * 实例化管理类<br />  */<br /> public DBConnectionManager() {<br />  // TODO Auto-generated constructor stub<br />  this.init();<br /> }<br /> /**<br />  * 得到唯一实例管理类<br />  * @return<br />  */<br /> static synchronized public DBConnectionManager getInstance()<br /> {<br />  if(instance==null)<br />  {<br />   instance=new DBConnectionManager();<br />  }<br />  return instance;<br />  <br /> }<br /> /**<br />  * 释放连接<br />  * @param name<br />  * @param con<br />  */<br /> public void freeConnection(String name, Connection con)<br /> {<br />  DBConnectionPool pool=(DBConnectionPool)pools.get(name);//根据关键名字得到连接池<br />  if(pool!=null)<br />  pool.freeConnection(con);//释放连接 <br /> }<br /> /**<br />  * 得到一个连接根据连接池的名字name<br />  * @param name<br />  * @return<br />  */<br /> public Connection getConnection(String name)<br /> {<br />  DBConnectionPool pool=null;<br />  Connection con=null;<br />  pool=(DBConnectionPool)pools.get(name);//从名字中获取连接池<br />  con=pool.getConnection();//从选定的连接池中获得连接<br />  if(con!=null)<br />  System.out.println("得到连接。。。");<br />  return con;<br /> }<br /> /**<br />  * 得到一个连接，根据连接池的名字和等待时间<br />  * @param name<br />  * @param time<br />  * @return<br />  */<br /> public Connection getConnection(String name, long timeout)<br /> {<br />  DBConnectionPool pool=null;<br />  Connection con=null;<br />  pool=(DBConnectionPool)pools.get(name);//从名字中获取连接池<br />  con=pool.getConnection(timeout);//从选定的连接池中获得连接<br />  System.out.println("得到连接。。。");<br />  return con;<br /> }<br /> /**<br />  * 释放所有连接<br />  */<br /> public synchronized void release()<br /> {<br />  Enumeration allpools=pools.elements();<br />  while(allpools.hasMoreElements())<br />  {<br />   DBConnectionPool pool=(DBConnectionPool)allpools.nextElement();<br />   if(pool!=null)pool.release();<br />  }<br />  pools.clear();<br /> }</div><div align="left"> /**<br />  * 创建连接池<br />  * @param props<br />  */<br /> private void createPools(DSConfigBean dsb)<br /> {<br />  DBConnectionPool dbpool=new DBConnectionPool();<br />  dbpool.setName(dsb.getName());<br />  dbpool.setDriver(dsb.getDriver());<br />  dbpool.setUrl(dsb.getUrl());<br />  dbpool.setUser(dsb.getUsername());<br />  dbpool.setPassword(dsb.getPassword());<br />  dbpool.setMaxConn(dsb.getMaxconn());<br />  System.out.println("ioio:"+dsb.getMaxconn());<br />  pools.put(dsb.getName(), dbpool);<br /> }<br /> /**<br />  * 初始化连接池的参数<br />  */<br /> private void init()<br /> {<br />  //加载驱动程序<br />  this.loadDrivers();<br />  //创建连接池<br />  Iterator alldriver=drivers.iterator();<br />  while(alldriver.hasNext())<br />  {<br />   this.createPools((DSConfigBean)alldriver.next());<br />   System.out.println("创建连接池。。。");<br />   <br />  }<br />  System.out.println("创建连接池完毕。。。");<br /> }</div><div align="left"> /**<br />  * 加载驱动程序<br />  * @param props<br />  */<br /> private void loadDrivers()<br /> {<br />  ParseDSConfig pd=new ParseDSConfig();<br /> //读取数据库配置文件<br />  drivers=pd.readConfigInfo("ds.config.xml");<br />  System.out.println("加载驱动程序。。。");<br /> }<br /> /**<br />  * @param args<br />  */<br /> public static void main(String[] args) {<br />  // TODO Auto-generated method stub</div><div align="left"> }</div><div align="left">}<br />----------------------------------------<br />DSConfigBean.java<br />----------------------------------------<br />/**<br /> * 配置文件Bean类<br /> */<br />package <a href="http://www.tjyj.account.db/"><font color="#000000">com.chunkyo.db</font></a>;</div><div align="left">/**<br /> * @author chenyanlin<br /> *<br /> */<br />public class DSConfigBean {</div><div align="left"> private String type     =""; //数据库类型<br /> private String name     =""; //连接池名字<br /> private String driver   =""; //数据库驱动<br /> private String url      =""; //数据库url<br /> private String username =""; //用户名<br /> private String password =""; //密码<br /> private int maxconn  =0; //最大连接数<br /> /**<br />  * <br />  */<br /> public DSConfigBean() {<br />  // TODO Auto-generated constructor stub<br /> }</div><div align="left"> /**<br />  * @param args<br />  */<br /> public static void main(String[] args) {<br />  // TODO Auto-generated method stub</div><div align="left"> }</div><div align="left"> /**<br />  * @return the driver<br />  */<br /> public String getDriver() {<br />  return driver;<br /> }</div><div align="left"> /**<br />  * @param driver the driver to set<br />  */<br /> public void setDriver(String driver) {<br />  this.driver = driver;<br /> }</div><div align="left"> /**<br />  * @return the maxconn<br />  */<br /> public int getMaxconn() {<br />  return maxconn;<br /> }</div><div align="left"> /**<br />  * @param maxconn the maxconn to set<br />  */<br /> public void setMaxconn(int maxconn) {<br />  this.maxconn = maxconn;<br /> }</div><div align="left"> /**<br />  * @return the name<br />  */<br /> public String getName() {<br />  return name;<br /> }</div><div align="left"> /**<br />  * @param name the name to set<br />  */<br /> public void setName(String name) {<br />  this.name = name;<br /> }</div><div align="left"> /**<br />  * @return the password<br />  */<br /> public String getPassword() {<br />  return password;<br /> }</div><div align="left"> /**<br />  * @param password the password to set<br />  */<br /> public void setPassword(String password) {<br />  this.password = password;<br /> }</div><div align="left"> /**<br />  * @return the type<br />  */<br /> public String getType() {<br />  return type;<br /> }</div><div align="left"> /**<br />  * @param type the type to set<br />  */<br /> public void setType(String type) {<br />  this.type = type;<br /> }</div><div align="left"> /**<br />  * @return the url<br />  */<br /> public String getUrl() {<br />  return url;<br /> }</div><div align="left"> /**<br />  * @param url the url to set<br />  */<br /> public void setUrl(String url) {<br />  this.url = url;<br /> }</div><div align="left"> /**<br />  * @return the username<br />  */<br /> public String getUsername() {<br />  return username;<br /> }</div><div align="left"> /**<br />  * @param username the username to set<br />  */<br /> public void setUsername(String username) {<br />  this.username = username;<br /> }</div><div align="left">}<br />-----------------------------------------------------<br />ParseDSConfig.java<br />-----------------------------------------------------<br />/**<br /> * 操作配置文件类 读  写 修改 删除等操作 <br /> */<br />package <a href="http://www.tjyj.account.db/"><font color="#000000">com.chunkyo.db</font></a>;</div><div align="left">import java.io.FileInputStream;<br />import java.io.FileNotFoundException;<br />import java.io.FileOutputStream;<br />import java.io.IOException;<br />import java.io.InputStream;<br />import java.util.List;<br />import java.util.Vector;<br />import java.util.Iterator;</div><div align="left">import org.jdom.Document;<br />import org.jdom.Element;<br />import org.jdom.JDOMException;<br />import org.jdom.input.SAXBuilder;<br />import org.jdom.output.Format;<br />import org.jdom.output.XMLOutputter;</div><div align="left">/**<br /> * @author chenyanlin<br /> *<br /> */<br />public class ParseDSConfig {</div><div align="left"> /**<br />  * 构造函数<br />  */<br /> public ParseDSConfig() {<br />  // TODO Auto-generated constructor stub<br /> }<br /> /**<br />  * 读取xml配置文件<br />  * @param path<br />  * @return<br />  */<br /> public Vector readConfigInfo(String path)<br /> {<br />  String rpath=this.getClass().getResource("").getPath().substring(1)+path;<br />  Vector dsConfig=null;<br />  FileInputStream fi = null;<br />  try<br />  {<br />   fi=new FileInputStream(rpath);//读取路径文件<br />   dsConfig=new Vector();<br />   SAXBuilder sb=new SAXBuilder();<br />   Document doc=sb.build(fi);<br />   Element root=doc.getRootElement();<br />   List pools=root.getChildren();<br />   Element pool=null;<br />   Iterator allPool=pools.iterator();<br />   while(allPool.hasNext())<br />   {<br />    pool=(Element)allPool.next();<br />    DSConfigBean dscBean=new DSConfigBean();<br />    dscBean.setType(pool.getChild("type").getText());<br />    dscBean.setName(pool.getChild("name").getText());<br />    System.out.println(dscBean.getName());<br />    dscBean.setDriver(pool.getChild("driver").getText());<br />    dscBean.setUrl(pool.getChild("url").getText());<br />    dscBean.setUsername(pool.getChild("username").getText());<br />    dscBean.setPassword(pool.getChild("password").getText());<br />    dscBean.setMaxconn(Integer.parseInt(pool.getChild("maxconn").getText()));<br />    dsConfig.add(dscBean);<br />   }<br />   <br />  } catch (FileNotFoundException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />  } catch (JDOMException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />  } catch (IOException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />  }<br />  <br />  finally<br />  {<br />   try {<br />    fi.close();<br />   } catch (IOException e) {<br />    // TODO Auto-generated catch block<br />    e.printStackTrace();<br />   }<br />  }<br />  <br />  return dsConfig;<br /> }<br /></div><div align="left">/**<br /> *修改配置文件 没时间写 过段时间再贴上去 其实一样的 <br /> */<br /> public void modifyConfigInfo(String path,DSConfigBean dsb) throws Exception<br /> {<br />  String rpath=this.getClass().getResource("").getPath().substring(1)+path;<br />  FileInputStream fi=null; //读出<br />  FileOutputStream fo=null; //写入<br />  <br /> }<br />/**<br /> *增加配置文件<br /> *<br /> */<br /> public void addConfigInfo(String path,DSConfigBean dsb) <br /> {<br />  String rpath=this.getClass().getResource("").getPath().substring(1)+path;<br />  FileInputStream fi=null;<br />  FileOutputStream fo=null;<br />  try<br />  {<br />   fi=new FileInputStream(rpath);//读取xml流<br />   <br />   SAXBuilder sb=new SAXBuilder();<br />   <br />   Document doc=sb.build(fi); //得到xml<br />   Element root=doc.getRootElement();<br />   List pools=root.getChildren();//得到xml子树<br />   <br />   Element newpool=new Element("pool"); //创建新连接池<br />   <br />   Element pooltype=new Element("type"); //设置连接池类型<br />   pooltype.setText(dsb.getType());<br />   newpool.addContent(pooltype);<br />   <br />   Element poolname=new Element("name");//设置连接池名字<br />   poolname.setText(dsb.getName());<br />   newpool.addContent(poolname);<br />   <br />   Element pooldriver=new Element("driver"); //设置连接池驱动<br />   pooldriver.addContent(dsb.getDriver());<br />   newpool.addContent(pooldriver);<br />   <br />   Element poolurl=new Element("url");//设置连接池url<br />   poolurl.setText(dsb.getUrl());<br />   newpool.addContent(poolurl);<br />   <br />   Element poolusername=new Element("username");//设置连接池用户名<br />   poolusername.setText(dsb.getUsername());<br />   newpool.addContent(poolusername);<br />   <br />   Element poolpassword=new Element("password");//设置连接池密码<br />   poolpassword.setText(dsb.getPassword());<br />   newpool.addContent(poolpassword);<br />   <br />   Element poolmaxconn=new Element("maxconn");//设置连接池最大连接<br />   poolmaxconn.setText(String.valueOf(dsb.getMaxconn()));<br />   newpool.addContent(poolmaxconn);<br />   pools.add(newpool);//将child添加到root<br />   Format format = Format.getPrettyFormat();<br />      format.setIndent("");<br />      format.setEncoding("utf-8");<br />      XMLOutputter outp = new XMLOutputter(format);<br />      fo = new FileOutputStream(rpath);<br />      outp.output(doc, fo);<br />  } catch (FileNotFoundException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />  } catch (JDOMException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />  } catch (IOException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />  }<br />  finally<br />  {<br />   <br />  }<br /> }<br /> /**<br />  *删除配置文件<br />  */<br /> public void delConfigInfo(String path,String name)<br /> {<br />  String rpath=this.getClass().getResource("").getPath().substring(1)+path;<br />  FileInputStream fi = null;<br />  FileOutputStream fo=null;<br />  try<br />  {<br />   fi=new FileInputStream(rpath);//读取路径文件<br />   SAXBuilder sb=new SAXBuilder();<br />   Document doc=sb.build(fi);<br />   Element root=doc.getRootElement();<br />   List pools=root.getChildren();<br />   Element pool=null;<br />   Iterator allPool=pools.iterator();<br />   while(allPool.hasNext())<br />   {<br />    pool=(Element)allPool.next();<br />    if(pool.getChild("name").getText().equals(name))<br />    {<br />     pools.remove(pool);<br />     break;<br />    }<br />   }<br />   Format format = Format.getPrettyFormat();<br />      format.setIndent("");<br />      format.setEncoding("utf-8");<br />      XMLOutputter outp = new XMLOutputter(format);<br />      fo = new FileOutputStream(rpath);<br />      outp.output(doc, fo);</div><div align="left">   <br />  } catch (FileNotFoundException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />  } catch (JDOMException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />  } catch (IOException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />  }<br />  <br />  finally<br />  {<br />   try {<br />    fi.close();<br />   } catch (IOException e) {<br />    // TODO Auto-generated catch block<br />    e.printStackTrace();<br />   }<br />  }<br /> }<br /> /**<br />  * @param args<br />  * @throws Exception <br />  */<br /> public static void main(String[] args) throws Exception {<br />  // TODO Auto-generated method stub</div><div align="left">  ParseDSConfig pd=new ParseDSConfig();<br />  String path="ds.config.xml";<br />  pd.readConfigInfo(path);<br />  //pd.delConfigInfo(path, "tj012006");<br />  DSConfigBean dsb=new DSConfigBean();<br />  dsb.setType("oracle");<br />  dsb.setName("yyy004");<br />  dsb.setDriver("org.oracle.jdbc");<br />  dsb.setUrl("jdbc:oracle://localhost");<br />  dsb.setUsername("sa");<br />  dsb.setPassword("");<br />  dsb.setMaxconn(1000);<br />  pd.addConfigInfo(path, dsb);<br />  pd.delConfigInfo(path, "yyy001");<br /> }</div><div align="left">}<br /><br />--------------------------------------<br />ds.config.xml   配置文件<br />--------------------------------------<br /><br /><br />&lt;ds-config&gt;<br />&lt;pool&gt;<br />&lt;type&gt;mysql&lt;/type&gt;<br />&lt;name&gt;user&lt;/name&gt;<br />&lt;driver&gt;com.mysql.jdbc.driver&lt;/driver&gt;<br />&lt;url&gt;jdbc:mysql://localhost:3306/user&lt;/url&gt;<br />&lt;username&gt;sa&lt;/username&gt;<br />&lt;password&gt;123456&lt;/password&gt;<br />&lt;maxconn&gt;100&lt;/maxconn&gt;<br />&lt;/pool&gt;<br />&lt;pool&gt;<br />&lt;type&gt;mysql&lt;/type&gt;<br />&lt;name&gt;user2&lt;/name&gt;<br />&lt;driver&gt;com.mysql.jdbc.driver&lt;/driver&gt;<br />&lt;url&gt;jdbc:mysql://localhost:3306/user2&lt;/url&gt;<br />&lt;username&gt;sa&lt;/username&gt;<br />&lt;password&gt;1234&lt;/password&gt;<br />&lt;maxconn&gt;10&lt;/maxconn&gt;<br />&lt;/pool&gt;<br />&lt;pool&gt;<br />&lt;type&gt;sql2000&lt;/type&gt;<br />&lt;name&gt;books&lt;/name&gt;<br />&lt;driver&gt;com.microsoft.sqlserver.driver&lt;/driver&gt;<br />&lt;url&gt;jdbc:sqlserver://localhost:1433/books:databasename=books&lt;/url&gt;<br />&lt;username&gt;sa&lt;/username&gt;<br />&lt;password&gt;&lt;/password&gt;<br />&lt;maxconn&gt;100&lt;/maxconn&gt;<br />&lt;/pool&gt;<br />&lt;/ds-config&gt;<br /><br /><br />3. 连接池的使用<br />  1。Connection的获得和释放<br />  DBConnectionManager   connectionMan=DBConnectionManager .getInstance();//得到唯一实例<br />   //得到连接<br />   String name="mysql";//从上下文得到你要访问的数据库的名字<br />   Connection  con=connectionMan.getConnection(name);<br />  //使用<br />  。。。。。。。<br />  // 使用完毕<br /> connectionMan.freeConnection(name,con);//释放，但并未断开连接<br /> 2。数据库连接的动态增加和连接池的动态增加<br />      1。调用xml操作增加类<br /><br />      2。重新实例华连接池管理池类<br /></div></div></div></div><img src ="http://www.blogjava.net/liaojiyong/aggbug/105715.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-03-23 09:33 <a href="http://www.blogjava.net/liaojiyong/archive/2007/03/23/105715.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>堆各栈的区别（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2006/12/22/89510.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 22 Dec 2006 06:16:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2006/12/22/89510.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/89510.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2006/12/22/89510.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/89510.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/89510.html</trackback:ping><description><![CDATA[
		<p>
				<span class="oblog_text" twffan="done">一、预备知识—程序的内存分配</span>
		</p>
		<p>一个由c/C++编译的程序占用的内存分为以下几个部分<br />1、栈区（stack）— 由编译器自动分配释放，存放函数的参数值，局部变量的值等。其操作方式类似于数据结构中的栈。<br />2、堆区（heap） — 一般由程序员分配释放，若程序员不释放，程序结束时可能由OS回收。注意它与数据结构中的堆是两回事，分配方式倒是类似于链表，呵呵。<br />3、全局区（静态区）（static）—，全局变量和静态变量的存储是放在一块的，初始化的全局变量和静态变量在一块区域，未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放<br />4、文字常量区 —常量字符串就是放在这里的。程序结束后由系统释放<br />5、程序代码区—存放函数体的二进制代码。<br />二、例子程序<br />这是一个前辈写的，非常详细<br />//main.cpp<br />int a = 0; 全局初始化区<br />char *p1; 全局未初始化区<br />main()<br />{<br />int b; 栈<br />char s[] = "abc"; 栈<br />char *p2; 栈<br />char *p3 = "123456"; 123456\0在常量区，p3在栈上。<br />static int c =0； 全局（静态）初始化区<br />p1 = (char *)malloc(10);<br />p2 = (char *)malloc(20);<br />分配得来得10和20字节的区域就在堆区。<br />strcpy(p1, "123456"); 123456\0放在常量区，编译器可能会将它与p3所指向的"123456"优化成一个地方。<br />}</p>
		<p>
				<br />二、堆和栈的理论知识</p>
		<p>2.1申请方式<br />stack:<br />由系统自动分配。 例如，声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间<br />heap:<br />需要程序员自己申请，并指明大小，在c中malloc函数<br />如p1 = (char *)malloc(10);<br />在C++中用new运算符<br />如p2 = (char *)malloc(10);<br />但是注意p1、p2本身是在栈中的。</p>
		<p>
				<br />2.2<br />申请后系统的响应<br />栈：只要栈的剩余空间大于所申请空间，系统将为程序提供内存，否则将报异常提示栈溢出。<br />堆：首先应该知道操作系统有一个记录空闲内存地址的链表，当系统收到程序的申请时，<br />会遍历该链表，寻找第一个空间大于所申请空间的堆结点，然后将该结点从空闲结点链表中删除，并将该结点的空间分配给程序，另外，对于大多数系统，会在这块内存空间中的首地址处记录本次分配的大小，这样，代码中的delete语句才能正确的释放本内存空间。另外，由于找到的堆结点的大小不一定正好等于申请的大小，系统会自动的将多余的那部分重新放入空闲链表中。</p>
		<p>2.3申请大小的限制<br />栈：在Windows下,栈是向低地址扩展的数据结构，是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的，在WINDOWS下，栈的大小是2M（也有的说是1M，总之是一个编译时就确定的常数），如果申请的空间超过栈的剩余空间时，将提示overflow。因此，能从栈获得的空间较小。<br />堆：堆是向高地址扩展的数据结构，是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的，自然是不连续的，而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见，堆获得的空间比较灵活，也比较大。</p>
		<p>
				<br />2.4申请效率的比较：<br />栈由系统自动分配，速度较快。但程序员是无法控制的。<br />堆是由new分配的内存，一般速度比较慢，而且容易产生内存碎片,不过用起来最方便.<br />另外，在WINDOWS下，最好的方式是用VirtualAlloc分配内存，他不是在堆，也不是在栈是直接在进程的地址空间中保留一快内存，虽然用起来最不方便。但是速度快，也最灵活。</p>
		<p>2.5堆和栈中的存储内容<br />栈：在函数调用时，第一个进栈的是主函数中后的下一条指令（函数调用语句的下一条可执行语句）的地址，然后是函数的各个参数，在大多数的C编译器中，参数是由右往左入栈的，然后是函数中的局部变量。注意静态变量是不入栈的。<br />当本次函数调用结束后，局部变量先出栈，然后是参数，最后栈顶指针指向最开始存的地址，也就是主函数中的下一条指令，程序由该点继续运行。<br />堆：一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。</p>
		<p>2.6存取效率的比较</p>
		<p>char s1[] = "aaaaaaaaaaaaaaa";<br />char *s2 = "bbbbbbbbbbbbbbbbb";<br />aaaaaaaaaaa是在运行时刻赋值的；<br />而bbbbbbbbbbb是在编译时就确定的；<br />但是，在以后的存取中，在栈上的数组比指针所指向的字符串(例如堆)快。<br />比如：<br />＃i nclude<br />void main()<br />{<br />char a = 1;<br />char c[] = "1234567890";<br />char *p ="1234567890";<br />a = c[1];<br />a = p[1];<br />return;<br />}<br />对应的汇编代码<br />10: a = c[1];<br />00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]<br />0040106A 88 4D FC mov byte ptr [ebp-4],cl<br />11: a = p[1];<br />0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]<br />00401070 8A 42 01 mov al,byte ptr [edx+1]<br />00401073 88 45 FC mov byte ptr [ebp-4],al<br />第一种在读取时直接就把字符串中的元素读到寄存器cl中，而第二种则要先把指针值读到edx中，在根据edx读取字符，显然慢了。</p>
		<p>
				<br />2.7小结：<br />堆和栈的区别可以用如下的比喻来看出：<br />使用栈就象我们去饭馆里吃饭，只管点菜（发出申请）、付钱、和吃（使用），吃饱了就走，不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作，他的好处是快捷，但是自由度小。<br />使用堆就象是自己动手做喜欢吃的菜肴，比较麻烦，但是比较符合自己的口味，而且自由度大</p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/89510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2006-12-22 14:16 <a href="http://www.blogjava.net/liaojiyong/archive/2006/12/22/89510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>得到PrepareStatement最终执行的sql语句的方法(转)</title><link>http://www.blogjava.net/liaojiyong/archive/2006/07/24/59842.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Mon, 24 Jul 2006 08:22:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2006/07/24/59842.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/59842.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2006/07/24/59842.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/59842.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/59842.html</trackback:ping><description><![CDATA[
		<div class="postTitle"> </div>
		<div class="postText">在CSDN的JAVA基础版,常常有人问及如何得到PreparedStatement最终执行的SQL语句;或者如何在控制台输出占位符的真实值.....<br /><br />原因就是PreparedStatement执行的sql语句有大量的占位符?....<br /><br />问题诸如JDBC中:<br /><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,0,0)">如何得到 conn.prepareStatement 最终执行的sql语句。<br />sql</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">update table1 set a=?,b=?</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"><br />stmt </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> con.prepareStatement(sql);<br />stmt.setObjec t(</span><span style="COLOR: rgb(0,0,0)">1</span><span style="COLOR: rgb(0,0,0)">,</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">a</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">);<br />stmt.setObjec t(</span><span style="COLOR: rgb(0,0,0)">2</span><span style="COLOR: rgb(0,0,0)">,</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">b</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">);<br /><br />希望可以通过stmt或者conn 得到：<br />update table1 set a</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">'</span><span style="COLOR: rgb(0,0,0)">a</span><span style="COLOR: rgb(0,0,0)">'</span><span style="COLOR: rgb(0,0,0)">,b</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">'</span><span style="COLOR: rgb(0,0,0)">b</span><span style="COLOR: rgb(0,0,0)">'</span></div><br />亦或Hibernate中<br /><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,0,0)">如我执行：find(</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">select * from t_table where id = ?</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">,</span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)"> Integer(</span><span style="COLOR: rgb(0,0,0)">5</span><span style="COLOR: rgb(0,0,0)">));<br />在控制台显示SQL时只显示：select </span><span style="COLOR: rgb(0,0,0)">*</span><span style="COLOR: rgb(0,0,0)"> from t_table where id </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">?</span><span style="COLOR: rgb(0,0,0)"><br />如何才能做到将控制台显示的占位符用其真实的值来替换？<br />即控制台输出时显示：select </span><span style="COLOR: rgb(0,0,0)">*</span><span style="COLOR: rgb(0,0,0)"> from t_table where id </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">5</span><span style="COLOR: rgb(0,0,0)"><br /></span></div><br />无它，无论JDBC还是Hiberante都不提供默认解决方案，但是参数是设置进去的，我们在设置的过程中可以有充分的理由来截取并获得自己想要的东西，类似于AOP理论。<br /><br />共享我在工程中的使用方法：<br />插入操作：<br /><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,128,0)">/**</span><span style="COLOR: rgb(0,128,0)"><br />     * 执行插入数据库的语句<br />     * </span><span style="COLOR: rgb(128,128,128)">@param</span><span style="COLOR: rgb(0,128,0)"> sql<br />     * </span><span style="COLOR: rgb(128,128,128)">@param</span><span style="COLOR: rgb(0,128,0)"> params<br />     * </span><span style="COLOR: rgb(128,128,128)">@return</span><span style="COLOR: rgb(0,128,0)"> 返回生成的主键<br />     </span><span style="COLOR: rgb(0,128,0)">*/</span><span style="COLOR: rgb(0,0,0)"><br />    </span><span style="COLOR: rgb(0,0,255)">public</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">int</span><span style="COLOR: rgb(0,0,0)"> executeInsert(String sql, Object[] params) {<br />        Connection conn </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">null</span><span style="COLOR: rgb(0,0,0)">;<br />        PreparedStatement pstmt </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">null</span><span style="COLOR: rgb(0,0,0)">;<br />        ResultSet rs </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">null</span><span style="COLOR: rgb(0,0,0)">;<br />        </span><span style="COLOR: rgb(0,0,255)">try</span><span style="COLOR: rgb(0,0,0)"> {<br />            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">1 获得连接</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">            conn </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> MyDBConnection.getInstance().getConnection();<br />            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">2 设置提交方式为程序控制</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">            conn.setAutoCommit(</span><span style="COLOR: rgb(0,0,255)">false</span><span style="COLOR: rgb(0,0,0)">);<br />            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">3 获得语句对象</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">            pstmt </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);<br />            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">4 设置SQL语句的参数</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,0,255)">if</span><span style="COLOR: rgb(0,0,0)"> (</span><span style="COLOR: rgb(0,0,255)">null</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">!=</span><span style="COLOR: rgb(0,0,0)"> params </span><span style="COLOR: rgb(0,0,0)">&amp;&amp;</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">0</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">&lt;</span><span style="COLOR: rgb(0,0,0)"> params.length) {<br />                setParams(pstmt, params);<br />            }<br />            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">5 打印SQL语句</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,0,255)">if</span><span style="COLOR: rgb(0,0,0)"> (MyDBConstants.showSQL) {<br />                getPreparedSQL(sql, params);<br />            }<br />            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">6 执行语句</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">            pstmt.executeUpdate();<br />            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">7 程序提交</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">            conn.commit();<br />            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">8 返回生成的主键</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">            rs </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> pstmt.getGeneratedKeys();<br />            </span><span style="COLOR: rgb(0,0,255)">int</span><span style="COLOR: rgb(0,0,0)"> generatedKey </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">0</span><span style="COLOR: rgb(0,0,0)">;<br />            </span><span style="COLOR: rgb(0,0,255)">if</span><span style="COLOR: rgb(0,0,0)"> (rs.next()) {<br />                generatedKey </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> rs.getInt(</span><span style="COLOR: rgb(0,0,0)">1</span><span style="COLOR: rgb(0,0,0)">);<br />            }<br />            </span><span style="COLOR: rgb(0,0,255)">if</span><span style="COLOR: rgb(0,0,0)"> (</span><span style="COLOR: rgb(0,0,0)">0</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">&lt;</span><span style="COLOR: rgb(0,0,0)"> generatedKey)<br />                </span><span style="COLOR: rgb(0,0,255)">throw</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)"> MySQLException(</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">插入记录时出错</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">);<br />            </span><span style="COLOR: rgb(0,0,255)">return</span><span style="COLOR: rgb(0,0,0)"> generatedKey;<br />        } </span><span style="COLOR: rgb(0,0,255)">catch</span><span style="COLOR: rgb(0,0,0)"> (SQLException e) {<br />            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">回滚</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">            MyDBUtil.rollBack(conn);<br />            </span><span style="COLOR: rgb(0,0,255)">throw</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)"> MySQLException(e);<br />        } </span><span style="COLOR: rgb(0,0,255)">finally</span><span style="COLOR: rgb(0,0,0)"> {<br />            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">关闭打开的操作</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">            MyDBUtil.close(conn, pstmt, rs);<br />        }<br />    }</span></div><br /><br />更新查找操作：<br /><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,128,0)">/**</span><span style="COLOR: rgb(0,128,0)"><br />     * 执行更新或者删除数据库的语句<br />     * </span><span style="COLOR: rgb(128,128,128)">@param</span><span style="COLOR: rgb(0,128,0)"> sql<br />     * </span><span style="COLOR: rgb(128,128,128)">@param</span><span style="COLOR: rgb(0,128,0)"> params<br />     * </span><span style="COLOR: rgb(128,128,128)">@return</span><span style="COLOR: rgb(0,128,0)"> 返回执行成功与否<br />     </span><span style="COLOR: rgb(0,128,0)">*/</span><span style="COLOR: rgb(0,0,0)"><br />    </span><span style="COLOR: rgb(0,0,255)">public</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">boolean</span><span style="COLOR: rgb(0,0,0)"> executeUpdateDel(String sql, Object[] params) {<br />        </span><span style="COLOR: rgb(0,0,255)">boolean</span><span style="COLOR: rgb(0,0,0)"> isSuccess </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">false</span><span style="COLOR: rgb(0,0,0)">;<br />        Connection conn </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">null</span><span style="COLOR: rgb(0,0,0)">;<br />        PreparedStatement pstmt </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">null</span><span style="COLOR: rgb(0,0,0)">;<br />        </span><span style="COLOR: rgb(0,0,255)">try</span><span style="COLOR: rgb(0,0,0)"> {<br />            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">1 获得连接</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">            conn </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> MyDBConnection.getInstance().getConnection();<br />            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">2 设置提交方式为程序控制</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">            conn.setAutoCommit(</span><span style="COLOR: rgb(0,0,255)">false</span><span style="COLOR: rgb(0,0,0)">);<br />            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">3 获得语句对象</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">            pstmt </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> conn.prepareStatement(sql);<br />            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">4 设置SQL语句的参数</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,0,255)">if</span><span style="COLOR: rgb(0,0,0)"> (</span><span style="COLOR: rgb(0,0,255)">null</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">!=</span><span style="COLOR: rgb(0,0,0)"> params </span><span style="COLOR: rgb(0,0,0)">&amp;&amp;</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">0</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">&lt;</span><span style="COLOR: rgb(0,0,0)"> params.length) {<br />                setParams(pstmt, params);<br />            }<br />            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">5 打印SQL语句</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,0,255)">if</span><span style="COLOR: rgb(0,0,0)"> (MyDBConstants.showSQL) {<br />                getPreparedSQL(sql, params);<br />            }<br />            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">6 执行语句</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">            pstmt.executeUpdate();<br />            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">7 程序提交</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">            conn.commit();<br />            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">8 设置语句执行的标记</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">            isSuccess </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">true</span><span style="COLOR: rgb(0,0,0)">;<br />        } </span><span style="COLOR: rgb(0,0,255)">catch</span><span style="COLOR: rgb(0,0,0)"> (SQLException e) {<br />            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">回滚</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">            MyDBUtil.rollBack(conn);<br />            </span><span style="COLOR: rgb(0,0,255)">throw</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)"> MySQLException(e);<br />        } </span><span style="COLOR: rgb(0,0,255)">finally</span><span style="COLOR: rgb(0,0,0)"> {<br />            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">关闭打开的操作</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">            MyDBUtil.close(conn, pstmt);<br />        }<br />        </span><span style="COLOR: rgb(0,0,255)">return</span><span style="COLOR: rgb(0,0,0)"> isSuccess;<br />    }</span></div><br />执行查询<br /><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,128,128)"> 1</span> <span style="COLOR: rgb(0,128,0)">/**</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 2</span> <span style="COLOR: rgb(0,128,0)">     * 执行查询数据库的语句;</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 9</span> <span style="COLOR: rgb(0,128,0)">     *<br /></span><span style="COLOR: rgb(0,128,128)">10</span> <span style="COLOR: rgb(0,128,0)">     * </span><span style="COLOR: rgb(128,128,128)">@return</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">11</span> <span style="COLOR: rgb(0,128,0)">     </span><span style="COLOR: rgb(0,128,0)">*/</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">12</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">public</span><span style="COLOR: rgb(0,0,0)"> Object executeQuery(String sql, Object[] params) {<br /></span><span style="COLOR: rgb(0,128,128)">13</span> <span style="COLOR: rgb(0,0,0)">        Connection conn </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">null</span><span style="COLOR: rgb(0,0,0)">;<br /></span><span style="COLOR: rgb(0,128,128)">14</span> <span style="COLOR: rgb(0,0,0)">        PreparedStatement pstmt </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">null</span><span style="COLOR: rgb(0,0,0)">;<br /></span><span style="COLOR: rgb(0,128,128)">15</span> <span style="COLOR: rgb(0,0,0)">        ResultSet rs </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">null</span><span style="COLOR: rgb(0,0,0)">;<br /></span><span style="COLOR: rgb(0,128,128)">16</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">try</span><span style="COLOR: rgb(0,0,0)"> {<br /></span><span style="COLOR: rgb(0,128,128)">17</span> <span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">1 获得连接</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">18</span> <span style="COLOR: rgb(0,128,0)"></span><span style="COLOR: rgb(0,0,0)">            conn </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> MyDBConnection.getInstance().getConnection();<br /></span><span style="COLOR: rgb(0,128,128)">19</span> <span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">2 设置提交方式为程序控制</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">20</span> <span style="COLOR: rgb(0,128,0)"></span><span style="COLOR: rgb(0,0,0)">            conn.setAutoCommit(</span><span style="COLOR: rgb(0,0,255)">false</span><span style="COLOR: rgb(0,0,0)">);<br /></span><span style="COLOR: rgb(0,128,128)">21</span> <span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">3 获得语句对象</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">22</span> <span style="COLOR: rgb(0,128,0)"></span><span style="COLOR: rgb(0,0,0)">            pstmt </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);<br /></span><span style="COLOR: rgb(0,128,128)">23</span> <span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">4 设置SQL语句的参数</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">24</span> <span style="COLOR: rgb(0,128,0)"></span><span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,0,255)">if</span><span style="COLOR: rgb(0,0,0)"> (</span><span style="COLOR: rgb(0,0,255)">null</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">!=</span><span style="COLOR: rgb(0,0,0)"> params </span><span style="COLOR: rgb(0,0,0)">&amp;&amp;</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">0</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">&lt;</span><span style="COLOR: rgb(0,0,0)"> params.length) {<br /></span><span style="COLOR: rgb(0,128,128)">25</span> <span style="COLOR: rgb(0,0,0)">                setParams(pstmt, params);<br /></span><span style="COLOR: rgb(0,128,128)">26</span> <span style="COLOR: rgb(0,0,0)">            }<br /></span><span style="COLOR: rgb(0,128,128)">27</span> <span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">5 打印SQL语句</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">28</span> <span style="COLOR: rgb(0,128,0)"></span><span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,0,255)">if</span><span style="COLOR: rgb(0,0,0)"> (MyDBConstants.showSQL) {<br /></span><span style="COLOR: rgb(0,128,128)">29</span> <span style="COLOR: rgb(0,0,0)">                getPreparedSQL(sql, params);<br /></span><span style="COLOR: rgb(0,128,128)">30</span> <span style="COLOR: rgb(0,0,0)">            }<br /></span><span style="COLOR: rgb(0,128,128)">31</span> <span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">6 执行语句</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">32</span> <span style="COLOR: rgb(0,128,0)"></span><span style="COLOR: rgb(0,0,0)">            rs </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> pstmt.executeQuery();<br /></span><span style="COLOR: rgb(0,128,128)">33</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">34</span> <span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">9 程序提交</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">35</span> <span style="COLOR: rgb(0,128,0)"></span><span style="COLOR: rgb(0,0,0)">            conn.commit();<br /></span><span style="COLOR: rgb(0,128,128)">36</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">37</span> <span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">10 获得记录</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">38</span> <span style="COLOR: rgb(0,128,0)"></span><span style="COLOR: rgb(0,0,0)">            Object vo </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)"> Object();<br /></span><span style="COLOR: rgb(0,128,128)">39</span> <span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,0,255)">if</span><span style="COLOR: rgb(0,0,0)"> (</span><span style="COLOR: rgb(0,0,255)">null</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">!=</span><span style="COLOR: rgb(0,0,0)"> rs </span><span style="COLOR: rgb(0,0,0)">&amp;&amp;</span><span style="COLOR: rgb(0,0,0)"> rs.next()) {<br /></span><span style="COLOR: rgb(0,128,128)">40</span> <span style="COLOR: rgb(0,0,0)">                vo </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> rs2vo(rs);<br /></span><span style="COLOR: rgb(0,128,128)">41</span> <span style="COLOR: rgb(0,0,0)">            }<br /></span><span style="COLOR: rgb(0,128,128)">42</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">            return results;</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">43</span> <span style="COLOR: rgb(0,128,0)"></span><span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,0,255)">return</span><span style="COLOR: rgb(0,0,0)"> vo;<br /></span><span style="COLOR: rgb(0,128,128)">44</span> <span style="COLOR: rgb(0,0,0)">        } </span><span style="COLOR: rgb(0,0,255)">catch</span><span style="COLOR: rgb(0,0,0)"> (SQLException e) {<br /></span><span style="COLOR: rgb(0,128,128)">45</span> <span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">回滚</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">46</span> <span style="COLOR: rgb(0,128,0)"></span><span style="COLOR: rgb(0,0,0)">            MyDBUtil.rollBack(conn);<br /></span><span style="COLOR: rgb(0,128,128)">47</span> <span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,0,255)">throw</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)"> MySQLException(e);<br /></span><span style="COLOR: rgb(0,128,128)">48</span> <span style="COLOR: rgb(0,0,0)">        } </span><span style="COLOR: rgb(0,0,255)">finally</span><span style="COLOR: rgb(0,0,0)"> {<br /></span><span style="COLOR: rgb(0,128,128)">49</span> <span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">关闭打开的操作</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">50</span> <span style="COLOR: rgb(0,128,0)"></span><span style="COLOR: rgb(0,0,0)">            MyDBUtil.close(conn, pstmt, rs);<br /></span><span style="COLOR: rgb(0,128,128)">51</span> <span style="COLOR: rgb(0,0,0)">        }<br /></span><span style="COLOR: rgb(0,128,128)">52</span> <span style="COLOR: rgb(0,0,0)">    }</span></div><br />看到<span style="COLOR: rgb(0,0,0)">getPreparedSQL(sql, params)了么？ 这个地方就是要实现我们预期效果的地方：<br /><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><img id="Code_Closed_Image_215212" onclick="this.style.display='none'; Code_Closed_Text_215212.style.display='none'; Code_Open_Image_215212.style.display='inline'; Code_Open_Text_215212.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_215212" style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_215212.style.display='none'; Code_Closed_Image_215212.style.display='inline'; Code_Closed_Text_215212.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_215212" style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid; BACKGROUND-COLOR: rgb(255,255,255)">得到PrepareStatement最终执行的sql语句的方法</span><span id="Code_Open_Text_215212" style="DISPLAY: none"><br /><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,128,128)"> 1</span> <span style="COLOR: rgb(0,128,0)">/**</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 2</span> <span style="COLOR: rgb(0,128,0)">     * 获得PreparedStatement向数据库提交的SQL语句<br /></span><span style="COLOR: rgb(0,128,128)"> 3</span> <span style="COLOR: rgb(0,128,0)">     * </span><span style="COLOR: rgb(128,128,128)">@param</span><span style="COLOR: rgb(0,128,0)"> sql<br /></span><span style="COLOR: rgb(0,128,128)"> 4</span> <span style="COLOR: rgb(0,128,0)">     * </span><span style="COLOR: rgb(128,128,128)">@param</span><span style="COLOR: rgb(0,128,0)"> params<br /></span><span style="COLOR: rgb(0,128,128)"> 5</span> <span style="COLOR: rgb(0,128,0)">     * </span><span style="COLOR: rgb(128,128,128)">@return</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 6</span> <span style="COLOR: rgb(0,128,0)">     </span><span style="COLOR: rgb(0,128,0)">*/</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 7</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">private</span><span style="COLOR: rgb(0,0,0)"> String getPreparedSQL(String sql, Object[] params) {<br /></span><span style="COLOR: rgb(0,128,128)"> 8</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">1 如果没有参数，说明是不是动态SQL语句</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 9</span> <span style="COLOR: rgb(0,128,0)"></span><span style="COLOR: rgb(0,0,0)">                </span><span style="COLOR: rgb(0,0,255)">int</span><span style="COLOR: rgb(0,0,0)"> paramNum </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">0</span><span style="COLOR: rgb(0,0,0)">;<br /></span><span style="COLOR: rgb(0,128,128)">10</span> <span style="COLOR: rgb(0,0,0)">                </span><span style="COLOR: rgb(0,0,255)">if</span><span style="COLOR: rgb(0,0,0)"> (</span><span style="COLOR: rgb(0,0,255)">null</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">!=</span><span style="COLOR: rgb(0,0,0)"> params)  paramNum </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> params.length;<br /></span><span style="COLOR: rgb(0,128,128)">11</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">if</span><span style="COLOR: rgb(0,0,0)"> (</span><span style="COLOR: rgb(0,0,0)">1</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">&gt;</span><span style="COLOR: rgb(0,0,0)"> paramNum) </span><span style="COLOR: rgb(0,0,255)">return</span><span style="COLOR: rgb(0,0,0)"> sql;<br /></span><span style="COLOR: rgb(0,128,128)">12</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">2 如果有参数，则是动态SQL语句</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">13</span> <span style="COLOR: rgb(0,128,0)"></span><span style="COLOR: rgb(0,0,0)">        StringBuffer returnSQL </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)"> StringBuffer();<br /></span><span style="COLOR: rgb(0,128,128)">14</span> <span style="COLOR: rgb(0,0,0)">        String[] subSQL </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> sql.split(</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">\\?</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">);<br /></span><span style="COLOR: rgb(0,128,128)">15</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">for</span><span style="COLOR: rgb(0,0,0)"> (</span><span style="COLOR: rgb(0,0,255)">int</span><span style="COLOR: rgb(0,0,0)"> i </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">0</span><span style="COLOR: rgb(0,0,0)">; i </span><span style="COLOR: rgb(0,0,0)">&lt;</span><span style="COLOR: rgb(0,0,0)"> paramNum; i</span><span style="COLOR: rgb(0,0,0)">++</span><span style="COLOR: rgb(0,0,0)">) {<br /></span><span style="COLOR: rgb(0,128,128)">16</span> <span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,0,255)">if</span><span style="COLOR: rgb(0,0,0)"> (params[i] </span><span style="COLOR: rgb(0,0,255)">instanceof</span><span style="COLOR: rgb(0,0,0)"> Date) {<br /></span><span style="COLOR: rgb(0,128,128)">17</span> <span style="COLOR: rgb(0,0,0)">                returnSQL.append(subSQL[i]).append(</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> '</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">).append(MyDateUtil.dateUtil2SQL((java.util.Date)params[i])).append(</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">' </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">);<br /></span><span style="COLOR: rgb(0,128,128)">18</span> <span style="COLOR: rgb(0,0,0)">            } </span><span style="COLOR: rgb(0,0,255)">else</span><span style="COLOR: rgb(0,0,0)"> {<br /></span><span style="COLOR: rgb(0,128,128)">19</span> <span style="COLOR: rgb(0,0,0)">                returnSQL.append(subSQL[i]).append(</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> '</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">).append(params[i]).append(</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">' </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">);<br /></span><span style="COLOR: rgb(0,128,128)">20</span> <span style="COLOR: rgb(0,0,0)">            }<br /></span><span style="COLOR: rgb(0,128,128)">21</span> <span style="COLOR: rgb(0,0,0)">        }<br /></span><span style="COLOR: rgb(0,128,128)">22</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">23</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">if</span><span style="COLOR: rgb(0,0,0)"> (subSQL.length </span><span style="COLOR: rgb(0,0,0)">&gt;</span><span style="COLOR: rgb(0,0,0)"> params.length) {<br /></span><span style="COLOR: rgb(0,128,128)">24</span> <span style="COLOR: rgb(0,0,0)">            returnSQL.append(subSQL[subSQL.length </span><span style="COLOR: rgb(0,0,0)">-</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">1</span><span style="COLOR: rgb(0,0,0)">]);<br /></span><span style="COLOR: rgb(0,128,128)">25</span> <span style="COLOR: rgb(0,0,0)">        }<br /></span><span style="COLOR: rgb(0,128,128)">26</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">return</span><span style="COLOR: rgb(0,0,0)"> returnSQL.toString();<br /></span><span style="COLOR: rgb(0,128,128)">27</span> <span style="COLOR: rgb(0,0,0)">    }<br /></span><span style="COLOR: rgb(0,128,128)">28</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">29</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,128,0)">/**</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">30</span> <span style="COLOR: rgb(0,128,0)">     * 为PreparedStatement预编译的SQL语句设置参数<br /></span><span style="COLOR: rgb(0,128,128)">31</span> <span style="COLOR: rgb(0,128,0)">     * </span><span style="COLOR: rgb(128,128,128)">@param</span><span style="COLOR: rgb(0,128,0)"> pstmt<br /></span><span style="COLOR: rgb(0,128,128)">32</span> <span style="COLOR: rgb(0,128,0)">     * </span><span style="COLOR: rgb(128,128,128)">@param</span><span style="COLOR: rgb(0,128,0)"> params<br /></span><span style="COLOR: rgb(0,128,128)">33</span> <span style="COLOR: rgb(0,128,0)">     </span><span style="COLOR: rgb(0,128,0)">*/</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">34</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">private</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">void</span><span style="COLOR: rgb(0,0,0)"> setParams(PreparedStatement pstmt, Object[] params) {<br /></span><span style="COLOR: rgb(0,128,128)">35</span> <span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,0,255)">if</span><span style="COLOR: rgb(0,0,0)"> (</span><span style="COLOR: rgb(0,0,255)">null</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">!=</span><span style="COLOR: rgb(0,0,0)"> params) {<br /></span><span style="COLOR: rgb(0,128,128)">36</span> <span style="COLOR: rgb(0,0,0)">                </span><span style="COLOR: rgb(0,0,255)">for</span><span style="COLOR: rgb(0,0,0)"> (</span><span style="COLOR: rgb(0,0,255)">int</span><span style="COLOR: rgb(0,0,0)"> i </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">0</span><span style="COLOR: rgb(0,0,0)">, paramNum </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> params.length; i </span><span style="COLOR: rgb(0,0,0)">&lt;</span><span style="COLOR: rgb(0,0,0)"> paramNum; i</span><span style="COLOR: rgb(0,0,0)">++</span><span style="COLOR: rgb(0,0,0)">) {<br /></span><span style="COLOR: rgb(0,128,128)">37</span> <span style="COLOR: rgb(0,0,0)">                    </span><span style="COLOR: rgb(0,0,255)">try</span><span style="COLOR: rgb(0,0,0)"> {<br /></span><span style="COLOR: rgb(0,128,128)">38</span> <span style="COLOR: rgb(0,0,0)">                        </span><span style="COLOR: rgb(0,0,255)">if</span><span style="COLOR: rgb(0,0,0)"> (</span><span style="COLOR: rgb(0,0,255)">null</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">!=</span><span style="COLOR: rgb(0,0,0)"> params[i] </span><span style="COLOR: rgb(0,0,0)">&amp;&amp;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">39</span> <span style="COLOR: rgb(0,0,0)">                            params[i] </span><span style="COLOR: rgb(0,0,255)">instanceof</span><span style="COLOR: rgb(0,0,0)"> java.util.Date) {<br /></span><span style="COLOR: rgb(0,128,128)">40</span> <span style="COLOR: rgb(0,0,0)">                            pstmt.setDate(i </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">1</span><span style="COLOR: rgb(0,0,0)">, MyDateUtil.dateUtil2SQL(<br /></span><span style="COLOR: rgb(0,128,128)">41</span> <span style="COLOR: rgb(0,0,0)">                                    (java.util.Date) params[i]));<br /></span><span style="COLOR: rgb(0,128,128)">42</span> <span style="COLOR: rgb(0,0,0)">                        } </span><span style="COLOR: rgb(0,0,255)">else</span><span style="COLOR: rgb(0,0,0)"> {<br /></span><span style="COLOR: rgb(0,128,128)">43</span> <span style="COLOR: rgb(0,0,0)">                            pstmt.setObject(i </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">1</span><span style="COLOR: rgb(0,0,0)">, params[i]);<br /></span><span style="COLOR: rgb(0,128,128)">44</span> <span style="COLOR: rgb(0,0,0)">                        }<br /></span><span style="COLOR: rgb(0,128,128)">45</span> <span style="COLOR: rgb(0,0,0)">                    } </span><span style="COLOR: rgb(0,0,255)">catch</span><span style="COLOR: rgb(0,0,0)"> (SQLException e) {<br /></span><span style="COLOR: rgb(0,128,128)">46</span> <span style="COLOR: rgb(0,0,0)">                        </span><span style="COLOR: rgb(0,0,255)">throw</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)"> MySQLException(e);<br /></span><span style="COLOR: rgb(0,128,128)">47</span> <span style="COLOR: rgb(0,0,0)">                    }<br /></span><span style="COLOR: rgb(0,128,128)">48</span> <span style="COLOR: rgb(0,0,0)">                }<br /></span><span style="COLOR: rgb(0,128,128)">49</span> <span style="COLOR: rgb(0,0,0)">            }<br /></span><span style="COLOR: rgb(0,128,128)">50</span> <span style="COLOR: rgb(0,0,0)">    }</span></span></div><br />然后轻松核实你的控制台或者日志文件吧......<br /></span></div>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/59842.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2006-07-24 16:22 <a href="http://www.blogjava.net/liaojiyong/archive/2006/07/24/59842.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用数据库JDBC连接写法（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2006/07/24/59829.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Mon, 24 Jul 2006 07:49:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2006/07/24/59829.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/59829.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2006/07/24/59829.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/59829.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/59829.html</trackback:ping><description><![CDATA[
		<h1 class="block_title">
				<a id="viewpost1_TitleUrl" href="/airdream/archive/2006/06/24/54834.html">
				</a> </h1>
		<div class="post">
				<div class="postcontent">为了方便大家查找，整理内容如下：<br />1. MySQL(http://www.mysql.com)mm.mysql-2.0.2-bin.jar<br />Class.forName( "org.gjt.mm.mysql.Driver" );<br />cn = DriverManager.getConnection( "jdbc:mysql://MyDbComputerNameOrIP:3306/myDatabaseName", sUsr, sPwd ); 
<p>2. PostgreSQL(http://www.de.postgresql.org)pgjdbc2.jar<br />Class.forName( "org.postgresql.Driver" );<br />cn = DriverManager.getConnection( "jdbc:postgresql://MyDbComputerNameOrIP/myDatabaseName", sUsr, sPwd ); </p><p>3. Oracle(http://www.oracle.com/ip/deploy/database/oracle9i/)classes12.zip<br />Class.forName( "oracle.jdbc.driver.OracleDriver" );<br />cn = DriverManager.getConnection( "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd );<br />4. Sybase(http://jtds.sourceforge.net)jconn2.jar </p><p>Class.forName( "com.sybase.jdbc2.jdbc.SybDriver" );<br />cn = DriverManager.getConnection( "jdbc:sybase:Tds:MyDbComputerNameOrIP:2638", sUsr, sPwd );<br />//(Default-Username/Password: "dba"/"sql") </p><p>5. Microsoft SQLServer(http://jtds.sourceforge.net)<br />Class.forName( "net.sourceforge.jtds.jdbc.Driver" );<br />cn = DriverManager.getConnection( "jdbc:jtds:sqlserver://MyDbComputerNameOrIP:1433/master", sUsr, sPwd ); </p><p>6. Microsoft SQLServer(http://www.microsoft.com)<br />Class.forName( "com.microsoft.jdbc.sqlserver.SQLServerDriver" );<br />cn = DriverManager.getConnection( "jdbc:microsoft:sqlserver://MyDbComputerNameOrIP:1433;databaseName=master", sUsr, sPwd ); </p><p>7. ODBC<br />Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );<br />Connection cn = DriverManager.getConnection( "jdbc:odbc:" + sDsn, sUsr, sPwd ); </p><p>8.DB2(新添加)<br />Class.forName("com.ibm.db2.jdbc.net.DB2Driver");<br />String url="jdbc:db2://192.9.200.108:6789/SAMPLE"<br />cn = DriverManager.getConnection( url, sUsr, sPwd ); </p><p>9.Microsoft SQL Server series (6.5, 7.x and 2000) and Sybase 10 </p><p>JDBC Name: jTDS<br />URL: http://jtds.sourceforge.net/<br />Version: 0.5.1<br />Download URL: http://sourceforge.net/project/showfiles.php?group_id=33291 </p><p>语法:<br />Class.forName("net.sourceforge.jtds.jdbc.Driver ");<br />Connection con = DriverManager.getConnection("jdbc:jtds:sqlserver://host:port/database","user","password");<br />or<br />Connection con = DriverManager.getConnection("jdbc:jtds:sybase://host:port/database","user","password"); </p><p>10.Postgresql<br />JDBC Name: PostgreSQL JDBC<br />URL: http://jdbc.postgresql.org/<br />Version: 7.3.3 build 110<br />Download URL: http://jdbc.postgresql.org/download.html<br />语法:<br />Class.forName("org.postgresql.Driver"); <br />Connection con=DriverManager.getConnection("jdbc:postgresql://host:port/database","user","password"); </p><p>11.IBM AS400主机在用的JDBC语法<br />有装V4R4以上版本的Client Access Express<br />可以在C:\Program Files\IBM\Client Access\jt400\lib<br />找到 driver 档案 jt400.zip，并更改扩展名成为 jt400.jar<br />语法:<br />java.sql.DriverManager.registerDriver (new com.ibm.as400.access.AS400JDBCDriver ());<br />Class.forName("com.ibm.as400.access.AS400JDBCConnection");<br />con = DriverManager.getConnection("jdbc:as400://IP","user","password"); </p><p>12.informix<br />Class.forName("com.informix.jdbc.IfxDriver").newInstance(); <br />String url = <br />"jdbc:informix-sqli://123.45.67.89:1533/testDB:INFORMIXSERVER=myserver; <br />user=testuser;password=testpassword";<br />Lib：jdbcdrv.zip<br /><br />Class.forName( "com.sybase.jdbc.SybDriver" )<br />url="jdbc:sybase:Tds:127.0.0.1:2638/asademo";<br />SybConnection connection= (SybConnection)DriverManager.getConnection(url,"dba","sql"); </p><p>13.SAP DB<br />Class.forName ("com.sap.dbtech.jdbc.DriverSapDB");<br />java.sql.Connection connection = java.sql.DriverManager.getConnection ( "jdbc:sapdb://" + host + "/" + database_name,user_name, password) </p><p>14.InterBase<br />String url = "jdbc:interbase://localhost/e:/testbed/database/employee.gdb";<br />Class.forName("interbase.interclient.Driver");<br />//Driver d = new interbase.interclient.Driver (); /* this will also work if you do not want the line above */<br />Connection conn = DriverManager.getConnection( url, "sysdba", "masterkey" ); </p><p>15.HSqlDB<br />url: http://hsqldb.sourceforge.net/<br />driver: org.hsqldb.jdbcDriver<br />连接方式有4种，分别为：<br />con-str（内存）: jdbc:hsqldb.<br />con-str（本地）: jdbc:hsqldb:/path/to/the/db/dir<br />con-str（http）: jdbc:hsqldb:http://dbsrv<br />con-str（hsql）: jdbc:hsqldb:hsql://dbsrv</p></div>
		</div>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/59829.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2006-07-24 15:49 <a href="http://www.blogjava.net/liaojiyong/archive/2006/07/24/59829.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关系数据库设计理论－－&gt;3NF</title><link>http://www.blogjava.net/liaojiyong/archive/2006/05/23/47597.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Tue, 23 May 2006 02:44:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2006/05/23/47597.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/47597.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2006/05/23/47597.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/47597.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/47597.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 函数依赖								1.函数依赖定义								A－&gt; B，即  				“				A函数决定B				”										  ，A称为决定因素。 								2．关系的键码、超键码 								属性函数决定关系R的所有其它属性，并且该属性的任何真子集都不能函数决定R的所有其它属性，则属性是键码。 键码必须...&nbsp;&nbsp;<a href='http://www.blogjava.net/liaojiyong/archive/2006/05/23/47597.html'>阅读全文</a><img src ="http://www.blogjava.net/liaojiyong/aggbug/47597.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2006-05-23 10:44 <a href="http://www.blogjava.net/liaojiyong/archive/2006/05/23/47597.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>