`
wenquan4004
  • 浏览: 21168 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java与数据库中图片存取的问题(测试)

    博客分类:
  • java
阅读更多
最近一直在整理struts2处理与数据库图片存取相关的code,网上也看了不少,结果总是差那么一点点(哈哈),没办法,只有手写个最原始的jdbc到Oracle存取的例子,没想到还有不少收获,顺便将自己的struts2的错误处理也贴上来,存储下。

javaeye的版主们看好了,我这可是存储啊!别再给我评什么茶贴还是什么里。

package com.core.test;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import oracle.jdbc.OracleResultSet;
import oracle.sql.BLOB;


import com.common.bean.Personnel;

public class TestSQl {

	/**
	 * @param args
	 */
	public static void main(String[] args)  {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
			String user = "xx";
			String password = "111";
			
			Connection con = DriverManager.getConnection(url, user, password);
			Statement stmt = con.createStatement();
			String sql = "";
			con.setAutoCommit(false);
			//***********************IO****************************
			File file = new File("C:\\image\\haha.gif") ;
			InputStream is = new FileInputStream(file);
			ByteArrayOutputStream os = new ByteArrayOutputStream();
			
			FileOutputStream fos = new FileOutputStream("C:\\image\\haha2.gif");
			byte[] buffer = new byte[is.available()];
			int b = 0;
			
			while((b = is.read(buffer)) != -1){
				os.write(buffer);
				if(b > 1024) {
					System.out.println(b);
				}
			}
			
			byte[] photo = os.toByteArray();
			System.out.println(photo.length);
			
			ByteArrayInputStream  bis = new ByteArrayInputStream(photo);
			while(( b = bis.read(buffer)) != -1) {
				fos.write(buffer);
			}
			//************************INSERT*******************************
//插入一条空记录
//			sql = "insert into personnel(staffcode,staffname,password,deptcode) values('000115','xxoo','aaa','0001')";
//			stmt.execute(sql);
//			con.commit();
			
			
			//***********************SQL*****************************
			sql = "select * from personnel per where per.staffcode = '000114' for update";//设置更新,需要con.setAutoCommit(false)
			sql = "select * from personnel per where per.staffcode = '000101'";
//			sql = "select * from personnel " ;
			
			
			ResultSet rs = stmt.executeQuery(sql);
			List<Personnel> personnellist = new ArrayList<Personnel>();
			
			while(rs.next()){
				
				Personnel personnel = new Personnel();
				personnel.setStaffcode(rs.getString("staffcode"));
				personnel.setStaffname(rs.getString("staffname"));
				personnel.setPhoto(rs.getBytes("photo"));
				
				/*for update 将图片写入数据库*/
//				BLOB blob = ((OracleResultSet)rs).getBLOB("photo");
//				OutputStream out = blob.getBinaryOutputStream();
//				InputStream in = new FileInputStream(new File("C:\\image\\haha2.gif"));
//				int size = blob.getBufferSize();
//	            byte [] buf = new byte[size];
//	            int count = 0;
//	            while((count = in.read(buf)) != -1) {
//	                out.write(buf, 0, count);
//	            }
//	            in.close();
//	            out.close();
				
				/*从数据库读取图片*/
				BLOB blob2 = ((OracleResultSet)rs).getBLOB("photo");
	            InputStream in2 = blob2.getBinaryStream();
	            OutputStream out2 = new FileOutputStream(new File("C:\\image\\haha5.jpg"));
	            int size2 = blob2.getBufferSize();
	            byte [] buf2 = new byte[size2];
	            int count2 = 0;
	            while((count2 = in2.read(buf2)) != -1) {
	                out2.write(buf2, 0, count2);
	            }
	            in2.close();
	            out2.close();
	            
				personnellist.add(personnel);
			}
			
			con.commit();
			
			for(Personnel pp : personnellist){
//注意pp.getPhoto().length 
				System.out.println(pp.getStaffcode() + ":: " + pp.getStaffname() + " :: " + pp.getPhoto().length );
			}
			
			is.close();
			os.close();
			bis.close();
			fos.close();
			con.close();
			buffer = null;
			photo = null;
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} 
	}

}


struts2存储


FileInputStream fis = null;
//		OutputStream os = null;
		try {
			fis = new FileInputStream(file);
			byte[] buffer = new byte[fis.available()];
			fis.read(buffer);
//			os = new ByteArrayOutputStream();
//			int b;
//			while(( b = fis.read()) != -1) {
//				os.write(b);
//			}
//			
			System.out.println(buffer.length);
			personnel.setPhoto(buffer);
			personnelService.addPersonnel(personnel);
//			fis.read(personnel.getPhoto());
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if( fis != null ) {
				try {
					fis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

struts2读取

HttpServletResponse response = null;
		ServletOutputStream out = null;
		InputStream in = null;
		byte [] bytes = null;
		personnel = personnelService.findPersonnel(staffcode);
		
		try {
			response = ServletActionContext.getResponse();
			response.setContentType("image/jpeg");
			out = response.getOutputStream();
			in = new ByteArrayInputStream(personnel.getPhoto());
			
			bytes = new byte [ in.available() ];
			while ( -1 != in.read( bytes ) ) {
				out.write( bytes );
			}
			
			out.flush();
//			out.close();
//			out = null;
//			response.flushBuffer();
//			out.clear();
//			out = pageContext.pushBody();
		} catch (IOException e) {
			e.printStackTrace();
		} catch ( Exception e ) {
             e.printStackTrace();
        }
		finally {
            if ( in != null ) {
                try {
                     in.close();
                } catch ( IOException e ) {
                     e.printStackTrace();
                }
           }
           if ( out != null ) {
        	   try {
                out.close();
	           } catch ( IOException e ) {
	                e.printStackTrace();
	           }
           }
           bytes = null;
		}
分享到:
评论
1 楼 wenquan4004 2009-04-08  
粘贴下自己修改后的代码片段:
存储到数据库
FileInputStream fis = null;
		fis = new FileInputStream(file);
		byte[] buffer = new byte[fis.available()];
		fis.read(buffer);
		Blob blob = new BlobImpl(buffer);
		personnel.setPhoto(blob);
		personnelService.addPersonnel(personnel);

从数据库读取(没有使用StreamResult和其他的方法,
表现形式和servlet别无二致,存储下留待以后查看)
HttpServletResponse response = null;
		ServletOutputStream out = null;
		InputStream in = null;
		personnel = personnelService.findPersonnel(staffcode);

		if (personnel == null) {
			throw new SystemException("没有这个人!");
		}

		try {
			response = ServletActionContext.getResponse();
			response.setContentType("image/jpeg");
			out = response.getOutputStream();
			Blob blob = personnel.getPhoto();
			in = blob.getBinaryStream();

			FileCopyUtils.copy(in, out);

		} catch (IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (in != null) {
				try {
					in.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (out != null) {
				try {
					out.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

		return null;

相关推荐

    Caused by: java.sql.SQLException: JZ0SJ: 没有在此数据库中发现元数据存取器信息。 请按 jConnect 文档中所述安装

    请按 jConnect 文档中所述安装”是一个典型的错误信息,表明在尝试使用Java数据库连接(JDBC)驱动程序访问数据库时遇到了问题。这个错误代码JZ0SJ特指元数据存取器(Metadata Accessor)未找到,这通常是由于缺少...

    java存图片到数据库

    这个小测试项目展示了如何通过Java处理图片流并将它们存储到数据库中,然后再取出。以下是关于这个过程的一些关键知识点: 1. **图片转二进制流**: 在Java中,我们可以使用`java.io`包中的`FileInputStream`或`...

    Java 用于学习简单的数据库中间件

    通过这个简单的Java数据库中间件项目,你可以系统地学习和实践以上知识点,进一步提升你的Java编程和数据库技术能力。在实践中不断探索和优化,你将能够构建出更复杂、功能更完善的数据库中间件系统。

    java 数据库编程宝典

    在数据存取对象(DAO)模式方面,书中的内容将指导读者如何设计和实现DAO层,以分离业务逻辑和数据访问逻辑,提升代码的可维护性和可测试性。同时,书中还会涉及如何使用Java Persistence API (JPA) 和Hibernate等...

    Java课程设计---swing带GUI界面学生宿舍管理系统(源码+数据库+实践报告) .rar

    5. 测试与优化:介绍系统的测试方法,包括单元测试和集成测试,以及性能优化的过程。 6. 结果与总结:展示系统的最终效果,对项目进行总结,提出改进意见和未来展望。 通过这个项目,学习者不仅可以掌握Java编程和...

    Dreamweaver开发的程序与数据库的连接

    在Web开发中,数据库连接是指应用程序通过特定的连接字符串和认证信息与数据库服务器建立通信的通道。这通常涉及到数据库驱动程序(如PHP的PDO或Java的JDBC),这些驱动程序允许程序与数据库进行数据交换。 在...

    redis数据库java开发测试demo

    在这个"redis数据库java开发测试demo"项目中,我们将探讨如何在Java Web应用程序中集成Redis,进行数据的存取和测试。 首先,我们需要在项目中添加Jedis的依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下...

    Oracle数据库大对象数据存取的两种实现方法及时间性能比较.pdf

    标题中的“Oracle数据库大对象数据存取的两种实现方法及时间性能比较”指的是在Oracle数据库中处理大对象(LOB)数据的两种不同方法,并对比它们的性能。Oracle数据库中的大对象数据通常指的是非结构化的数据,如...

    Mongodb + GridFS +Java 操作Mongodb中存储的文件

    在这个Java操作MongoDB中存储的文件实例中,我们将探讨如何利用GridFS API进行文件的存取。 首先,我们需要在Java项目中引入MongoDB的驱动库。目前,Java驱动通常使用的是MongoDB Java Driver,可以在Maven仓库中...

    Java版的学生选课管理系统数据库采用的是mysql,窗体版

    8. **测试与调试**: 开发完成后,系统需经过严格的测试,包括单元测试、集成测试和系统测试,确保各个功能的正常运作。开发者可能使用JUnit等工具进行自动化测试,并利用IDE的调试功能定位和修复问题。 综上所述...

    java数据库课程设计_简易餐厅管理系统

    【Java数据库课程设计_简易餐厅管理系统】是一门实践性课程,旨在让学生掌握Java编程语言以及数据库设计的基础知识,通过设计并实现一个简单的餐厅管理系统来提升实际操作能力。在这个项目中,参与者将扮演三种角色...

    简单的商品信息管理系统(Java 和MySQL数据库)增删改查傻瓜式教程视频

    在这个“简单的商品信息管理系统”教程中,我们将深入探讨如何使用Java编程语言与MySQL数据库结合,构建一个基础的增删改查(CRUD)系统。这个系统对于初学者来说是一个很好的起点,因为它涉及到许多核心的IT概念和...

    数据库框架ormlite和单元测试框架junit的使用

    ORMLite(Object-Relational Mapping Lite)是一种轻量级的Java ORM框架,它允许开发者将数据库操作与对象模型相结合,简化了数据库应用的开发过程。ORMLite提供了方便的方法来创建、查询、更新和删除数据库中的数据...

    广工数据库课设(java)

    在这个项目中,很可能是使用关系型数据库管理系统(如MySQL或Oracle),因为它们适合处理结构化的数据,且与Java有良好的集成。 其次,Java作为后端开发语言,用于实现业务逻辑和数据库交互。在Java中,通常会使用...

    测试数据库连接

    在IT行业中,数据库是存储和管理数据的核心工具,而测试数据库连接是确保应用程序能够正常与数据库交互的关键步骤。本文将详细介绍如何测试数据库连接,以及如何使用数据库命令进行基本操作,如增、删、改、查。 ...

    简单的JAVA版公司人事管理系统 使用SQL数据库

    13. **测试与调试**:在开发过程中,单元测试、集成测试和压力测试是必不可少的,确保系统的正确性和性能。 以上是Java版公司人事管理系统的一些关键知识点,涵盖后端开发、数据库管理和系统设计等多个方面。实际...

    自定义的数据库连接池

    数据库连接池是数据库管理中的重要概念,它在Java Web应用中尤其常见,主要用于优化数据库的连接管理和资源利用。自定义数据库连接池是为了更好地适应特定应用的需求,提高数据存取的效率,减少系统开销,避免频繁...

    EasyModels 测试版2(读数据库自动生成C#和JAVA类文件)

    《EasyModels测试版2:数据库驱动的C#与JAVA实体类生成器》 在软件开发过程中,特别是涉及到数据库操作的应用程序,数据模型的构建是一项重要的基础工作。开发者常常需要手动编写与数据库表对应的实体类,这既耗时...

    JAVA课程设计-银行存取管理系统(所有代码).pdf

    JAVA课程设计银行存取管理系统 本篇文章主要介绍了一个基于JAVA的银行存取管理系统的设计和实现。该系统的主要功能包括用户注册、登录、取款、存款、转账、修改密码、查询余额和查询修改信息等。系统的设计主要分为...

    Java访问SQL数据库的优化探讨 (1).pdf

    Java语言在电子平台中的应用越来越广泛,随着Java技术的成熟,如何高效地访问数据库成为了一个重要的问题。数据库存储着大量数据,其访问效率直接关系到整个应用程序的性能。Java通过JDBC(Java Database ...

Global site tag (gtag.js) - Google Analytics