`

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高级应用中,我们可以利用其提供的功能实现更高效、更灵活的数据操作。以下是一些关键知识点: 1. **元数据获取**: - `DatabaseMetaData` 类提供了关于数据库的各种元数据信息,例如获取所有表名、列信息、...

    你不知道的JDBC高级应用

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

    使用JDBC的高级数据库操作

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

    JDBC事物应用源码文件

    2. **JDBC中的事务管理**:在JDBC中,可以通过两种方式管理事务:自动提交模式和手动提交模式。默认情况下,JDBC处于自动提交模式,每次SQL语句执行后都会自动提交。要手动控制事务,需要调用`Connection`对象的`...

    JDBC的高级运用

    根据提供的文件信息,我们可以提炼出以下关于JDBC高级应用的相关知识点: ### 一、JDBC基本概念 JDBC(Java Database Connectivity)是Java语言中用来规范客户端程序如何访问数据库的应用程序接口,是一套用于执行...

    深入JDBC高级封装

    深入理解JDBC的高级封装对于提升数据库操作的效率和代码的可维护性至关重要。本话题将探讨JDBC的核心机制,以及如何通过ORM(Object-Relational Mapping)框架如Hibernate和EJB(Enterprise JavaBeans)来进一步优化...

    关键技术——JSP与JDBC应用详解(电子版)

    《关键技术——JSP与JDBC应用详解》这本书深入探讨了Java服务器页面(JSP)和Java数据库连接(JDBC)这两个在Web开发中至关重要的技术。对于任何希望在Java平台上进行Web应用程序开发的程序员来说,理解和掌握这两项...

    QTS青训-java8 高级应用与开发 实验答案

    这个压缩包包含了一系列关于Java 8高级应用与开发的实验答案,涵盖了从集合框架、泛型到UI设计、JDBC编程以及多线程等多个关键领域。 1. **集合框架与泛型** (实验1参考答案.docx) - 泛型:理解泛型的概念,如何在...

    Spring Data JDBC与JDBC的区别

    总结起来,Spring Data JDBC通过提供高级的抽象和自动化,降低了数据库操作的复杂性,提高了开发效率,而JDBC则是底层的数据库访问API,灵活性更高但需要更多的手动配置和代码编写。根据项目需求和团队技能,开发者...

    DB2 v10.5.0.8 jdbc驱动 官方版

    此外,对于大型企业应用,了解DB2的高级特性,如分区、复制、集群、安全策略和性能优化策略也是至关重要的。DB2提供了丰富的管理工具,如db2admin、db2look、db2top等,帮助管理员监控和调整数据库状态。 总之,...

    Java语言编写的JDBC应用

    11. **JDBC的高级特性**:如CallableStatement用于调用存储过程,ResultSetMetaData获取列元数据,DatabaseMetaData获取数据库元数据等。 通过掌握以上JDBC核心技术,开发者能够编写出高效、健壮的Java应用程序,...

    sqljdbc42 jdbc for java

    在Java编程中,数据库操作是不可或缺的一部分,而SQLJDBC42则是Oracle公司提供的一款高效、可靠的Java数据库连接(JDBC)驱动程序,专为Java开发者设计,使得Java应用程序能够与SQL Server数据库进行无缝交互。...

    JDBC高级批处理

    **JDBC高级批处理** Java Database Connectivity (JDBC) 是Java平台中用于与数据库交互的一组接口和类,它是Java标准API的一部分,允许Java开发者执行SQL语句并处理结果。在处理大量数据时,JDBC提供了批处理功能,...

    java jdbc 需要包

    2. `mysql-connector-java-5.1.21-bin.jar`: 这是MySQL数据库的JDBC驱动,用于建立Java应用程序与MySQL数据库之间的连接。 3. `spring-beans-3.2.0.M1.jar`: 包含了Spring对bean的管理和配置,是Spring框架的重要...

    jdbc高级优化

    以上是JDBC高级优化的一些主要方向,实际应用中应结合具体项目需求和环境进行细致的调整和测试,以达到最佳性能。提供的文件中可能包含了关于JDBC编程技术的详细教程,如"Java 语言 SQL 接口——JDBC 编程技术.rar...

    基于java的高级应用

    Java的高级应用提供了多种解决方案来应对这些挑战,例如通过JSP和Servlet实现动态网页,通过JDBC连接数据库,通过Struts实现MVC架构,以及通过JMS进行消息传递,这些技术共同构建了现代企业级Web应用的基石。

    JDBC 模块化应用测试代码.zip

    在Java编程领域,JDBC(Java Database Connectivity)是连接Java应用程序和各种数据库的关键技术。它为开发者提供了一组标准API,使得程序可以与多种数据库进行交互,如MySQL、Oracle、SQL Server等。本资料包“JDBC...

    JDBC高级教程

    在深入探讨JDBC高级教程之前,我们首先理解JDBC的基础概念。 1. **JDBC驱动类型** JDBC驱动分为四种类型:Type 1(纯Java驱动)、Type 2(混合驱动)、Type 3(网络协议驱动)和Type 4(纯Java的网络驱动)。Type ...

Global site tag (gtag.js) - Google Analytics