??xml version="1.0" encoding="utf-8" standalone="yes"?>91在线高清,久久中文字幕一区二区三区,九九九九九精品http://www.aygfsteel.com/kobe09/category/12167.html爪吐奕奕征?/description>zh-cnWed, 28 Feb 2007 04:17:38 GMTWed, 28 Feb 2007 04:17:38 GMT60XML配置文g的读取处?http://www.aygfsteel.com/kobe09/archive/2006/06/14/52754.html氧气中毒氧气中毒Wed, 14 Jun 2006 07:17:00 GMThttp://www.aygfsteel.com/kobe09/archive/2006/06/14/52754.htmlhttp://www.aygfsteel.com/kobe09/comments/52754.htmlhttp://www.aygfsteel.com/kobe09/archive/2006/06/14/52754.html#Feedback0http://www.aygfsteel.com/kobe09/comments/commentRss/52754.htmlhttp://www.aygfsteel.com/kobe09/services/trackbacks/52754.html阅读全文

氧气中毒 2006-06-14 15:17 发表评论
]]>
javaq接Access数据库的代码 http://www.aygfsteel.com/kobe09/archive/2006/06/14/52746.html氧气中毒氧气中毒Wed, 14 Jun 2006 07:10:00 GMThttp://www.aygfsteel.com/kobe09/archive/2006/06/14/52746.htmlhttp://www.aygfsteel.com/kobe09/comments/52746.htmlhttp://www.aygfsteel.com/kobe09/archive/2006/06/14/52746.html#Feedback0http://www.aygfsteel.com/kobe09/comments/commentRss/52746.htmlhttp://www.aygfsteel.com/kobe09/services/trackbacks/52746.html闲来无事Q整理了一下java代码。算做个复习W记了?/div>
 
import  java.sql. * ;
public   class  dbaccess {
 
public   static   void  main(String args[])  throws  Exception {
  Class.forName(
" sun.jdbc.odbc.JdbcOdbcDriver " );
  String dburl 
= " jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=Mobile.mdb " ; // 此ؓNO-DSN方式
  
// String dburl ="jdbc:odbc:odbcName"; // 此ؓODBCq接方式
  Connection conn = DriverManager.getConnection(dburl);
  Statement stmt
= conn.createStatement();
  ResultSet rs
= stmt.executeQuery( " select Top 20 * from MobileSection " );
  System.out.println(
" h\t地区\tcd\t省䆾\t区号 " );
  
while (rs.next()) {
   System.out.println(rs.getString(
1 ) + " \t " + rs.getString( 2 ) + " \t " + rs.getString( 3 ) + " \t " + rs.getString( 4 ) + " \t " + rs.getString( 5 ));
  }

  rs.close();
  stmt.close();
  conn.close();
 }

}
 
q行l果Q?/div>
---------- Run Java ----------
h 地区 cd 省䆾 区号
1300566 茂名 q东联?30卡 广东?668
1300567 茂名 q东联?07卡 广东?668
1300568 茂名 q东联?07卡 广东?668
1300569 珠v q东联?30卡 广东?756
1300570 惠州 q东联?30卡 广东?752
1300571 惠州 q东联?30卡 广东?752
1300572 惠州 q东联?30卡 广东?752
1300573 惠州 q东联?30卡 广东?752
1300574 惠州 q东联?30卡 广东?752
1300575 惠州 q东联?30卡 广东?752
1300576 珠v q东联?30卡 广东?756
1300577 珠v q东联?30卡 广东?756
1300578 珠v q东联?30卡 广东?756
1300579 珠v q东联?30卡 广东?756


氧气中毒 2006-06-14 15:10 发表评论
]]>JDBCq接数据库经验技巧集?http://www.aygfsteel.com/kobe09/archive/2006/06/14/52744.html氧气中毒氧气中毒Wed, 14 Jun 2006 07:08:00 GMThttp://www.aygfsteel.com/kobe09/archive/2006/06/14/52744.htmlhttp://www.aygfsteel.com/kobe09/comments/52744.htmlhttp://www.aygfsteel.com/kobe09/archive/2006/06/14/52744.html#Feedback0http://www.aygfsteel.com/kobe09/comments/commentRss/52744.htmlhttp://www.aygfsteel.com/kobe09/services/trackbacks/52744.html
  一、连接各U数据库方式速查?/b>

  下面|列了各U数据库使用JDBCq接的方式,可以作ؓ一个手册用?

  1、Oracle8/8i/9i数据库(thin模式Q?

Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl为数据库的SID
String user="test";
String password="test";
Connection conn= DriverManager.getConnection(url,user,password);

  2、DB2数据?

Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance();
String url="jdbc:db2://localhost:5000/sample"; //sampleZ的数据库?
String user="admin";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);

  3、Sql Server7.0/2000数据?

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb";
//mydb为数据库
String user="sa";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);

  4、Sybase数据?

Class.forName("com.sybase.jdbc.SybDriver").newInstance();
String url =" jdbc:sybase:Tds:localhost:5007/myDB";//myDBZ的数据库?
Properties sysProps = System.getProperties();
SysProps.put("user","userid");
SysProps.put("password","user_password");
Connection conn= DriverManager.getConnection(url, SysProps);

  5、Informix数据?

Class.forName("com.informix.jdbc.IfxDriver").newInstance();
String url = "jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;
user=testuser;password=testpassword"; //myDB为数据库?
Connection conn= DriverManager.getConnection(url);

  6、MySQL数据?

Class.forName("org.gjt.mm.mysql.Driver").newInstance();
String url ="jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1"
//myDB为数据库?
Connection conn= DriverManager.getConnection(url);

  7、PostgreSQL数据?

Class.forName("org.postgresql.Driver").newInstance();
String url ="jdbc:postgresql://localhost/myDB" //myDB为数据库?
String user="myuser";
String password="mypassword";
Connection conn= DriverManager.getConnection(url,user,password);

  8、access数据库直q用ODBC?br />
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ;
String url="jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ="+application.getRealPath("/Data/ReportDemo.mdb");
Connection conn = DriverManager.getConnection(url,"","");
Statement stmtNew=conn.createStatement() ;

  二、JDBCq接MySql方式

  下面是用JDBCq接MySql的一个小的教E?

  1、查N动程?br />
  MySQL目前提供的java驱动E序为Connection/JQ可以从MySQL官方|站下蝲Qƈ扑ֈmysql-connector-java-3.0.15-ga-bin.jar文gQ此驱动E序为纯java驱动E序Q不需做其他配|?br />
  2、动态指定classpath

  如果需要执行时动态指定classpathQ就在执行时采用Qcp方式。否则将上面?jar文g加入到classpath环境变量中?br />
  3、加载驱动程?br />
try{
 Class.forName(com.mysql.jdbc.Driver);
 System.out.println(Success loading Mysql Driver!);
}catch(Exception e)
{
 System.out.println(Error loading Mysql Driver!);
 e.printStackTrace();
}

  4、设|连接的url

jdbcQmysqlQ?/localhost/databasename[?pa=va][Qpa=va]

  三、以下列Z在用JDBC来连接Oracle数据库时可以使用的一些技?/b>

  1、在客户端Y件开发中使用Thin驱动E序

  在开发Java软g斚wQOracle的数据库提供了四U类型的驱动E序Q二U用于应用Y件、applets、servlets{客L软gQ另外二U用于数据库中的Java存储q程{服务器端Y件。在客户机端软g的开发中Q我们可以选择OCI驱动E序或Thin驱动E序。OCI驱动E序利用Java本地化接口(JNIQ,通过Oracle客户端Y件与数据库进行通讯。Thin驱动E序是纯Java驱动E序Q它直接与数据库q行通讯。ؓ了获得最高的性能QOracle在客L软g的开发中使用OCI驱动E序Q这g是正的。但我徏议用Thin驱动E序Q因为通过多次试发现Q在通常情况下,Thin驱动E序的性能都超q了OCI驱动E序?br />
  2、关闭自动提交功能,提高pȝ性能

  在第一ơ徏立与数据库的q接Ӟ在缺省情况下Q连接是在自动提交模式下的。ؓ了获得更好的性能Q可以通过调用带布值false参数的ConnectioncȝsetAutoCommit()Ҏ关闭自动提交功能Q如下所C:

  conn.setAutoCommit(false);

  值得注意的是Q一旦关闭了自动提交功能Q我们就需要通过调用Connectioncȝcommit()和rollback()Ҏ来h工的方式对事务进行管理?br />
  3、在动态SQL或有旉限制的命令中使用Statement对象

  在执行SQL命oӞ我们有二U选择Q可以用PreparedStatement对象Q也可以使用Statement对象。无论多次C用同一个SQL命oQPreparedStatement都只对它解析和编译一ơ。当使用Statement对象Ӟ每次执行一个SQL命oӞ都会对它q行解析和编译。这可能会你认为,使用PreparedStatement对象比用Statement对象的速度更快。然而,我进行的试表明Q在客户端Y件中Q情况ƈ非如此。因此,在有旉限制的SQL操作中,除非成批地处理SQL命oQ我们应当考虑使用Statement对象?br />
  此外Q用Statement对象也得编写动态SQL命o更加单,因ؓ我们可以字W串q接在一P建立一个有效的SQL命o。因此,我认为,Statement对象可以使动态SQL命o的创建和执行变得更加单?br />
  4、利用helper函数对动态SQL命oq行格式?br />
  在创Z用Statement对象执行的动态SQL命oӞ我们需要处理一些格式化斚w的问题。例如,如果我们惛_Z个将名字O'Reilly插入表中的SQL命oQ则必须使用二个相连的?'”号替换O'Reilly中的?”号。完成这些工作的最好的Ҏ是创Z个完成替换操作的helperҎQ然后在q接字符串心服用公式表达一个SQL命oӞ使用创徏的helperҎ。与此类似的是,我们可以让helperҎ接受一个Date型的|然后让它输出ZOracle的to_date()函数的字W串表达式?br />
  5、利用PreparedStatement对象提高数据库的M效率

  在用PreparedStatement对象执行SQL命oӞ命o被数据库q行解析和编译,然后被放到命令缓冲区。然后,每当执行同一个PreparedStatement对象Ӟ它就会被再解析一ơ,但不会被再次~译。在~冲Z可以发现预编译的命oQƈ且可以重C用。在有大量用L企业U应用Y件中Q经怼重复执行相同的SQL命oQ用PreparedStatement对象带来的编译次数的减少能够提高数据库的M性能。如果不是在客户端创建、预备、执行PreparedStatementd需要的旉长于StatementdQ我会徏议在除动态SQL命o之外的所有情况下使用PreparedStatement对象?br />
  6、在成批处理重复的插入或更新操作中用PreparedStatement对象

  如果成批地处理插入和更新操作Q就能够显著地减它们所需要的旉。Oracle提供的Statement?CallableStatementq不真正地支持批处理Q只有PreparedStatement对象才真正地支持批处理。我们可以用addBatch()和executeBatch()Ҏ选择标准的JDBC批处理,或者通过利用PreparedStatement对象的setExecuteBatch()Ҏ和标准的executeUpdate()Ҏ选择速度更快的Oracle专有的方法。要使用Oracle专有的批处理机制Q可以以如下所C的方式调用setExecuteBatch()Q?br />
PreparedStatement pstmt3D null;
try {
 ((OraclePreparedStatement)pstmt).setExecuteBatch(30);
 ...
 pstmt.executeUpdate();
}

  调用setExecuteBatch()时指定的值是一个上限,当达到该值时Q就会自动地引发SQL命o执行Q标准的executeUpdate()Ҏ׃被作为批处理送到数据库中。我们可以通过调用PreparedStatementcȝsendBatch()Ҏ随时传输批处理Q务?br />
  7、用Oracle locatorҎ插入、更新大对象QLOBQ?br />
  Oracle的PreparedStatementcM完全支持BLOB和CLOB{大对象的处理,其是Thin驱动E序不支持利用PreparedStatement对象的setObject()和setBinaryStream()Ҏ讄BLOB的|也不支持利用setCharacterStream()Ҏ讄CLOB的倹{只有locator本n中的Ҏ才能够从数据库中获取LOBcd的倹{可以用PreparedStatement对象插入或更新LOBQ但需要用locator才能获取LOB的倹{由于存在这二个问题Q因此,我徏议用locator的方法来插入、更新或获取LOB的倹{?br />
  8、用SQL92语法调用存储q程

  在调用存储过E时Q我们可以用SQL92或Oracle PL/SQLQ由于用Oracle PL/SQLq没有什么实际的好处Q而且会给以后l护你的应用E序的开发h员带来麻烦,因此Q我在调用存储过E时使用SQL92?br />
  9、用Object SQL对象模式{Ud数据库中

  既然可以Oracle的数据库作ؓ一U面向对象的数据库来使用Q就可以考虑应用程序中的面向对象模式{到数据库中。目前的Ҏ是创建Java bean作ؓ伪装的数据库对象Q将它们的属性映到关系表中Q然后在q些bean中添加方法。尽这样作在Java中没有什么问题,但由于操作都是在数据库之外进行的Q因此其他访问数据库的应用Y件无法利用对象模式。如果利用Oracle的面向对象的技术,可以通过创徏一个新的数据库对象cd在数据库中模仿其数据和操作,然后使用JPublisher{工L成自qJava beancR如果用这U方式,不但Java应用E序可以使用应用软g的对象模式,其他需要共享你的应用中的数据和操作的应用Y件也可以使用应用软g中的对象模式?br />
  10、利用SQL完成数据库内的操?br />
  我要向大家介l的最重要的经验是充分利用SQL的面向集合的Ҏ来解x据库处理需求,而不是用Java{过E化的编E语a?br />
  如果~程人员要在一个表中查找许多行Q结果中的每个行都会查找其他表中的数据,最后,~程人员创徏了独立的UPDATE命o来成批地更新W一个表中的数据。与此类似的d可以通过在set子句中用多列子查询而在一个UPDATE命o中完成。当能够在单一的SQL命o中完成Q务,何必要让数据在网上流来流ȝQ我用户认真学习如何最大限度地发挥SQL的功能?/span>

氧气中毒 2006-06-14 15:08 发表评论
]]>
在JAVA中连接Oracle数据?例子) http://www.aygfsteel.com/kobe09/archive/2006/06/14/52735.html氧气中毒氧气中毒Wed, 14 Jun 2006 07:03:00 GMThttp://www.aygfsteel.com/kobe09/archive/2006/06/14/52735.htmlhttp://www.aygfsteel.com/kobe09/comments/52735.htmlhttp://www.aygfsteel.com/kobe09/archive/2006/06/14/52735.html#Feedback0http://www.aygfsteel.com/kobe09/comments/commentRss/52735.htmlhttp://www.aygfsteel.com/kobe09/services/trackbacks/52735.html /*
 * 创徏日期 2006-6-13
 *
 * javaq接oracle数据?br /> 
*/

package  person.fane.test;

import  java.sql. * ;
/**
 * A JDBC test application for Oracle
 * 
@author  Fane
 * 
@version  1.0.0
 * 
@since  JDK1.4
 
*/

public   class  OracleTest  {
    
private   final  String oracleDriverName  =   " oracle.jdbc.driver.OracleDriver " ;
    
    
// 以下使用的Test是Oracle里的表空?/span>
     private   final  String oracleUrlToConnect  = " jdbc:oracle:thin:@192.168.0.36:1521:Test "
    
private  Connection myConnection  =   null ;
    
/**
     * To load the jdbc driver
     * 
     
*/

    
public  OracleTest()
    
{
        
try
        
{
            Class.forName(oracleDriverName);
        }
catch (ClassNotFoundException ex)
        
{
            System.out.println(getErrorMessage(ex,
" The Driver loaded error,please contact to your Software Designer! " ).toString());
        }

    }

    
    
public  StringBuffer getErrorMessage(Exception ex,String alarmMessage)
    
{
        StringBuffer errorStringBuffer 
=   new  StringBuffer();
        errorStringBuffer.append(alarmMessage);
        errorStringBuffer.append(ex.getMessage());
        
return  errorStringBuffer;
    }

    
    
/**
     * getConnection method 
     * 
@return  Connection
     
*/

    
public  Connection getConnection()
    
{
        
try
        
{
            
this .myConnection  =  DriverManager.getConnection(oracleUrlToConnect, " Fane " , " 201 " );
            
        }
catch (Exception ex)
        
{
            System.out.println(getErrorMessage(ex,
" Can not get connection,please contact to your Software Designer! " ).toString());
        }

        
        
return   this .myConnection;
        
    }

    
    
/**
     * 
@param  args
     
*/

    
public   static   void  main(String[] args)  {
        OracleTest myOracleTest 
=   new  OracleTest();
        
try
        
{
            Connection myConnection 
=  myOracleTest.getConnection();

            System.out.println(
" Now begin to excute. " );
        
            PreparedStatement myPreparedStatement 
=  myConnection.prepareStatement( " select area_id, area_name,ip_address,tel,area_type,pc_id from c_area_info " );
            
// myPreparedStatement.setInt(1,2);
            ResultSet myResultSet  =  myPreparedStatement.executeQuery();
            StringBuffer myStringBuffer 
=   new  StringBuffer();
            
            
while (myResultSet.next())
            
{
                
                myStringBuffer.append(myResultSet.getInt(
" area_id " ) + "    " );
                myStringBuffer.append(myResultSet.getString(
" area_name " ) + "    " );
                myStringBuffer.append(myResultSet.getString(
" ip_address " ) + "    " );
                myStringBuffer.append(myResultSet.getString(
" tel " ) + "    " );
                myStringBuffer.append(myResultSet.getInt(
" area_type " ) + "    " );
                myStringBuffer.append(myResultSet.getInt(
" pc_id " ) + " \n " );
            }

            System.out.println(myStringBuffer.toString());
            
// System.out.println(new String(myStringBuffer.toString().getBytes("ISO-8859-1"),"GBK"));
        }
catch (Exception ex)
        
{
            System.out.println(myOracleTest.getErrorMessage(ex,
" Application error,please contact to your Software Designer! " ).toString());
        }


    }


}


氧气中毒 2006-06-14 15:03 发表评论
]]>
用SQL语句创徏存储q程http://www.aygfsteel.com/kobe09/archive/2006/06/14/52734.html氧气中毒氧气中毒Wed, 14 Jun 2006 07:01:00 GMThttp://www.aygfsteel.com/kobe09/archive/2006/06/14/52734.htmlhttp://www.aygfsteel.com/kobe09/comments/52734.htmlhttp://www.aygfsteel.com/kobe09/archive/2006/06/14/52734.html#Feedback0http://www.aygfsteel.com/kobe09/comments/commentRss/52734.htmlhttp://www.aygfsteel.com/kobe09/services/trackbacks/52734.html

create procedure SHOW_SUPPLIERS
as
select SUPPLIERS.SUP_NAME, COFFEES.COF_NAME
from SUPPLIERS, COFFEES
where SUPPLIERS.SUP_ID = COFFEES.SUP_ID
order by SUP_NAME

下面的代码将SQL语句攑ֈ一个字W串中,然后赋给变量createProcedure以备后用Q?/p>

String createProcedure = "create procedure SHOW_SUPPLIERS " +
			 "as " +
			 "select SUPPLIERS.SUP_NAME, COFFEES.COF_NAME " +
			 "from SUPPLIERS, COFFEES " +
			 "where SUPPLIERS.SUP_ID = COFFEES.SUP_ID " +
			 "order by SUP_NAME";

下面的代码段使用Connection对象con来创建Statement对象Q用于把创徏存储q程的SQL语句发送给数据库:

Statement stmt = con.createStatement();
stmt.executeUpdate(createProcedure);

存储q程SHOW_SUPPLIERS作Z个可调用的数据库对象在数据库中编译ƈ存储Q调用时像调用其他Ҏ一栗?

从JDBC调用存储q程

JDBC允许在用Java~写的程序中调用存储q程。第一步是创徏一个CallableStatement对象。就像Statement和PreparedStatement对象一P利用一个打开的Connection对象卛_完成创徏。CallableStatement对象包含了存储过E的一个调用;但它不包含存储过E本w。下面的W一行代码用连接con创徏了存储过ESHOW_SUPPLIERS的一个调用。花括号内的那部分就是存储过E的转义语法。当驱动E序到“{call SHOW_SUPPLIERS}”时Q它把q个转义语法转换成数据库使用的本地SQLQ以调用名ؓSHOW_SUPPLIERS的存储过E?


CallableStatement cs = con.prepareCall("{call SHOW_SUPPLIERS}");
ResultSet rs = cs.executeQuery();

执行后结果集rs的内容如下:

SUP_NAME			COF_NAME
----------------		-----------------------
Acme, Inc.			Colombian
Acme, Inc.			Colombian_Decaf
Superior Coffee			French_Roast
Superior Coffee			French_Roast_Decaf
The High Ground			Espresso

注意Q用于执行cs的方法是executeQueryQ因为cs调用的存储过E包含一个查询,执行后生一个结果集。如果存储过E包含一条更新或一条DLL语句Q那p使用executeUpdateҎ。但有时一个存储过E包含多条SQL语句Q因而它产生的不只是一个结果集、不只是一个更新计数或产生一些结果集和更新计数的l合。这样就有多个结果集Q这时就应该使用executeҎ来执行CallableStatement?

CallableStatementcLPreparedStatement的子c,因此CallableStatement对象可与PreparedStatement对象一样带有输入参数。此外,CallableStatement对象q可带输出参数或输入/输出参数。INOUT参数和executeҎ很少使用。要获取更详l信息,请参考“用Javaq行JDBC数据库访问”?/p>

氧气中毒 2006-06-14 15:01 发表评论
]]>
通过JDBCq接Oracle数据库的十大技?/title><link>http://www.aygfsteel.com/kobe09/archive/2006/06/14/52731.html</link><dc:creator>氧气中毒</dc:creator><author>氧气中毒</author><pubDate>Wed, 14 Jun 2006 07:00:00 GMT</pubDate><guid>http://www.aygfsteel.com/kobe09/archive/2006/06/14/52731.html</guid><wfw:comment>http://www.aygfsteel.com/kobe09/comments/52731.html</wfw:comment><comments>http://www.aygfsteel.com/kobe09/archive/2006/06/14/52731.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/kobe09/comments/commentRss/52731.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/kobe09/services/trackbacks/52731.html</trackback:ping><description><![CDATA[Java数据库连接(JDBCQAPI是一pd能够让Java~程人员讉K数据库的接口Q各个开发商的接口ƈ不完全相同。在使用多年的Oracle公司的JDBC后,我积累了许多技巧,q些技巧能够我们更好地发挥系l的性能?span id="tech_art_center"><!-- Copyright 1999-2000 ThruPort Technologies http://www.thruport.com --><!-- end dynamic banner insert --></span>实现更多的功能?br /><br />1、在客户端Y件开发中使用Thin驱动E序<br /><br />在开发Java软g斚wQOracle的数据库提供了四U类型的驱动E序Q二U用于应用Y件、applets、servlets{客L软gQ另外二U用于数据库中的Java存储q程{服务器端Y件。在客户机端软g的开发中Q我们可以选择OCI驱动E序或Thin驱动E序?br /><br />OCI驱动E序利用Java本地化接口(JNIQ,通过Oracle客户端Y件与数据库进行通讯。Thin驱动E序是纯Java驱动E序Q它直接与数据库q行通讯。ؓ了获得最高的性能QOracle在客L软g的开发中使用OCI驱动E序Q这g是正的?br /><br />但我使用Thin驱动E序Q因为通过多次试发现Q在通常情况下,Thin驱动E序的性能都超q了OCI驱动E序?br /><br />2、关闭自动提交功能,提高pȝ性能<br /><br />在第一ơ徏立与数据库的q接Ӟ在缺省情况下Q连接是在自动提交模式下的。ؓ了获得更好的性能Q可以通过调用带布值false参数的ConnectioncȝsetAutoCommit()Ҏ关闭自动提交功能Q如下所C:<br /><br /><center><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6"><pre><ccid_code>conn.setAutoCommit(false);</ccid_code></pre></td></tr></tbody></table></ccid_nobr></center><br /><br />值得注意的是Q一旦关闭了自动提交功能Q我们就需要通过调用Connectioncȝcommit()和rollback()Ҏ来h工的方式对事务进行管理?3、在动态SQL或有旉限制的命令中使用Statement对象 在执行SQL命oӞ我们有二U选择Q可以用PreparedStatement对象Q也可以使用Statement对象。无论多次C用同一个SQL命oQPreparedStatement都只对它解析和编译一ơ。当使用Statement对象Ӟ每次执行一个SQL命oӞ都会对它q行解析和编译?<br /><br />q可能会使你认ؓQ用PreparedStatement对象比用Statement对象的速度更快。然而,我进行的试表明Q在客户端Y件中Q情况ƈ非如此。因此,在有旉限制的SQL操作中,除非成批地处理SQL命oQ我们应当考虑使用Statement对象?此外Q用Statement对象也得编写动态SQL命o更加单,因ؓ我们可以字W串q接在一P建立一个有效的SQL命o。因此,我认为,Statement对象可以使动态SQL命o的创建和执行变得更加单?<br /><br />4、利用helper函数对动态SQL命oq行格式?在创Z用Statement对象执行的动态SQL命oӞ我们需要处理一些格式化斚w的问题。例如,如果我们惛_Z个将名字O'Reilly插入表中的SQL命oQ则必须使用二个相连的?'”号替换O'Reilly中的?”号?<br /><br />完成q些工作的最好的Ҏ是创Z个完成替换操作的helperҎQ然后在q接字符串心服用公式表达一个SQL命oӞ使用创徏的helperҎ。与此类似的是,我们可以让helperҎ接受一个Date型的|然后让它输出ZOracle的to_date()函数的字W串表达式?5、利用PreparedStatement对象提高数据库的M效率 在用PreparedStatement对象执行SQL命oӞ命o被数据库q行解析和编译,然后被放到命令缓冲区。然后,每当执行同一个PreparedStatement对象Ӟ它就会被再解析一ơ,但不会被再次~译?<br /><br />在缓冲区中可以发现预~译的命令,q且可以重新使用。在有大量用L企业U应用Y件中Q经怼重复执行相同的SQL命oQ用PreparedStatement对象带来的编译次数的减少能够提高数据库的M性能?<br /><br />如果不是在客L创徏、预备、执行PreparedStatementd需要的旉长于StatementdQ我会徏议在除动态SQL命o之外的所有情况下使用PreparedStatement对象?<br /><br />6、在成批处理重复的插入或更新操作中用PreparedStatement对象 如果成批地处理插入和更新操作Q就能够显著地减它们所需要的旉。Oracle提供的Statement和CallableStatementq不真正地支持批处理Q只有PreparedStatement对象才真正地支持批处理?<br /><br />我们可以使用addBatch()和executeBatch()Ҏ选择标准的JDBC批处理,或者通过利用PreparedStatement对象的setExecuteBatch()Ҏ和标准的executeUpdate()Ҏ选择速度更快的Oracle专有的方法?<br /><br />要用Oracle专有的批处理机制Q可以以如下所C的方式调用setExecuteBatch()Q?<br /><br /><center><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6"><pre><ccid_code>PreparedStatement pstmt3D null; try { ((OraclePreparedStatement) pstmt).setExecuteBatch(30); ... pstmt.executeUpdate(); }</ccid_code></pre></td></tr></tbody></table></ccid_nobr></center><br /><br />调用setExecuteBatch()时指定的值是一个上限,当达到该值时Q就会自动地引发SQL命o执行Q标准的executeUpdate()Ҏ׃被作为批处理送到数据库中。我们可以通过调用PreparedStatementcȝsendBatch()Ҏ随时传输批处理Q务?<br /><br />7、用Oracle locatorҎ插入、更新大对象QLOBQ?Oracle的PreparedStatementcM完全支持BLOB和CLOB{大对象的处理,其是Thin驱动E序不支持利用PreparedStatement对象的setObject()和setBinaryStream()Ҏ讄BLOB的|也不支持利用setCharacterStream()Ҏ讄CLOB的倹{?<br /><br />只有locator本n中的Ҏ才能够从数据库中获取LOBcd的倹{可以用PreparedStatement对象插入或更新LOBQ但需要用locator才能获取LOB的倹{由于存在这二个问题Q因此,我徏议用locator的方法来插入、更新或获取LOB的倹{?8、用SQL92语法调用存储q程 <br /><br />在调用存储过E时Q我们可以用SQL92或Oracle PL/SQLQ由于用Oracle PL/SQLq没有什么实际的好处Q而且会给以后l护你的应用E序的开发h员带来麻烦,因此Q我在调用存储过E时使用SQL92?<br /><br />9、用Object SQL对象模式{Ud数据库中 既然可以Oracle的数据库作ؓ一U面向对象的数据库来使用Q就可以考虑应用程序中的面向对象模式{到数据库中?<br /><br />目前的方法是创徏Java bean作ؓ伪装的数据库对象Q将它们的属性映到关系表中Q然后在q些bean中添加方法。尽这样作在Java中没有什么问题,但由于操作都是在数据库之外进行的Q因此其他访问数据库的应用Y件无法利用对象模式?<br /><br />如果利用Oracle的面向对象的技术,可以通过创徏一个新的数据库对象cd在数据库中模仿其数据和操作,然后使用JPublisher{工L成自qJava beancR?<br /><br />如果使用q种方式Q不但Java应用E序可以使用应用软g的对象模式,其他需要共享你的应用中的数据和操作的应用Y件也可以使用应用软g中的对象模式?10、利用SQL完成数据库内的操?我要向大家介l的最重要的经验是充分利用SQL的面向集合的Ҏ来解x据库处理需求,而不是用Java{过E化的编E语a?如果~程人员要在一个表中查找许多行Q结果中的每个行都会查找其他表中的数据,最后,~程人员创徏了独立的UPDATE命o来成批地更新W一个表中的数据。与此类似的d可以通过在set子句中用多列子查询而在一个UPDATE命o中完成?<br /><br />当能够在单一的SQL命o中完成Q务,何必要让数据在网上流来流ȝQ我用户认真学习如何最大限度地发挥SQL的功能?img src ="http://www.aygfsteel.com/kobe09/aggbug/52731.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/kobe09/" target="_blank">氧气中毒</a> 2006-06-14 15:00 <a href="http://www.aygfsteel.com/kobe09/archive/2006/06/14/52731.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Java~写oracle存储q程http://www.aygfsteel.com/kobe09/archive/2006/06/14/52732.html氧气中毒氧气中毒Wed, 14 Jun 2006 07:00:00 GMThttp://www.aygfsteel.com/kobe09/archive/2006/06/14/52732.htmlhttp://www.aygfsteel.com/kobe09/comments/52732.htmlhttp://www.aygfsteel.com/kobe09/archive/2006/06/14/52732.html#Feedback0http://www.aygfsteel.com/kobe09/comments/commentRss/52732.htmlhttp://www.aygfsteel.com/kobe09/services/trackbacks/52732.html
    好消息说完了Q现在是坏消息:׃pl/sql是过E化的语aQ它基本上不具备多态的概念Q供oracle使用的javaҎ必须x为staticQ所以在oracle中你无法使用java的动态特性,比如接口、反等。不q这q不妨碍你用java做爱做的事?br />
    我们以一个简单的hello worldZQ我想Q何一个有l验的javaE序员都能够通过q个例子Q派生出其他希奇古怪的应用Q有好的创意记得要与我共享,我的msn?a href="mailto:chenzhihuang@yahoo.com.cn">chenzhihuang@yahoo.com.cn

    首先是创Z个javac,你可以用jbuilder/eclipse来编写,也可以直接在oracle的控制台里面创徏。前者不多说Q看看后一U方式?br />
    启动sql plusQ执行如下命令:

  1. create or replace and compile java source named "hello_sp" as
  2. /**
  3.  *创徏oracle存储q程的javac?/font>
  4.  *@author zhchen
  5. **/
  6. package org.bromon.oracle;
  7. public class Hello
  8. {
  9.   public static String say(String name)
  10.   {
  11.     return "你好,"+name;
  12.   }
  13. }

Java以创建?br />
然后在oracle中把q个cd入成Z个函敎ͼ执行命oQ?br />
  1. create or replace function hello_sp(name varchar2) return varchar2
  2. as language java name 
  3. 'org.bromon.oracle.Hello.say(java.lang.Stringreturn java.lang.String';


函数已创?br />
现在可以调用该函敎ͼ执行Q?br />
  1. select hello('zhchen') from dual;


q回l果Q你?zhchen

有一个需要注意的问题是,假如我们的javaҎ是没有参数的Q比如:
  1. public static String say()
  2.   {
  3.     return "你好?
  4.   }

那么在创建函数的时候,函数名不应该有扩Phello_sp
否则会报告函数有~译错误?br />
如果你的javacL在IDE里面~写的,那么只需要在oracle中加载编译过的class文g卛_Q方法是Q?br />
启动enterprise manage consoleQ在“方案”下扑ֈ“源cd”,叛_”javacZ,选择”加载java“,选择对应的class文g卛_?br />

氧气中毒 2006-06-14 15:00 发表评论
]]>
վ֩ģ壺 | | | ˮ| | | | ƽ| | ޻| | ƽ| | | | | ѧ| з| ɽ| | ʳ| Һ| Ȫ| | | ɿ| ޼| ͨ| ϳ| ˰| ǿ| ղ| | ˮ| ζ| ˼| | ϳ| | | |