文档章节

JDBC复习,oracle的blob,clob的读写

hefeiuu
 hefeiuu
发布于 2017/05/04 20:28
字数 1719
阅读 10
收藏 0
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(), isBeforeFirst(), isFirst(), isLast();
注意:指针一开始是指在第一行的前面。

可更新结果集:
rs.updateInt(1, 9911); //更新当前行
rs.updateString("name", "tony");
rs.updateRow(); //修改生效,不调用则无效
rs.absolute(10);
rs.deleteRow(); //删除第10条记录
rs.cancelRowUpdates(); //放弃修改,删除还是会生效

插入新行
rs.moveToInsertRow(); //创建一个空记录
rs.updateInt("id", 11);
rs.updateString("name", "rose");
rs.insertRow();
rs.moveToCurrentRow(); //修改生效
rs没有主键则不能插入数据,必须包含所有的无默认值的非空字段,只能查一个表,不能连接查询,查询结果必须包含主键

如果是插入的话,必须选择表中所有不能为空的列。

批量处理:batch
con.setAutoCommit(false); //关闭自动提交
Statement stm = con.createStatement();
stm.addBatch("insert into t_user(id) value(11)");
stm.addBatch(" ... ");
int[] results = stm.executeBatch(); //返回所有成功的操作结果
con.commit();
con.setAutoCommit(true); //恢复自动提交

高级数据类型:
Blob ------ SQL Blob //大二进制对象 binary large object
Clob ------ SQL Clob //大文本二进制对象character large object
Array ----- SQL Array
Struct ---- SQL structure Type
Ref ------- SQL REF

方法:getXXX, setXXX,   updateXXX
步骤:1,获得数据库连接,2,向表中插入一个空的Blog字段,3,获得Blob的输出流,4,通过输入流将数据写入数据库
如:
try{
conn.setAutoCommit(false);
Blob blob = null;
PreparedStatement pstm = conn.prepareStatement("insert into t_blob(id,filename,blobData) value

(?,?,empty_blob())"); //empty_blob()函数由oracle提供,用来创建空对象
pstm.setInt(1,10);
pstm.setString(2,"d:/hello.mp3");
pstm.executeUpdate(); //插入空值
pstm.close();

pstm = conn.prepareStatement("select blobData from u_blob where filename = ? for update"); //for update

同步必须使用,只能在查询时使用
pstm.setString(1, "d:/hello.mp3");
rs = pstm.executeQuery();
if(rs.next()){
   Blob b = rs.getBlob();
   oracle.sql.BLOB ob = (oracle.sql.BLOB)b;
   OutputStream os = ob.getBinaryOutputStream();
   InputStream is = new FileInputStream("d:/hello.mp3");
   byte[] buffer = new byte[4096];
   int len = 0;
   while(true){
    len = is.read(buffer);
    if(-1 == len) break;
    os.write(buffer, 0, len);
   }
   is.close();
   os.close();
   conn.commit();
}
}catch(Exception e){
conn.rollback();
}finally{
}

查询:
conn.setAutoCommit(false);
pstm = conn.prepareStatement("select blobData from u_blob where name = ? for update");
rs = pstm.executeQuery();
if(rs.next()){
blob b = rs.getBlob(1);
InputStream is = b.getBinaryStream();
OutputStream os = new FileOutputStream(path);
byte[] bb = new byte[4096];
int len = 0;
while(true){
   len = is.read(bb);
   if(len == -1) break;
   os.write(bb, 0, len);
}
}

DataSource
WebLogic:services----->JDBC---->connection pool

JNDI:java naming directory interface api

用DataSource建立connection步骤:1,获得数据库连接,2,支持连接池,3,通常可以支持JNDI,4,支持分布式事务

OID:object id:对象在数据库中的ID

OOAD:object orient analyze and design面向对象的分析与设计

ODBC:open database connectivity:开放的数据库连接

JDBC:java database connectivity:java数据库连接

JDBC驱动程序可分为4类:
1,JDBC-ODBC桥; 2,部分本地API,部分JAVA驱动程序; 3,JDBC网络纯JAVA驱动程序; 4,本地协议纯JAVA驱

动程序,这个效率最高

Driver接口:
SQLSERVER:com.microsoft.jdbc.sqlserver.SQLServerDriver
jdbc:microsoft:sqlserver://IP:1433;数据库名,用户名,密码

MySQL:com.mysql.jdbc.Driver
jdbc:mysql://IP:3306/数据库名,用户名,密码

DB2:com.ibm.db2.jdbc.app.DB2Driver()
jdbc:db2://IP:端口/数据库名,用户名,密码

oracle:jdbc:oracle:thin:@IP:PORT,DBname,user,password

pointbase:jdbc:pointbase:server://ip:port,dbname,user,password
com.pointBase.jdbc.jdbcUniverSqlDriver

DriverManager类是驱动程序管理器类,所有方法都是静态的,一个statement对象在同一时刻只有一个打开的ResultSet对象,在

statement接口中定义的所有executeXXX()方法都隐含地关闭statement当前的ResultSet对象,如果你要执行多个查询语句,并且需

要同时对它们的结果集进行操作,那么你必须使用多个statement对象。

DataSource例子:
javax.naming.context ctx = new javax.naming.InitialContext();
//JNDI名是相对于java:comp/env上下文的,因此在程序中利用JNDI名查询数据源对象时,要加上java:comp/env/
javax.sql.DataSource ds = (javax.sql.DataSource)ctx.lookup("java:comp/env/bookstore");
java.sql.Connection conn = ds.getConnection();

本文转载自:http://ufopw.iteye.com/blog/728688

共有 人打赏支持
hefeiuu
粉丝 3
博文 64
码字总数 0
作品 0
合肥
Java大对象类型的Hibernate映射

在Java中,java.lang.String可用于表示长字符串(长度超过255),字节数组byte[]可以用于存放图片户或文件二进制数据。此外,在JDBC API中还提供了java.sql.CLOB和java.sql.BLOB类型,他们分...

frabbit
2013/05/07
0
0
Clob,Blob,InputStream,byte 互转

今天用java读取oracle里的Clob字段。本来要转成xml文件的,一顿转换。现在总结一下这个流的互相转换方法。 以下内容来自:http://hi.baidu.com/webidea/item/8965fd99de1034dd1e4271e1 一、b...

王小明123
2012/10/06
0
1
基于AEAI ESB的处理大字段

1.背景 数据迁移中大字段一直是个比较头疼的问题,一旦大字段中值大于32K的话就无法用sql语句来实现插入和更新。通用的解决办法一般有两种:存储过程和JDBC。下面主要总结下基于AEAI ESB用J...

数通畅联
2015/01/22
0
0
SSH对Clob字段类型的支持

SSH对Clob字段类型的支持 环境: 1、Oracle 9i 9.2.0.8.0 2、jdbc:ojdbc5.jar 3、Spring 2 4、Hibernate 3 系统中有个信息管理模块,其中的信息内容使用了FCKeditor进行编辑,内容可能会很长...

i33
2012/02/15
0
0
Oracle中Blob和Clob的作用

  Blob是指二进制大对象也就是英文Binary Large Object的所写,而Clob是指大字符对象也就是英文Character Large Object的所写。由此可见这辆个类型都是用来存储大量数据而设计的,其中BLO...

underA
2013/03/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Linux环境搭建 | VMware下共享文件夹的实现

在进行程序开发的过程中,我们经常要在主机与虚拟机之间传递文件,比如说,源代码位于虚拟机,而在主机下阅读或修改源代码,这里就需要使用到 「共享文件」 这个机制了。本文介绍了两种共享文...

良许Linux
今天
5
0
JUC锁框架——AQS源码分析

JUC锁介绍 Java的并发框架JUC(java.util.concurrent)中锁是最重要的一个工具。因为锁,才能实现正确的并发访问。而AbstractQueuedSynchronizer(AQS)是一个用来构建锁和同步器的框架,使用A...

长头发-dawn
今天
3
0
docker中安装了RabbitMQ后无法访问其Web管理页面

在官网找了"$ docker run -d --hostname my-rabbit --name some-rabbit -p 8080:15672 rabbitmq:3-management"这条安装命令,在docker上安装了RabbitMQ,,结果输入http://localhost:8080并不......

钟然千落
今天
4
1
spring-cloud | 分布式session共享

写在前面的话 各位小伙伴,你们有福了,这一节不仅教大家怎么实现分布式session的问题,还用kotlin开发,喜欢kotlin的小伙伴是不是很开心! 以前在写Android的时候,就对客户端请求有一定的认...

冯文议
今天
3
0
c语言之内存分配笔记

先看一个数组: short array[5] = {1,2} // 这儿定义的一个int类型的数组,数组第1和第2个元素值是1和2.其余后面默认会给值为0; 或者 short array[] = {1,2};//这儿数组第1和第2个元素,数组...

DannyCoder
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部