`

JDBC高级应用二

    博客分类:
  • java
阅读更多

JDBC高级应用(二)
本来想继续谈JDBC的高级连结方式,事务模式.但发现关于大对象存储有很多人在问,所以
先来插入一节关于大对象存储的内容,然后再接着原来的思路写下去.

JDBC的大对象存储听起来复杂,其实如果你明白了原理以后,就非常简单,网上有关这方面的
教材很少,而SUN的文档中,我从1.2开始看到一在仍然是错误的,不知道写文档的人长脑子没
有,就那几行代码你试试不就知道了,这么多次重抄下来还是错误的.


大对象分类:一般来说,大对象分为:大的文本对象,比如一个很长的文本(请你要注意什么是
文本文件,什么是二进制文件)文件,或者是你定义的一个长字符串,比如你定义了:
String s = "我们要去吃饭了......................然后睡觉!";
从吃饭到睡觉中间省略了实际的10000000000000字,虽然你不会真的定义这么称的String,但
有时会从什么地方得到这样的String,要写到数据库中.
另一种就是大的二进制对象,象执行文件,图象文件等,注意,word,excel,ppt这些"带格式"的文
档都应该以二进制对象存储.

一般来说,数据库如果支持大对象存储,会有这几种类型的SQL数据类型:
BLOB,CLOCB,NLOB,也有的数据数只有一种BLOB,基本上是这样的:BLOB用来存放二进制文件,而
CLOB用来存放文本文件,NLOB是对多字节文本文件支持.假如你的文本文件是纯英文的,放在
BLOB中当然可以,也就是说它是以byte格式存储的,而多字节是以CHAR格式存储的.

同样对于这几种类型的文档,有几种相对应的存取方式:
setter:
利用PreparedStatement的setXXX方法,
setAsciiStream()方法用于写入一般的文本流.setBinaryStream()方法用于写入二进制流
而setUnicodeStream()用于写好UNICODE编码的文本,与此相对应的ResultSet中三个getter方法
用于取回:getAsciiStream(),getBinaryStream(),getBinaryStream().
对于文件本身,要把它作为一个流,只要new InputStream(new FileInputStream("文件路径"))
就可以了,但对于大的String对象,你不会写入文件再转换成输入流吧?
new StringBufferInputStream(String s),记住了.
JDBC2以后提供了java.sql.BLOB对象,我不建议大家使用它,一是很麻类,二是容易出错,要先插
入一个空的BLOB对象,然后再填充它,实在没有必要,直接setXXX就行了,我试过,至少mysql,
oracle,sql server是可以直接set的.
好了,我们先看一个例子如何写入文件到数据库:
数据结构:
create table test(
  name varchar(200),
  content BLOB
);
File f = new File("a.exe");//先生成File对象是为了取得流的长度.FileInputStram可以直接
                           //传入文件路径
InputStream in = new InputStream(new FileInputStream(f));
PreparedStatement ps = conn.prepareStatement("insert into test (?,?)");
ps.setString(1,"a.exe");
ps.setBinaryStream(2,in,(int)f.length());
ps.executeUpdate();
f的长度一定要做从long到int的转换,SUN的文档中好几版都没有改过来.就这么简单,当然,不同的
数据库存本身要设置它允许的最大长度,MYSQL默认只能传1M的文件,要修改参数原能存更大的文件.
如果要从数库中取得文件:
PreparedStatement ps = conn.prepareStatement("select * from test where name=?");
ps.setString(1,"a.exe");
ResultSet rs = ps.executeQuery();
if(rs.next()){
 InputStream in = rs.getBinaryStream("content");
}
得到in对象后,你可以进行任何处理,写向文件和写向页面只是out对象不同而已:
写向文件:
DateOutputStream out = new DateOutputStream(new FileOutputStream("b.exe"));
写向页面:
response.reset();
response.setContType("类型");
ServletOutputSreamt out = response.getOutputSream();
得到out对象后,就可以输出了:
byte[] buf = new byte[1024];
int len = 0;
while((len = in.read(buf)) >0)
  out.write(buf,0,len);
in.close();
out.close();
对于向页面输入,要设置什么样的ContType,要看你想如何输出,如果你想让对方下载,就设为
"application/octet-stream",这样即使是文本,图象都会下载而不会在浏览器中打开.如果你要想
在浏览器中打开,就要设置相应的类型,还要在容器的配置文件中设置支持这种文档类型的输出,但
对于很多格式的文件,到底要输出什么类型,其实就是HTTP的MIME集,比如图片:image/gif,当然你如
果你的文件扩展名(ext)不确定,你也不要用if(ext.equals("gif"))......这样来判断,我教你一个
技巧,我之所以说是技巧,是我没有在别的地方发现有人用这种方法,对我来说我是绝对不会把别人的
方法拿来说是我的技巧的:
构造一个file类型的URL,我们知道URL目前JAVA可以支持HTTP,FTP,MAILTO,FILE,LDAP等,从FILE类型
的URL就可以得到它的MIME:

URL u = new URL("file://a.exe");
String mime = u.openConnection().getContentType();
这样你就可以直接response.setContType(mime);而不用一个一个类型判断了.
好了,大对象存储就说到这儿,不同的数据仍然和些特殊的规定,不在此一一列举了.

分享到:
评论

相关推荐

    JDBCJDBC高级应用

    JDBC高级应用JDBC高级应用JDBC高级应用JDBC高级应用

    你不知道的JDBC高级应用

    2.数据库连接池:把对数据库的连接放入一个容器中,要的时候就取,不需要的时候就还会去.程序启动的时候慢点,后期对数据库CRUD大幅度提升.(常用开源连接池DBCP) 3.特殊类型(date--日期,clob--大字段,blob--二进制) 的...

    使用JDBC的高级数据库操作

    包括存储过程和高级数据类型,它们可以通过使用 JDBC 的 Java 应用程序执行。教程中的示例代码是为 DB2 通用数据库 7.2 编写的,但因为使用了 DataSource 对象, 修改这些代码以适用于其它数据库是不成问题的。...

    加深难度-对标大厂SpringBoot高级应用特训 SpringBoot开发实践与高级应用

    课程内容在以往SpringBoot案例课程之上,再次加深了难度和深度,直接对标一线大厂的高级应用实践。课程围绕着SpringBoot开发实践和SpringBoot高级应用两个主题展开,是真正意义上的大厂级开发技术,同时技术拥有很强...

    完整版 Java高级教程 Java语言程序设计 第8章 JDBC(共24页).ppt

    【完整课程列表】 完整版 Java高级教程 Java语言程序设计 第1章 输入输出流(共42页).ppt 完整版 Java高级教程 Java语言程序设计 第2章 Java多线程...完整版 Java高级教程 Java语言程序设计 第8章 JDBC(共24页).ppt

    jdbc的详细介绍

    2. JDBC 能完成的功能: 3. JDBC API 包含的内容? 4. JDBC driver 5. JDBC Driver的种类. 6. JDBC 编程人员使用到的接口? 7. JDBC 编程中主要的接口和类 8. 使用唯一的URL确定数据库 9. JDBC2.0 增强特性 第二章 1. ...

    JAVA学习使用JDBC的高级特征创建应用程序PPT教案学习.pptx

    JAVA学习使用JDBC的高级特征创建应用程序PPT教案学习.pptx

    《JDBC API数据库编程实材作教材》[PDF]

    这是一本关于JDBC API数据库编程的书,主要介绍Java程序设计基础、 SQL基础知识、JDBC(Java数据库连接)应用、接口和类,以及如何在JSP和Servlet中使用JDBC,并以完整的实例程序说明 JDBC API(应用程序编程接口)...

    JDBC 3.0数据库开发与设计

    第2章 JDBC开发环境及配置 2.1 数据库系统 2.1.1 SQL数据库数据库基本操作语句 2.1.2 Microsoft SQL Server数据库设计及ODBC配置 2.1.3 Oracle 数据库的基本说明及其使用简介 2.1.4 MySQL的安装及使用简介 ...

    一本糊涂账-基于Swing和JDBC开发的图形界面桌面应用

    本项目是基于Swing和JDBC开发的图形界面桌面应用,涵盖了J2SE的绝大部分基础知识,通过这个项目能运用和锻炼几乎大部分的J2SE知识和技能。 基础内容: 面向对象 字符串数字 日期 中级内容: 异常 ,集合,JDBC,...

    JDBC API教程与参考手册part2

    然后,本书转向更高级的主题,集中介绍JDBC 3.0API的一些高级功能,如可滚动和可更新的结果集、批量更新、SQL99数据类型、定制映射、保存点、语句池以及自动生成键等。 除了深入介绍JDBC元数据API之外,本书还给出了...

    JDBC API教程与参考手册part3

    然后,本书转向更高级的主题,集中介绍JDBC 3.0API的一些高级功能,如可滚动和可更新的结果集、批量更新、SQL99数据类型、定制映射、保存点、语句池以及自动生成键等。 除了深入介绍JDBC元数据API之外,本书还给出了...

    什么是 jdbc,及其的作用.md

    JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。 以下是关于JDBC的详细解析: 一、JDBC的组成 JDBC主要由两部分组成:JDBC API和JDBC Driver API。 1. JDBC API...

    JDBC API教程与参考手册part4

    然后,本书转向更高级的主题,集中介绍JDBC 3.0API的一些高级功能,如可滚动和可更新的结果集、批量更新、SQL99数据类型、定制映射、保存点、语句池以及自动生成键等。 除了深入介绍JDBC元数据API之外,本书还给出了...

    jdbc笔记(自写)

    JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序. ​ JDBC为访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节问题。 JDBC的目标是使Java程序员...

    jdbc api数据库编程实作教材

    jdbc api数据库编程实作教材 java高级应用 数据库编程

    java jdbc 项目实战

    JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供...JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序.

    JDBC精讲非扫描版

    JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句...JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,该书精讲JDBC,不要你去一本超厚的书。

    Java网络程序设计+JDBC程序设计+模拟QQ微信的即时网络通信应用程序

    实践周子任务二(JDBC程序设计):了解JDBC工作的基本原理和掌握JDBC编程的基本步骤,按要求编写一个带有图形用户界面的数据库应用程序,具备增加、删除、查询、修改功能。 实践周高级子任务:结合子任务一和二,构建一...

    JDBC与Java数据库编程

    JDBC的概念 基础应用 高级应用 JDBC是什么 JDBC实现的功能 JDBC体系结构图 优缺点 版本 java.sql包 …… …

Global site tag (gtag.js) - Google Analytics