日期:2014-05-16  浏览次数:20629 次

JDBC复习,oracle的blob,clob的读写-zhai
http://hi.baidu.com/annleecn/blog/item/ff2fdb17e7a9e915972b4381.html

JDBC复习

JDBC驱动程序的类型:
JDBC-ODBC桥;部分本地API,部分JAVA驱动程序;JDBC网络纯JAVA驱动程序;本地协议纯JAVA驱动程序。
最后一种是访问数据库效率最高的。目前应用最多的也是这种。

不同数据库的连接URL如下:
sqlserver:jdbc:microsoft:sqlserver://localhost:1433;databasename=pubs
ORACLE:jdbc:oracle:thin:@localhost:1521:ORCL
mysql:jdbc:mysql://localhost:3306/databasename

CallableStatement对象用于执行SQL存储过程。
CallableStatement cstmt = conn.prepareCall("call p_changesal(?,?)");
cstmt.registerOutParameter(2, java.sql.Types.INTERGER);//注册OUT类型的返回参数
cstmt.setInt(1, 98);
cstmt.execute();
int sal = cstmt.getInt(2);

可以调用ResultSet.getMetaData()方法来获取ResultSetMetaData对象,再获取元数据。

一个Statement对象在同一时刻只有一个打开的ResultSet对象,在Statement接口中定义的所有executeXXX()方法都隐含地关闭Statement当前的ResultSet对象。如果你要执行多个查询语句,并且需要同时对它们的结果集进行操作,那么你必须使用多个Statement对象。

连接池技术预先建立多个数据库连接对象,然后将连接对象保存到连接池中,当客户请求到时,从池中取出一个连接对象为客户服务,请求完成后,客户程序调用close()方法,将连接对象放回池中。

常用端口:ftp:21 telnet:23 oracle:1521 mysql:3306 sqlserver:1433

注册数据库驱动的3种方式:
1,Class.forName( driverName ) 如:Class.forName("oracle.jdbc.driver.OracleDriver"):
2,Driver drv = new DriverConstructor();
   DriverManager.registerDriver(drv);
如:Driver drv = new Oracle.jdbc.driver.OracleDriver();
    DriverManager.registerDriver( drv );
3,java -Djdbc.drivers = oracle.jdbc.driver.OracleDriver;这种方式只能注册一个driver,命令行注册方式
方法1最好

建立连接3种方式:
getConnection( String url ) //匿名访问
getConnection( url, Properties info) //要一个properties对
getConnection( url, username, password)   //最常用

PreparedStatement继承自Statement
Statement 1,不适合有多个参数的SQL;2,不适合重复执行同构的SQL

Statement tem = conn.createStatement();

PreparedStatement pstm = conn.prepareStatement("select * from t_user where id = ?");
pstm.setString(1, "21"); //下标从1开始
pstm.executeQuery();

CallableStatement:专用于调用服务器的存储过程

Statement里的方法:
executeQuery( sql ) 返回ResultSet
execute( sql )   返回boolean,是否有ResultSet返回
executeUpdate( sql ) 返回int,影响的记录行数

字符转换:
java -------------> oracle:ISO-8859-1
Unicode:gb2312(GBK)
如:String name = "张三";
gb2312---->ISO-8859-1:
String newName = new String(name.getBytes("gb2312"), "ISO-8859-1");
ISO-8859-1------->gb2312:
String newName = new String(name.getBytes("ISO-8859-1"), "gb2312");

从ResultSet里面取值:
while(rs.next()){
String name = rs.getString("name");
}

关闭:
if(null != rs){
try{
   rs.close();
}catch(Exception e){
 
}
}
statement,connection一样要先判断非空,后关闭

SQLWarning:理论上的,不影响程序执行,不用处理;
SQLException里的方法:getErrorCode:返回错误码;getMessage:返回错误信息

元数据:DatabaseMetaData,ResultSetMetaData
conn.getMetaData(); rs.getMetaData();
查看数据库中表的信息

事务处理流程:
1,关闭自动提交;2,执行操作;3,处理数据;rollback或commit;4,打开自动提交
commit不仅是原有事务的结束,也是新事务的开始。

并发控制:
事务级别:transaction_none; transaction_read_uncommitted(默认); transaction_read_committed:解决脏读dirty read
transaction_repeateable_read:解决不可重复读的问题:non_repeated read
transaction_serializable:解决幻读:phantom read

oracle只支持read_commit和serializable
例如:conn.setTransactionIsolation( Connection.TRANSACTION_READ_COMMITTED );

回滚集的问题:
CONCUR_READ_ONLY, CONCUR_UPDATEABLE:
用来指定可不可以修改数据库:
TYPE_FORWARD_ONLY 默认
TYPE_SCROLL_INSENSITIVE, TYPE_SCROLL_SENITIVE
用来指定Result能不能滚动
可以用refreshRow刷新当前行。
例:Statement stm = con.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATEABLE);

定位方法:全部返回boolean,除afterLast(), beforeFirst()复位,返回void
absolute(int row) 传输绝对定位
first(), last(), next(), previous()向前一位
relative(int ) 相对定位
isAfterLast(