`

向数据库中放置和取出文件

阅读更多
一般情况下,我们是不会向数据库中存储文件或者图片等东西,而我们大部分情况下是存储这些文件在 web 项目中的路径的。我这里仅仅是为了练习一下!所以才将文件存储在数据库中,仅仅是简单的实现一下!


至于导入第三方jar包,仅仅是一个连接MySQL数据库的jar包,其他的没有!

创建数据库的SQL语句-----------使用的是MySQL数据库

create table stu(
	id int primary key auto_increment,
	name varchar(30),
	pic mediumBlob, --放入图片或其他二进制文件
	des text -- 放入大文本
)



JdbcUtils.java


package com.syh.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JdbcUtils {
	
	/**
	 * 回滚事务
	 */
	public static void rollback(Connection conn){
		if(conn != null)
			try {
				conn.rollback();
			} catch (SQLException e) {
				e.printStackTrace();
			}
	}
	
	/**
	 * 提交事务
	 */
	public static void commit(Connection conn){
		if(conn != null)
			try {
				conn.commit();
			} catch (SQLException e) {
				e.printStackTrace();
			}
	}
	
	/**
	 * 开始事务
	 */
	public static void beginTransaction(Connection conn){
		if(conn != null)
			try {
				conn.setAutoCommit(false);
			} catch (SQLException e) {
				e.printStackTrace();
			}
	}
	
	public static Connection getOracleConnection() throws Exception{ 
		Connection connection = null;
		
		//1. 获取链接
		String driver = "oracle.jdbc.driver.OracleDriver";
		String url = "jdbc:oracle:thin:@localhost:1521:orcl";
		String user = "system";
		String password = "orcl";
		
		Class.forName(driver);
		connection = DriverManager.getConnection(url, user, password);
		
		return connection;
	}
	
	/**
	 * @return Connection 对象
	 * @throws Exception   
	 */
	public static Connection getConnection() throws Exception{ 
		Connection connection = null;
		
		//1. 获取链接
		String driver = "com.mysql.jdbc.Driver";
		String url = "jdbc:mysql://localhost:3306/itcast";
		String user = "root";
		String password = "root";
		
		Class.forName(driver);
		connection = DriverManager.getConnection(url, user, password);
		
		return connection;
	}
	
	/**
	 * 释放数据库资源
	 * @param rs
	 * @param st
	 * @param conn
	 */
	public static void releaseResource(ResultSet rs, Statement st, Connection conn){
		try {
			if(rs != null)
				rs.close();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally{
			try {
				if(st != null)
					st.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} finally{
				try {
					if(conn != null)
						conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}								
			}
		}
	}
	
}




JdbcTest.java

因为仅仅是联系,所以没有使用main方法,而是用了JUnit 4测试一下!

package com.syh.test;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;


import org.junit.Test;


public class JdbcTest {

	/**
	 * 测试将文件放到数据库中
	 */
	@Test
	public void testSetBolb() {
		Connection conn = null ;
		//1. 只能使用 PreparedStatement, 因为图片不能拼写到字符串中的
		PreparedStatement pstmt = null ;
		
		try {
			conn = JdbcUtils.getConnection() ;
			String sql = "INSERT INTO stu (name, pic, des) VALUES (?, ?, ?)" ;
			pstmt = conn.prepareStatement(sql) ; 
			
			pstmt.setString(1, "Tom") ;
			//2. 通过 pstmt.setBlob(parameterIndex, inputStream); 填入 Blob 对应的占位符
			//这个文件是在当前 web 项目的根目录下
			pstmt.setBlob(2, new FileInputStream("pic.jpg")) ;
			pstmt.setString(3, "PIC") ;
			
			pstmt.executeUpdate() ;
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtils.releaseResource(null, pstmt, conn) ;
		}
		
	}
	
	
	/**
	 * 测试将文件取出来
	 */
	@Test
	public void testGetBolb() {
		Connection conn = null ;
		PreparedStatement pstmt = null ;
		ResultSet rs = null ;
		
		try {
			conn = JdbcUtils.getConnection() ;
			String sql = "SELECT id, name, pic, des FROM stu WHERE id = 1" ;
			pstmt = conn.prepareStatement(sql) ;
			rs = pstmt.executeQuery() ;
			
			//因为这里仅仅取得一个对象,所以用 if 而不是用 while
			if(rs.next()) {
				int id = rs.getInt(1) ;
				String name = rs.getString(2) ;

				//1. 利用 ResultSet 的 getBlob() 方法获取 Blob 字段的值
				Blob pic= rs.getBlob(3) ;
				
				//2. 调用 Blob 对象的 getBinaryStream(); 获取输入流
				InputStream is = pic.getBinaryStream() ;
				
				//3. 利用 java 的 IO 技术把 2 得到的输入流输出为硬盘上的一个文件,
				//如果没有指定文件具体生成的位置,默认是当前 web 项目的根目录下,如何没有即使出现,刷新当前 web 项目一下就可以了
				FileOutputStream fos = new FileOutputStream("newPic.jpg") ;
				
				byte[] temp = new byte[1024] ;
				int len = 0 ;
				
				while((len = is.read(temp)) != -1) {
					fos.write(temp, 0, len) ;
				}
				
				is.close() ;
				fos.flush() ;
				fos.close() ;
				
				String desc = rs.getString(4) ;
				
				System.out.println(id + ", " + name + ", " + desc);
				
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtils.releaseResource(rs, pstmt, conn) ;
		}
	}
	
}



分享到:
评论

相关推荐

    PB9数据库存取图片

    - 在PB9中,你可以创建一个窗口(Window),并在窗口上放置一个“打开文件”对话框控件(Open File Dialog),让用户选择要上传的图片。 - 用户选择图片后,你可以使用`OpenFileDialog`对象的`FileName`属性获取...

    如何利用剪贴板编程实现在数据库中存取RTF数据

    4. **从数据库读取**:当需要从数据库中取出RTF数据时,先查询出Base64编码的二进制数据,然后解码回字节流。 5. **转换回RTF格式**:将解码后的字节流转回RTF格式,再用对应的库或API还原成可读的RTF文本。 6. **...

    数据库的连接池原理,基本概念及原理,服务器自带的连接池

    可以设计一个符合单例模式的连接池管理类,在连接池管理类的唯一实例被创建时读取一个资源文件,其中资源文件中存放着多个数据库的 url 地址、用户名、密码等信息。 * 事务处理:我们知道,事务具有原子性,此时...

    数据库连接池

    当应用程序请求一个数据库连接时,连接池会从池中取出一个现有的连接供其使用;当应用程序使用完毕后,连接不会被关闭,而是被放回连接池中以备再次使用。这种方式可以显著减少建立和销毁连接的时间,从而提高应用...

    android复制数据库到SD卡打开加载listview

    首先,我们需要创建一个SQLite数据库,通常在`assets`目录下放置预填充的数据库文件。这个文件在应用首次运行时会被复制到设备的外部存储(即SD卡)。这样做可以方便地在应用安装时提供初始数据,而无需在代码中动态...

    东北大学20春《数据库技术》在线平时作业1答案.docx

    通过文件组,管理员可以将相关的数据文件归类在一起,并根据性能需求和磁盘空间分布策略将它们放置在不同的物理磁盘上。 #### 3. ASP 程序代码嵌入 HTML 文件的方法 - **知识点**: 如何在 HTML 文件中嵌入 ASP ...

    VSS使用说明手册(转)

    - **取出(Get)**:如果只是需要查看文档而不进行编辑,可以通过取出命令将文档放置到本地工作文件夹中,然后使用查看命令查看文档的最新版本。 #### 三、VSS中的项目管理 - **项目的概念**:在VSS中,项目是指存储...

    PB实现拖拽或粘贴文件

    在IT行业中,PowerBuilder是一款强大的可视化数据库应用开发工具,尤其适用于构建企业级的桌面和Web应用程序。本主题将深入探讨如何在PowerBuilder中实现文件的拖放(Drag and Drop)和复制粘贴功能,这对于提高用户...

    使用DBCP链接池详解附加代码例子

    1. 添加依赖库:在Tomcat的`common\lib`目录下,需要放置`naming-factory-dbcp.jar`和`commons-pool.jar`这两个JAR文件,它们是DBCP连接池实现的核心。 2. 创建`context`文件:在`conf\Catalina\localhost`目录下...

    基于模板的代码生成器LKGenerator1.1.0_x86

    配置正确后即可正确读取出数据库中的相关表和表中字段。 (2)生成的代码路径可根据需要进行灵活配置,如果没有配置默认为:d:\.LKGenerator\dest-beans (3)提供了根据数据表生成代码的相关配置,可以配置去掉表...

    基于模板的代码生成器LKGenerator1.1.0_x64

    配置正确后即可正确读取出数据库中的相关表和表中字段。 (2)生成的代码路径可根据需要进行灵活配置,如果没有配置默认为:d:\.LKGenerator\dest-beans (3)提供了根据数据表生成代码的相关配置,可以配置去掉表...

    区域横向重复-asp

    每次迭代,我们将当前记录的数据取出,并在HTML中并排放置。为了实现"横向重复",我们需要维护一个计数器,当达到预设的并排显示数量时,换行开始新的列。例如: ```vbscript Dim counter counter = 1 Response....

    OceanStor 18x10, 18x10F系列 V500R007 Kunpeng 卧式机柜 包装拆卸指导书

    华为OceanStor系列是企业级的集中式存储解决方案,融合了块、文件和对象存储服务,适用于大数据分析、云计算、数据库应用等多种场景。该系列产品的设计目标是提供高性能、高可用性和可扩展性,以满足现代数据中心...

    Java EE常用框架.xmind

    FormAuthenticationFilter拦截住取出request中的username和password(两个参数名称是可以配置的) FormAuthenticationFilter 调用realm传入一个token(username和password) realm认证时根据username...

    Eclipse应用环境搭建

    将DAT项目的源码从版本控制系统(如VSS)中取出,放置到`code`文件夹内。 接下来,启动Eclipse,选择我们之前创建的`workspace`作为开发环境。进入工作空间后,我们将创建一个新的Java工程来承载DAT项目。在新建...

    5220刷机教程.pdf

    确保刷机包正确无误地解压并放置到凤凰软件的产品目录下,例如C:\Program\Nokia\Phoenix\Products,这是凤凰软件查找刷机文件的位置。 接下来,手机的准备工作也很关键。将手机连接到电脑,切换到PC套件模式,这样...

    行业文档-设计装置-智能图书自动取放装置.zip

    2. **机械结构设计**:装置的机械部分包括书架、取放臂、传送带等,它们需要精密设计以确保图书的稳定放置和安全取出。机械结构设计需考虑负载能力、运动精度和耐用性。 3. **传感器应用**:装置可能配备多种传感器...

Global site tag (gtag.js) - Google Analytics