JDBC 高级数据类型的应用

高级|数据|数据类型

JDBC 2.0 引进了对应于SQL_99的许多新对象,这些新对象有BLOB,CLOB,ARRAY,REF,结构化类型,DISTINCT类型以及LOCATOR.
JDBC 3.0增加了Boolean和Datalink对象
插入这些高级数据类型到数据库中的主要手段是使用PreparedStatement对象,读取主要是ResultSet对象.下面介绍怎么在数据库中读取和写入高级数据类型

1:BLOB和CLOB
BLOB: 二进制大对象(Binary Large OBject)即一个字节序列(比喻说一个mp3文件可以存储为一个BLOB)
CLOB:一个对VARCHAR 或类似的列来说太长的字符串.
来自数据库的BLOB和CLOB数据可以通过java.sql.Blob和java.sql.clob对象来操作.
ResultSet 和PreparedStatement对象提供的处理这两种数据的方法如下
ResultSet : PreparedStatement
Blob getBlob(int) void setBlob(int ,Blob)//第一个参数是PreparedStatement中的占位符的索引,以下相同
Blob getBlob(string) void setClob(int ,Clob)
Clob getClob(int)
Clob getClob(String)
使用PreparedStatement.setBlob(int,Blob)我们可以用BLOB数据来设置准备语句中的占位符,并且可以通过执行SQL语句把这些数据写入到另一个表中
如:
String sql="select blob_col from blob_table where id=?"//blob_colum ,id为blob_table 这个表的列名
PreparedStatement ps=connection.prepareStatement(sql);
ps.setInt(1,1);
ResultSet rset=ps.executeQuery();
Blob blob=null;
if(rset.next())
{
blob=rset.getBlob(1);
}
上叙中blob只是持有一个指向数据库中这些二进制数据的引用.并不持有实际二进制数据,然后代码可以使用这个相同的引用把这些二进制数据写入到另外的一个表中:
sql="insert into blob_table_2 values(?)";
ps=connection.prepareStatement(sql);
ps.setBlob(1,blob);
ps.executeUpdate();

jdbc 2.0中的BLOB和CLOB借口提供了一种从数据库中获取数据或写数据到数据库的手段,这个手段是通过从数据库中获得一个流(输入或者输出)对象.并从该流中读取数据或写入.
例:
OutputStream out=null;
BufferedInputStream in=null;
File file=new File("****");
ReslutSet rset=statement.executeQuery(sql);//从查询语句中取得一个结果集
if(rset.next())
{
Blob blob=rset.getBlob(1);
out=((oracle.sql.Blob)blob).getBinaryOutputStream();//jdbc 2.0不支持写数据到blob,因此我们用Oracle的扩展
int bufferSize==((oracle.sql.Blob)blob).getBufferSize();
in=new BufferedInputStream(new fileInputStream(file),bufferSize);
byte[] b=new byte[bufferSize];
int count=in.read(b,0,bufferSize);
//开始存储数据到数据库中
while(cout!=-1)
{
out.write(b,o,count);
cout=in.read(b,o,bufferSize);
}
//数据写完
out.close();
in.close();
connection.commit();//提交改变
........
}
类似的,我们可以从blob中得到一个输入流,把blob数据写入到文件中去
InputStream in=blob.getBinaryStream();
int bufferSize =((oracle.sql.Blob)blob).getBufferSize();
2:结构化数据类型
结构化数据类型类似于一个java对象.如下,我们用SQL定义一个People类型
CREATE OR REPLACE TYPE People AS OBJECT(NAME VARCHAR,AGE INT);//Oracle数据库..
现在可以在任何地方使用使用PEOPLE该数据类型

CREATE TABLE SAMPLES(SA_ID NUMBER, CURSON People,SAMPLE BLOB);
现在我们可以使用setObject()和 getObject()来操纵这些数据类型
ResultSet : PreparedStatement
Object getObject(int) void getObject(int,Object)
Object getObject(string)
..........
例:public class People implements SQLData,Serializable
{
......
}
Map map=connection.getTypeMap();
map.put("people",People.class);//People这个类必须在前面创建,t它必须为表中的每个列含有一个成员变量
String sql="INSERT INTO SAMPLE(SA_ID,CURSON) VALUES(?,?)";
People people=new People();
ps=connection.prepareStatement(sql);
ps.setInt(1,1);
ps.setObject(2,people);
int result=ps.executeUpdate();
我们也可以从数据库中取得这个People对象
String sql="SELECT * FROM SAMPLE WHERE SA_ID=1";
ps=connection.prepareStatement(sql);
ResultSet rset=ps.executeQuery();
if(rset.next())
{
People people=(People)rset.getObject(2);
}
3:Distinct 类型
Distinct类型象一个内建类型的别名,我们可以这样定义这个类型
CREATE TYPE BIRTHDATE AS DATE
由于这个新类型只是一个指向某个已有内建类型的别名,所以我们可以使用getDate()和setDate()的方法;
4:构造类型
Array和Ref object(引用对象)
ResultSet PrepareStatement
Array getArray(int) void setArray(int ,Array)
Array getArray(String)
Ref getRef(int) void setRef(int,Ref)
Ref getRef(String)
Array方法可以通过制定行索引和列索引来存取行值和列值. 该Array对象还可以把数组做为一个ResultSet来返回.(ResultSet只是存取一组行中的那些列值的手段)
上面我们定义了一个People自定义类型和SAMPLE表.如果执行一个返回People列的查询,可以使用getRef()的方法,我们将会得到一个指向该列中的那个Prople对象的引用

5:DataLink
JDBC 3.0的一个新功能,DataLink对象描叙外部地存取到数据库上的数据
DataLink值使用setURL()和getURL()来处理
ResultSet PrepareStatement
URL getURL(int) void setURL(int ,URL)
URL getURL(String)

时间: 2024-12-31 07:44:57

JDBC 高级数据类型的应用的相关文章

Delphi 基本数据类型列表 高级数据类型列表 字符类型查询列表清单

原文:Delphi 基本数据类型列表 高级数据类型列表 字符类型查询列表清单 长长的列表文字类型文件 分类 范围 字节 备注 简单类型 序数 整数 Integer -2147483648 .. 2147483647 4 有符号32位 Cardinal 0 .. 4294967295 4 无符号32位 Shortint -128 .. 127 1 有符号8位 Smallint -32768 .. 32767 2 有符号16位 Longint -2147483648 .. 2147483647 4

JDBC 2.0中的高级数据类型

JDBC 2.0中提供了对SQL3标准中引入的新的数据类型,如Blob(binary large object).Clob(character large object).Array 对象.REF(对象参考,object reference)和 UDT(用户定义数据类型,user-defined datatype)等的支持.这些新的数据类型结合在一起,使得数据库设计人员可以创建更丰富的模式,并简化了对复杂数据的处理和持久化. 例如,我们要向tbl_User表中插入用户的照片,这时就可以使用流将B

2016全球最强数据库大盘点

数据库排名年度盘点 说到盘点,首先肯定得看看DB-Engines的全球数据库排名.下表是2017年1月份前20名数据库引擎最新排名. DB-Engines 2017-01数据库前20名列表DB-Engines 2017-01数据库前20名列表 ​DB-Engines这个排名在业界引用得非常多,权威性也很高,总体来说比较客观,它不像很多咨询机构采用市场调查,或者某个数据库厂商发布的数据,而是通过以下6个方面的统计数据来综合评估各个数据库产品得分并给出综合排名: 数据库相关网站数量(当前通过goog

jOOQ 1.6.4发布 Java类库

jOOQ 1.6.4此版本附带几个有用的概念其http://www.aliyun.com/zixun/aggregation/17885.html">灵感来自其他框架.#selecting到自定义的POJO是可能的Results果可以按照约定的POJO映射到或使用JPA @ Column注释. #selecting自定义回调,这已经是一个广泛的实践应用于Spring Jdbc模板.#selecting long-running异步查询,Avaje Ebean框架启发一个想法.除了这些变化和

jOOQ 1.6.3发布 Java类库

jOOQ 1.6.3主要修正了许多错误,包括围绕代码生成,普通的SQL表和数据类型的维护版本.请注意,生成的源代码可能包含不兼容的变化由于#639(详情请参阅完整的发行说明).除此之外,CURSOR项目推进和UNNEST阵列到表中,现在有可能.参见所附有关细节jOOQ CURSOR项目的文章. 详细的发行说明如下: Features and improvements-------------------------#679 - Improve H2 NVL2 support as of H2 1

The basics of swift

原文出自:标哥的技术博客 前言 Swift是iOS.OS X和WatchOS平台新的开发语言.尽管如此,Swift有很多是与我们使用过的C和Objective-C开发经验是很像的. Swift提供了自己版本的C和Objective-C基础数据类型,包括整型Int.浮点型Double和Float.Boolean值Bool和字符串类型String.Swift还提供了三个强大的基本集合类型Array.Set.Dictionary. 与C语言一样,Swift使用变量存储和通过唯一标识名获取值.Swift

JAVA类型和SQL类型的匹配

已动态创建表为例 (1)    public class DataType {      private int code;      private String SQLType;      private String localType = null;      private String params = null;      private boolean needsSetting = true;       public DataType(int code, String SQLT

深入理解 GraphQL

0.引子 通过上一篇文章我们对 GraphQL 有了基础的了解.我们知道 GraphQL 使用 Schema 来描述数据,并通过制定和实现 GraphQL 规范定义了支持 Schema 查询的 DSQL (Domain Specific Query Language,领域特定查询语言).Schema 帮助将复杂的业务模型数据抽象拆分成细粒度的基础数据结构,而 DSQL 的实现则赋予了前端开发者自由组织和定制请求数据的能力.如果以一张图来表示的话,可以将 GraphQL 看做一条以通用基础业务数据

java web-用java将图片存入SQLsever中

问题描述 用java将图片存入SQLsever中 [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]数据类型 image 和 nvarchar 在 equal to 运算符中不兼容. public void Insert() { try { String sql=""insert into picture values(??)""; PreparedStatement ps=conn.prepareState