﻿<?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-拼搏的人生-文章分类-DataBase</title><link>http://www.blogjava.net/DuYang/category/10759.html</link><description>拼搏在繁华的都市</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 16:17:24 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 16:17:24 GMT</pubDate><ttl>60</ttl><item><title>Database Acessing:JDBC</title><link>http://www.blogjava.net/DuYang/articles/44581.html</link><dc:creator>Dalston.Young</dc:creator><author>Dalston.Young</author><pubDate>Fri, 05 May 2006 00:03:00 GMT</pubDate><guid>http://www.blogjava.net/DuYang/articles/44581.html</guid><wfw:comment>http://www.blogjava.net/DuYang/comments/44581.html</wfw:comment><comments>http://www.blogjava.net/DuYang/articles/44581.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/DuYang/comments/commentRss/44581.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/DuYang/services/trackbacks/44581.html</trackback:ping><description><![CDATA[   <font color="#0000ff">DataBase Accessing:JDBC</font><br />      把以前学习的东西写出来，以便在以后的学习和工作中可以用到！这里我主要是把自己关于数据库学习的一些东西给写出来。<br />      JDBC提供一套访问关系数据库的标准库。通过JDBC API，我们可以使用完全相同的Java语法访问各式各样的SQL数据库。正式来将JDBC不是一个首字母的缩写词，因此，它不代表任何事情。”Java Database Connectivity”通常是该名称的完整形式。<br />通常查询数据库可以用7个标准步骤来说明：<br /><font color="#0000ff">(1).载入JDBC驱动程序<br /></font>如果要载入驱动程序，只需要在Class.forName方法中指定数据库驱动类名。这样做就自动创建驱动程序的实例，并注册到JDBC驱动程序管理器。(注:ForName方法返回给定名称的类的对象，调用该对象相当于调用Class.forName)<br /><font color="#0000ff">(2)定义连接URL(connection URL)</font><br />在JDBC中，连接URL指定服务器的主机名，端口以及希望与之建立连接的数据库名<br /><font color="#0000ff">(3)建立连接</font><br />有了连接URL，用户名和密码，就可以建立到数据库的网络连接。连接建立之后，就可以执行数据库的查询，直到连接为止<br /><font color="#0000ff">(4)创建Statement对象<br /></font>创建Statement才能向数据库发送查询和命令<br /><font color="#0000ff">(5)执行查询或更新</font><br />有了Statement对象后，就可以用execute,executeQuery,executeUpdate或executeBatch方法发送SQL语句到数据库<br /><font color="#0000ff">(6)结果处理</font><br />数据库执行查询完毕之后，返回一个ResultSet。ResultSet表示一系列的行和列，可以调用next和各种getXXX方法对这些行和列进行处理。<br /><font color="#0000ff">(7)关闭连接</font><br />这点比较重要，一定要记得关闭连接，释放与数据库的资源。这样可以提高效率。 
<p><font color="#0000ff">装载JDBC驱动程序</font><br />因为在装载JDBC驱动程序用的是显示的Class.forName所以一定要写在try{}catch{}块中。由于可能会发生ClassNotFoundException所以应当捕获这个异常. Example:<br />Try<br />{<br />Class.forName(“connect.microsoft.MicrosoftDriver”);<br />Class.forName(“oracle.jdbc.driver.OracleDriver”);<br />Class.forName(“com.sybase.jdbc.SybDriver”);<br />}<br />Catch(ClassNotFoundException e)<br />{<br /> out.println(e.getMessage());<br />}<br />我们在部署的时候应当注意是把JDBC的驱动程序JAR文件部署到install_dir/common/lib也可以部署到WEB-INF/lib目录中。<br />建立连接<br />在建立实际连接的时候，需要将URL，数据库名字和用户名都传给DriverManager类的getConnection方法，由于getConnection有可能会产生异常因此我们应该把这些代码写在try{}catch{}中. Eg:<br />String URL=”jdbc:oracle:thin:@”+host+”:”+port+”:”+dbName;<br />String UID=”Database user name”;<br />String PWD=”Database password”;<br />Try<br />{<br />Conection con=DriverManager.getConnection(URL,UID,PWD);<br />}<br />Catch(SQLException e)<br />{<br />  e.getMessage();<br />}<br />Conection类还包括其他的一些用法！如下：<br />prepareStatement<br />创建预编译查询，提交给数据库<br />prepareCall<br />访问数据库中的存储过程。<br />Rollbach/commit<br />控制事务管理<br />Close<br />关闭连接<br />isClosed<br />确定连接是否超时或被显示关闭<br />建立连接过程，一个可选部分是使用getDataMeta方法查找数据库的相关信息，这个方法返回DatabaseMetaData对象，该对象拥有相应的方法，可以得出数据库自身的名称和版本(getDatabaseProductName,getDatabaseProductVersion),或者 JDBC驱动程序的名称和版本(getDriverName,getDrvierVersion).例如：<br />DatabaseMetaData dbMetaData=connection.getDataMeta();<br />String productName=<br />dbMetaDate.getDatabaseProductName();<br />System.out.println(“Database:”+productName);<br />String produtcVersion=<br />   dbMetaDate.getDatabseProductVersion();<br />System.out.println(“Version:”+productVersion);<br /><font color="#0000ff">创建Statement对象</font><br />Statement对象用来向数据库发送查询和命令。它由Conection的createStatement()方法创建:<br />Statement stmt=connection.createStatement();<br />执行查询或更新<br />有了Statement对象后，就可以用它的executeQuery方法发送SQL查询，executeQuery返回ResultSet类型对象。Eg:<br />String sql=”select * from emp”;<br />ResultSet rs=stmt.execute Query(sql);<br />Statement的其他的用法:<br />executeQuery<br />执行SQL查询并在ResultSet中返回数据.ResultSet可能为空，但不会为NULL。<br />executeUpdate<br />用于UPDATE，INSERT或DELETE命令。返回受影响的行数，可以为0，它还提供对DDL(Data Definition Language)命令的支持,例如CREATE TABLE，DROP TABLE和ALTER TABLE。<br />executeBatch<br />将一组命令作为一个单元执行，返回一个数组，其中存储每个计数的更新计数。addBatch可以向批量执行的命令中添加命令。<br />setQueryTimeout<br />指定驱动程序在抛出SQLException异常之前，等待处理结果的时间。<br />getMaxRows/setMaxRows<br />确定ResultSet可容纳的最大行数。超过的行将会在不给出任何警告的情况下丢弃。默认值为0，表示没有限制。<br /><font color="#0000ff">结果处理</font><br />结果处理最简单的方式就是用ResultSet的Next方法在表中移动，每次一行。(注:ResultSet中行的第一列索引为1，而非0).建议在访问 ResultSet的列时不要使用索引，而使用列名。使用这种方式在表的结构发生改变时，与ResultSet交互的代码不容易出错误。<br />ResultSet的一些方法集:<br />Next/previous<br />将ResultSet中的游标分别移动到下一行。<br />Relative/absolute<br />Relative方法将游标相应的地移动特定数目行，或正或负（向前或向后）。Absolute方法将游标移动到指定的行号。如果绝对值是负数，那么游标将相对于ResultSet的结尾进行定位(JDBC2.0)。<br />getXxx<br />返回Xxx Java类型（参见java.sql.Types）的值,这个值来自于列名或索引指定的列。如果列的值为SQL的NULL值，那么则返回0或NULL。<br />wasNull<br />检查上面的getXxx读到的是否为SQL的NULL值。如果列的类型为基本类型(int,float等),且数据库中的值为0，那么这项检查就很重要。由于数据库的NULL返回0，所以0和数据库的NULL不能区分开来。如果列的类型为对象(String,Date等)，可以简单的将返回值与NULL比较。<br />findColumn<br />返回ResultSet中与指定列名对应的索引。<br />getRow<br />返回当前的行号，第一行从1开始。<br />getMetaData<br />返回描述ResultSet的ResultSetMetaData对象。ResultSetMetaData给出列的数目和名称。<br />getMetaData方法尤为有用。仅仅有ResultSet的情况下我们必须知道列的名称，数目和类型才能正确的对表进行处理。ResultSetMetaData的方法集：<br />getColumnCount<br />返回ResultSet中列的数目。<br />getColumnName<br />返回列在数据库中的名称.<br />getColumnType<br />返回列的SQL类型，对应于java.sql.Types中的项。<br />isReadOnly<br />表示数据是否为只读。<br />isSerachable<br />表明给列是否可以用在WHERE字句中。<br />isNullable<br />表明该列是否可以存储NULL。<br />(注J: ResultSet和ResultSetMetaData没有直接提供方法返回查询所返回的行数，然而，在JDBC2.0中，可以用last将游标定位于ResultSet最后一行，然后调用getRow获取当前的行号。)<br />关闭连接<br />显示的关闭连接:<br />connection.close();</p><p>可以参考以下以下的例子:</p><pre><font class="java-reserved_word"><strong>import</strong></font> java.sql.*;
<font class="java-reserved_word"><strong>import</strong></font> java.io.*;
<font class="java-comment">/**
 * &lt;p&gt;Title: JDBC连接数据库&lt;/p&gt;
 * &lt;p&gt;Description: 本实例演示如何使用JDBC连接Oracle数据库，并演示添加数据和查询数据。&lt;/p&gt;
 */</font><font class="java-reserved_word"><strong>public</strong></font><font class="java-reserved_word"><strong>class</strong></font> JDBCConn<font class="java-bracket">{</font><font class="java-reserved_word"><strong>private</strong></font>  String url=<font class="java-string">""</font>;<font class="java-comment">//数据库连接字符串</font><font class="java-reserved_word"><strong>private</strong></font>  String username=<font class="java-string">""</font>;<font class="java-comment">//数据库用户名</font><font class="java-reserved_word"><strong>private</strong></font>  String password=<font class="java-string">""</font>;<font class="java-comment">//数据库密码</font>
 
<font class="java-comment">/**
 *&lt;br&gt;方法说明：获得数据连接
 *&lt;br&gt;输入参数：
 *&lt;br&gt;返回类型：Connection 连接对象
 */</font><font class="java-reserved_word"><strong>public</strong></font> Connection conn()<font class="java-bracket">{</font><font class="java-reserved_word"><strong>try</strong></font><font class="java-bracket">{</font>
       <font class="java-comment">//第一步：加载JDBC驱动</font>
        Class.forName(<font class="java-string">"oracle.jdbc.driver.OracleDriver"</font>);
        <font class="java-comment">//第二步：创建数据库连接</font>
        Connection con =DriverManager.getConnection(url, username, password);
        <font class="java-reserved_word"><strong>return</strong></font> con;
    <font class="java-bracket">}</font><font class="java-reserved_word"><strong>catch</strong></font>(ClassNotFoundException cnf)<font class="java-bracket">{</font>
      System.out.println(<font class="java-string">"driver not find:"</font>+cnf);
      <font class="java-reserved_word"><strong>return</strong></font><font class="java-reserved_word"><strong>null</strong></font>;
    <font class="java-bracket">}</font><font class="java-reserved_word"><strong>catch</strong></font>(SQLException sqle)<font class="java-bracket">{</font>
      System.out.println(<font class="java-string">"can't connection db:"</font>+sqle);
      <font class="java-reserved_word"><strong>return</strong></font><font class="java-reserved_word"><strong>null</strong></font>;
    <font class="java-bracket">}</font>
  <font class="java-reserved_word"><strong>catch</strong></font> (Exception e) <font class="java-bracket">{</font>
        System.out.println(<font class="java-string">"Failed to load JDBC/ODBC driver."</font>);
        <font class="java-reserved_word"><strong>return</strong></font><font class="java-reserved_word"><strong>null</strong></font>;
     <font class="java-bracket">}</font><font class="java-bracket">}</font><font class="java-comment">/**
 *&lt;br&gt;方法说明：执行查询SQL语句
 *&lt;br&gt;输入参数：Connection con 数据库连接
 *&lt;br&gt;输入参数：String sql 要执行的SQL语句
 *&lt;br&gt;返回类型：void
 */</font><font class="java-reserved_word"><strong>public</strong></font><font class="java-reserved_word"><strong>void</strong></font> query(Connection con, String sql)<font class="java-bracket">{</font><font class="java-reserved_word"><strong>try</strong></font><font class="java-bracket">{</font><font class="java-reserved_word"><strong>if</strong></font>(con==<font class="java-reserved_word"><strong>null</strong></font>)<font class="java-bracket">{</font><font class="java-reserved_word"><strong>throw</strong></font><font class="java-reserved_word"><strong>new</strong></font> Exception(<font class="java-string">"database connection can't use!"</font>);
     <font class="java-bracket">}</font><font class="java-reserved_word"><strong>if</strong></font>(sql==<font class="java-reserved_word"><strong>null</strong></font>) <font class="java-reserved_word"><strong>throw</strong></font><font class="java-reserved_word"><strong>new</strong></font> Exception(<font class="java-string">"check your parameter: 'sql'! don't input null!"</font>);
   <font class="java-comment">//第三步：获取Staetment对象</font>
     Statement stmt = con.createStatement();
   <font class="java-comment">//第四步：执行数据库操作（查询操作）</font>
     ResultSet rs = stmt.executeQuery(sql);
   <font class="java-comment">//第五步：处理结果集</font>
   ResultSetMetaData rmeta = rs.getMetaData();
      <font class="java-comment">//获得数据字段个数</font><font class="java-reserved_word"><strong>int</strong></font> numColumns = rmeta.getColumnCount();
     <font class="java-reserved_word"><strong>while</strong></font>(rs.next())
   <font class="java-bracket">{</font>
     <font class="java-reserved_word"><strong>for</strong></font>(<font class="java-reserved_word"><strong>int</strong></font> i = 0;i&lt; numColumns;i++)
     <font class="java-bracket">{</font>
    String sTemp = rs.getString(i+1);
    System.out.print(sTemp+<font class="java-string">"  "</font>);
     <font class="java-bracket">}</font>
    System.out.println(<font class="java-string">""</font>);
   <font class="java-bracket">}</font><font class="java-bracket">}</font><font class="java-reserved_word"><strong>catch</strong></font>(Exception e)<font class="java-bracket">{</font>
      System.out.println(<font class="java-string">"query error:"</font>+e);
    <font class="java-bracket">}</font><font class="java-bracket">}</font><font class="java-comment">/**
 *&lt;br&gt;方法说明：执行插入、更新、删除等没有返回结果集的SQL语句
 *&lt;br&gt;输入参数：Connection con 数据库连接
 *&lt;br&gt;输入参数：String sql 要执行的SQL语句
 *&lt;br&gt;返回类型：void
 */</font><font class="java-reserved_word"><strong>public</strong></font><font class="java-reserved_word"><strong>void</strong></font> execute(Connection con, String sql)<font class="java-bracket">{</font><font class="java-reserved_word"><strong>try</strong></font><font class="java-bracket">{</font><font class="java-reserved_word"><strong>if</strong></font>(con==<font class="java-reserved_word"><strong>null</strong></font>) <font class="java-reserved_word"><strong>return</strong></font>;
    <font class="java-comment">//第三步：获取Statement对象</font>
    Statement stmt = con.createStatement();
    <font class="java-comment">//第四步：执行数据库操作（更新操作）</font>
    stmt.executeUpdate(sql);
    System.out.println(<font class="java-string">"update executed successly"</font>);
    <font class="java-bracket">}</font><font class="java-reserved_word"><strong>catch</strong></font>(Exception e)<font class="java-bracket">{</font>
      System.out.println(<font class="java-string">"execute error: sql = "</font>+sql);
      System.out.println(e);
    <font class="java-bracket">}</font><font class="java-comment">//end try catch</font><font class="java-bracket">}</font><font class="java-comment">//end execute</font><font class="java-comment">/**
 *&lt;br&gt;方法说明：实例演示
 *&lt;br&gt;输入参数：无
 *&lt;br&gt;返回类型：void
 */</font><font class="java-reserved_word"><strong>public</strong></font><font class="java-reserved_word"><strong>void</strong></font> demo()<font class="java-bracket">{</font>
    String sSQL=<font class="java-string">""</font>;
    BufferedReader stdin=<font class="java-reserved_word"><strong>new</strong></font> BufferedReader(<font class="java-reserved_word"><strong>new</strong></font>  InputStreamReader(System.in));
    <font class="java-reserved_word"><strong>try</strong></font><font class="java-bracket">{</font>
      System.out.println(<font class="java-string">"please input update SQL string"</font>);
      sSQL=stdin.readLine();<font class="java-comment">//获取命令行输入（更新字符串）</font>
      Connection conn = conn();<font class="java-comment">//执行自定义连接方法（获取数据库连接对象）</font>
      execute(conn,sSQL);<font class="java-comment">//执行自定义更新方法</font>
      String sql = <font class="java-string">"select * from TBL_USER"</font>;
      query(conn,sql);<font class="java-comment">//执行自定义查询方法（查询并处理结果集）</font><font class="java-comment">//第六步：关闭数据库连接</font>
      conn.close();
    <font class="java-bracket">}</font><font class="java-reserved_word"><strong>catch</strong></font>(SQLException se)<font class="java-bracket">{</font>
      System.out.println(se);
    <font class="java-bracket">}</font><font class="java-reserved_word"><strong>catch</strong></font>(Exception e)<font class="java-bracket">{</font>
      System.out.println(e);
    <font class="java-bracket">}</font>
 
  <font class="java-bracket">}</font><font class="java-comment">/**
 *&lt;br&gt;方法说明：主方法
 *&lt;br&gt;输入参数：String[] args 命令行参数（包括：数据库连接URL，
 *&lt;br&gt;用户名，密码）
 *&lt;br&gt;返回类型：void
 */</font><font class="java-reserved_word"><strong>public</strong></font><font class="java-reserved_word"><strong>static</strong></font><font class="java-reserved_word"><strong>void</strong></font> main(String[] arg)<font class="java-bracket">{</font><font class="java-reserved_word"><strong>if</strong></font>(arg.length!=3)<font class="java-bracket">{</font>
      System.out.println(<font class="java-string">"use: java JDBCConn url username password"</font>);
      <font class="java-reserved_word"><strong>return</strong></font>;
    <font class="java-bracket">}</font>
    JDBCConn oc = <font class="java-reserved_word"><strong>new</strong></font> JDBCConn();
    oc.url = arg[0];
    oc.username=arg[1];
    oc.password=arg[2];
    oc.demo();
  <font class="java-bracket">}</font><font class="java-bracket">}</font></pre><img src ="http://www.blogjava.net/DuYang/aggbug/44581.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/DuYang/" target="_blank">Dalston.Young</a> 2006-05-05 08:03 <a href="http://www.blogjava.net/DuYang/articles/44581.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 数据源和连接池</title><link>http://www.blogjava.net/DuYang/articles/44580.html</link><dc:creator>Dalston.Young</dc:creator><author>Dalston.Young</author><pubDate>Fri, 05 May 2006 00:02:00 GMT</pubDate><guid>http://www.blogjava.net/DuYang/articles/44580.html</guid><wfw:comment>http://www.blogjava.net/DuYang/comments/44580.html</wfw:comment><comments>http://www.blogjava.net/DuYang/articles/44580.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/DuYang/comments/commentRss/44580.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/DuYang/services/trackbacks/44580.html</trackback:ping><description><![CDATA[
		<p>数据库连接池的解决方案是在应用程序启动时建立足够的数据库连接，并将这些连接组成一个连接池，由应用程序动态的对池中的连接进行申请，使用和释放。</p>
		<p>  JDBC 3.0规范中提供了一个支持数据库连接池的框架，这个框架仅仅规定了如何支持连接池的实现，而连接池的具体实现JDBC 3.0规范并没有做相关的规定。</p>
		<p>  JDBC 3.0规范定义了如下的类和接口来支持数据库连接池的实现。</p>
		<p> ● javax.sql.ConnectionEvent: 连接事件</p>
		<p> ● javax.sql.ConnectionPoolDataSource: 连接池数据源</p>
		<p>● javax.sql.PooledConnection: 被池化的连接</p>
		<p>●javax.sql.ConnectionEventListener: 连接事件监听接口</p>
		<p>   DataSource接口代表了数据源，它一般由数据库驱动厂商实现。通过这个接口来获得一个连接，它的主要方法如下:</p>
		<p> ★ getConnection(): 获得一个Connection物件</p>
		<p>★ getConnection(String username,String password): 获得一个Connection物件</p>
		<p>★getLongWriter(): 从DataSource获得Long Writer对象，它是Print Writer的实现</p>
		<p>★setLogWriter(PrintWriter out):设置DataSource的LogWriter</p>
		<p>★setLoginTime():获得DataSource尝试连接数据库的最大时间</p>
		<p>★setLoginTimeout(int seconds): 设置DataSource尝试连接数据的最大时间</p>
		<p>如下是在Tomcat 5中配置数据源:</p>
		<p>   在Tomcat的%Tomcat_Home%/conf/server.xml里的&lt;/Context&gt;&lt;/Host&gt;前增加如下的描述:</p>
		<p>&lt;Context path="/MyRoot" docBase="MyRoot" debug="0"<br />                reloadable="true" crossContext="true"&gt;<br />                &lt;Resource name="jdbc/bn" auth="Container" type="javax.sql.DataSource"/&gt;<br />                &lt;ResourceParams name="jdbc/bn"&gt;<br />                &lt;parameter&gt; <br />                   &lt;name&gt;factory&lt;/name&gt;<br />                   &lt;value&gt;org.apache.commons.dbcp.BasicDataSourceFactory&lt;/value&gt;<br />                &lt;/parameter&gt;<br />                &lt;parameter&gt;<br />                   &lt;name&gt;username&lt;/name&gt;<br />                   &lt;value&gt;bn&lt;/value&gt;<br />                &lt;/parameter&gt;<br />                &lt;parameter&gt;<br />                   &lt;name&gt;password&lt;/name&gt;<br />                   &lt;value&gt;bn&lt;/value&gt;<br />                &lt;/parameter&gt;<br />                &lt;parameter&gt;<br />                   &lt;name&gt;maxActive&lt;/name&gt;<br />                   &lt;value&gt;20&lt;/value&gt;<br />                &lt;/parameter&gt;<br />                &lt;parameter&gt;<br />                   &lt;name&gt;maxIdle&lt;/name&gt;<br />                   &lt;value&gt;10&lt;/value&gt;<br />                &lt;/parameter&gt;<br />                &lt;parameter&gt;<br />                   &lt;name&gt;maxWait&lt;/name&gt;<br />                   &lt;value&gt;-1&lt;/value&gt;<br />                &lt;/parameter&gt;<br />                &lt;/ResourceParams&gt;<br />&lt;/Context&gt;</p>
<img src ="http://www.blogjava.net/DuYang/aggbug/44580.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/DuYang/" target="_blank">Dalston.Young</a> 2006-05-05 08:02 <a href="http://www.blogjava.net/DuYang/articles/44580.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>