装蝲JDBC驱动E序
因ؓ在装载JDBC驱动E序用的是显C的Class.forName所以一定要写在try{}catch{}块中。由于可能会发生ClassNotFoundException所以应当捕莯个异? Example:
Try
{
Class.forName(“connect.microsoft.MicrosoftDriver?;
Class.forName(“oracle.jdbc.driver.OracleDriver?;
Class.forName(“com.sybase.jdbc.SybDriver?;
}
Catch(ClassNotFoundException e)
{
out.println(e.getMessage());
}
我们在部|的时候应当注意是把JDBC的驱动程序JAR文g部v到install_dir/common/lib也可以部|到WEB-INF/lib目录中?br />建立q接
在徏立实际连接的时候,需要将URLQ数据库名字和用户名都传lDriverManagercȝgetConnectionҎQ由于getConnection有可能会产生异常因此我们应该把这些代码写在try{}catch{}? Eg:
String URL=”jdbc:oracle:thin:@?host+??port+??dbName;
String UID=”Database user name?
String PWD=”Database password?
Try
{
Conection con=DriverManager.getConnection(URL,UID,PWD);
}
Catch(SQLException e)
{
e.getMessage();
}
Conectionc还包括其他的一些用法!如下Q?br />prepareStatement
创徏预编译查询,提交l数据库
prepareCall
讉K数据库中的存储过E?br />Rollbach/commit
控制事务理
Close
关闭q接
isClosed
定q接是否时或被昄关闭
建立q接q程Q一个可选部分是使用getDataMetaҎ查找数据库的相关信息Q这个方法返回DatabaseMetaData对象Q该对象拥有相应的方法,可以得出数据库自w的名称和版?getDatabaseProductName,getDatabaseProductVersion),或?JDBC驱动E序的名U和版本(getDriverName,getDrvierVersion).例如Q?br />DatabaseMetaData dbMetaData=connection.getDataMeta();
String productName=
dbMetaDate.getDatabaseProductName();
System.out.println(“Database:?productName);
String produtcVersion=
dbMetaDate.getDatabseProductVersion();
System.out.println(“Version:?productVersion);
创徏Statement对象
Statement对象用来向数据库发送查询和命o。它由Conection的createStatement()Ҏ创徏:
Statement stmt=connection.createStatement();
执行查询或更?br />有了Statement对象后,可以用它的executeQueryҎ发送SQL查询QexecuteQueryq回ResultSetcd对象。Eg:
String sql=”select * from emp?
ResultSet rs=stmt.execute Query(sql);
Statement的其他的用法:
executeQuery
执行SQL查询q在ResultSet中返回数?ResultSet可能为空Q但不会为NULL?br />executeUpdate
用于UPDATEQINSERT或DELETE命o。返回受影响的行敎ͼ可以?Q它q提供对DDL(Data Definition Language)命o的支?例如CREATE TABLEQDROP TABLE和ALTER TABLE?br />executeBatch
一l命令作Z个单元执行,q回一个数l,其中存储每个计数的更新计数。addBatch可以向批量执行的命o中添加命令?br />setQueryTimeout
指定驱动E序在抛出SQLException异常之前Q等待处理结果的旉?br />getMaxRows/setMaxRows
定ResultSet可容U的最大行数。超q的行将会在不给ZQ何警告的情况下丢弃。默认gؓ0Q表C没有限制?br />l果处理
l果处理最单的方式是用ResultSet的NextҎ在表中移动,每次一行??ResultSet中行的第一列烦引ؓ1Q而非0).在访?ResultSet的列时不要用烦引,而用列名。用这U方式在表的l构发生改变Ӟ与ResultSet交互的代码不Ҏ出错误?br />ResultSet的一些方法集:
Next/previous
ResultSet中的游标分别UdC一行?br />Relative/absolute
RelativeҎ游标相应的地移动特定数目行Q或正或负(向前或向后)。AbsoluteҎ游标移动到指定的行受如果绝对值是负数Q那么游标将相对于ResultSet的结进行定?JDBC2.0)?br />getXxx
q回Xxx JavacdQ参见java.sql.TypesQ的?q个值来自于列名或烦引指定的列。如果列的gؓSQL的NULL|那么则返?或NULL?br />wasNull
查上面的getXxxd的是否ؓSQL的NULL倹{如果列的类型ؓ基本cd(int,float{?,且数据库中的gؓ0Q那么这Ҏ查就很重要。由于数据库的NULLq回0Q所?和数据库的NULL不能区分开来。如果列的类型ؓ对象(String,Date{?Q可以简单的返回gNULL比较?br />findColumn
q回ResultSet中与指定列名对应的烦引?br />getRow
q回当前的行PW一行从1开始?br />getMetaData
q回描述ResultSet的ResultSetMetaData对象。ResultSetMetaDatal出列的数目和名U?br />getMetaDataҎؓ有用。仅仅有ResultSet的情况下我们必须知道列的名称Q数目和cd才能正确的对表进行处理。ResultSetMetaData的方法集Q?br />getColumnCount
q回ResultSet中列的数目?br />getColumnName
q回列在数据库中的名U?
getColumnType
q回列的SQLcdQ对应于java.sql.Types中的V?br />isReadOnly
表示数据是否为只诅R?br />isSerachable
表明l列是否可以用在WHERE字句中?br />isNullable
表明该列是否可以存储NULL?br />(注J: ResultSet和ResultSetMetaData没有直接提供Ҏq回查询所q回的行敎ͼ然而,在JDBC2.0中,可以用last游标定位于ResultSet最后一行,然后调用getRow获取当前的行受?
关闭q接
昄的关闭连?
connection.close();
可以参考以下以下的例子:
import java.sql.*; import java.io.*; /** * <p>Title: JDBCq接数据?lt;/p> * <p>Description: 本实例演C如何用JDBCq接Oracle数据库,q演C添加数据和查询数据?lt;/p> */publicclass JDBCConn{private String url="";//数据库连接字W串private String username="";//数据库用户名private String password="";//数据库密?/font> /** *<br>Ҏ说明Q获得数据连? *<br>输入参数Q? *<br>q回cdQConnection q接对象 */public Connection conn(){try{ //W一步:加蝲JDBC驱动 Class.forName("oracle.jdbc.driver.OracleDriver"); //W二步:创徏数据库连?/font> Connection con =DriverManager.getConnection(url, username, password); return con; }catch(ClassNotFoundException cnf){ System.out.println("driver not find:"+cnf); returnnull; }catch(SQLException sqle){ System.out.println("can't connection db:"+sqle); returnnull; } catch (Exception e) { System.out.println("Failed to load JDBC/ODBC driver."); returnnull; }}/** *<br>Ҏ说明Q执行查询SQL语句 *<br>输入参数QConnection con 数据库连? *<br>输入参数QString sql 要执行的SQL语句 *<br>q回cdQvoid */publicvoid query(Connection con, String sql){try{if(con==null){thrownew Exception("database connection can't use!"); }if(sql==null) thrownew Exception("check your parameter: 'sql'! don't input null!"); //W三步:获取Staetment对象 Statement stmt = con.createStatement(); //W四步:执行数据库操作(查询操作Q?/font> ResultSet rs = stmt.executeQuery(sql); //W五步:处理l果?/font> ResultSetMetaData rmeta = rs.getMetaData(); //获得数据字段个数int numColumns = rmeta.getColumnCount(); while(rs.next()) { for(int i = 0;i< numColumns;i++) { String sTemp = rs.getString(i+1); System.out.print(sTemp+" "); } System.out.println(""); }}catch(Exception e){ System.out.println("query error:"+e); }}/** *<br>Ҏ说明Q执行插入、更新、删除等没有q回l果集的SQL语句 *<br>输入参数QConnection con 数据库连? *<br>输入参数QString sql 要执行的SQL语句 *<br>q回cdQvoid */publicvoid execute(Connection con, String sql){try{if(con==null) return; //W三步:获取Statement对象 Statement stmt = con.createStatement(); //W四步:执行数据库操作(更新操作Q?/font> stmt.executeUpdate(sql); System.out.println("update executed successly"); }catch(Exception e){ System.out.println("execute error: sql = "+sql); System.out.println(e); }//end try catch}//end execute/** *<br>Ҏ说明Q实例演C? *<br>输入参数Q无 *<br>q回cdQvoid */publicvoid demo(){ String sSQL=""; BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in)); try{ System.out.println("please input update SQL string"); sSQL=stdin.readLine();//获取命o行输入(更新字符Ԍ Connection conn = conn();//执行自定义连接方法(获取数据库连接对象) execute(conn,sSQL);//执行自定义更新方?/font> String sql = "select * from TBL_USER"; query(conn,sql);//执行自定义查询方法(查询q处理结果集Q?/font>//W六步:关闭数据库连?/font> conn.close(); }catch(SQLException se){ System.out.println(se); }catch(Exception e){ System.out.println(e); } }/** *<br>Ҏ说明Q主Ҏ *<br>输入参数QString[] args 命o行参敎ͼ包括Q数据库q接URLQ? *<br>用户名,密码Q? *<br>q回cdQvoid */publicstaticvoid main(String[] arg){if(arg.length!=3){ System.out.println("use: java JDBCConn url username password"); return; } JDBCConn oc = new JDBCConn(); oc.url = arg[0]; oc.username=arg[1]; oc.password=arg[2]; oc.demo(); }}
JDBC 3.0规范中提供了一个支持数据库q接池的框架Q这个框架仅仅规定了如何支持q接池的实现Q而连接池的具体实现JDBC 3.0规范q没有做相关的规定?/p>
JDBC 3.0规范定义了如下的cd接口来支持数据库q接池的实现?/p>
?javax.sql.ConnectionEvent: q接事g
?javax.sql.ConnectionPoolDataSource: q接池数据源
?javax.sql.PooledConnection: 被池化的q接
●javax.sql.ConnectionEventListener: q接事g监听接口
DataSource接口代表了数据源Q它一般由数据库驱动厂商实现。通过q个接口来获得一个连接,它的主要Ҏ如下:
?getConnection(): 获得一个Connection物g
?getConnection(String username,String password): 获得一个Connection物g
★getLongWriter(): 从DataSource获得Long Writer对象Q它是Print Writer的实?/p>
★setLogWriter(PrintWriter out):讄DataSource的LogWriter
★setLoginTime():获得DataSource试q接数据库的最大时?/p>
★setLoginTimeout(int seconds): 讄DataSource试q接数据的最大时?/p>
如下是在Tomcat 5中配|数据源:
在Tomcat?Tomcat_Home%/conf/server.xml里的</Context></Host>前增加如下的描述:
<Context path="/MyRoot" docBase="MyRoot" debug="0"
reloadable="true" crossContext="true">
<Resource name="jdbc/bn" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/bn">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>username</name>
<value>bn</value>
</parameter>
<parameter>
<name>password</name>
<value>bn</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>20</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>10</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>-1</value>
</parameter>
</ResourceParams>
</Context>