本来想继续谈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);而不用一个一个类型判断了.
好了,大对象存储就说到这儿,不同的数据仍然和些特殊的规定,不在此一一列举了.
分享到:
相关推荐
深入理解JDBC的高级封装对于提升数据库操作的效率和代码的可维护性至关重要。本话题将探讨JDBC的核心机制,以及如何通过ORM(Object-Relational Mapping)框架如Hibernate和EJB(Enterprise JavaBeans)来进一步优化...
(注:对于较新的版本,可能需要使用`com.microsoft.sqlserver.jdbc.SQLServerDriver`) 3. 创建连接:使用`DriverManager.getConnection()`方法建立与SQL Server的连接,需要提供数据库URL、用户名和密码: ```...
- **启动命令**:`D:\IBM\WebSphere\AppServer\bin>startServer.bat server1` (注:server1 是默认服务器名,可根据实际情况调整) - **停止命令**:`D:\IBM\WebSphere\AppServer\bin>stopServer.bat server1` #####...
【标签】"java"表示该资源包主要围绕Java编程语言展开,涵盖了Java的基础知识、语法特性以及高级主题。"springboot"则说明了教程也包含了SpringBoot框架的使用,SpringBoot是Java生态中广泛使用的微服务开发框架,...
Java是一种广泛应用于软件开发的语言...综上所述,《Java核心技术卷二》不仅覆盖了Java的众多高级特性,而且通过实例和详尽的讨论,为读者提供了一套完整的Java高级编程知识体系,是Java程序员和开发者的宝贵学习资源。
JSP最终会被翻译成Servlet,它们都是基于Java的Web开发技术,但JSP更注重视图层,Servlet则更适合控制逻辑。 **五、JSP示例代码** 压缩包中的例程可能包括以下类型: 1. **Hello, World!**:基础的JSP页面展示,...
注:float 和 double 的小数部分不可能精确,只能近似。 比较小数时,用 double i=0.01; if ( i - 0.01 ) ... 不能直接 if (i==0.01)... 默认,整数是int类型,小数是double类型 long类型值,需跟L或l在数据后;...
### Java学习书目详解 #### 一、入门 1. **《Java 2从入门到精通》** - **推荐理由**:这本书非常...以上书籍涵盖了从Java基础到高级技术的各个方面,适合不同阶段的学习者根据自己的需求选择合适的教材进行学习。
这套教案详细覆盖了JSP的基础到高级应用,旨在帮助学习者深入理解和掌握JSP在实际Web开发中的运用。 JSP是Java平台上用于构建动态网站的技术,它允许开发者将静态内容与动态代码相结合,从而实现数据驱动的网页。...
这是一个典型的J2EE(Java 2 Platform, Enterprise Edition)应用,涵盖了Web开发的基础和高级特性。以下将详细阐述相关知识点。 1. **Servlet**: Servlet是Java编程语言中的一个接口,用于扩展服务器的功能。在...
注:本系列图书的第I、II卷再版时均相应改名为《xxx开发实例大全》(基础卷)及(提高卷),但内容基本无变化,需要的童鞋可自由匹配查找。 内容简介 《Java开发实战1200例》分为I、II两卷共计1200个例子,包括了开发...
**注**:若需在同一台主机上启动多个Metastore或HiveServer2实例,可通过更改端口号和日志路径实现。 - 启动带有指定端口的Metastore服务: ```bash nohup hive --service metastore -p 9045 --hiveconf hive....
5. **JSTL(JavaServer Pages Standard Tag Library)**:JSTL提供了一组标准标签库,包括核心标签、JDBC标签、XML标签和函数标签,以替代硬编码的Java代码,提高代码的可读性和可维护性。 6. **Servlet和JSP的关系...
JavaWeb是Java技术在Web应用开发中的一个领域,它涵盖了从服务器端编程到客户端交互的各种技术。本资料集主要围绕JavaWeb开发的核心概念、技术和工具展开,旨在为学习者提供全面且深入的理解。 首先,JavaWeb开发的...
JSTL是一组标准标签库,包括核心、JDBC、XML等,提供更高级的控制结构和数据处理功能。 **JSP开发最佳实践:** 1. **分离关注点** - 尽量保持JSP页面只负责显示,业务逻辑和数据处理应在Servlet或JavaBeans中完成。...
(读者注:其实这个应该叫做很基础的入门一下下,如果你看过Hibernate了那这个就非常的简单) (再加一条,其实大家可以看官方的教程更好些:http://mybatis.github.io/mybatis-3/,而且如果英文不是很好的那就看...