`

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

阅读更多
一般情况下,我们是不会向数据库中存储文件或者图片等东西,而我们大部分情况下是存储这些文件在 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) ;
		}
	}
	
}



分享到:
评论

相关推荐

    vss如何使用(图解)

    VSS概述 Microsoft Visual SourceSafe是美国微软公司出品的版本控制系统,简称...该文件仍然存在于你的VSS数据库和其它共享该文件的项目中,你可以恢复它。此命令同样适用于项目。 1) 选择文件或项目; 2) 选择file...

    visual source safe 教程

    此外,当Destroy 和Destroy Permanently命令用于共享文件时,它只作用于当前文件夹,其它共享的文件夹仍然保留该文件,该文件依然保存在VSS数据库中。 1) 选择文件或项目; 2) 选择file菜单中的delete命令; 3) ...

    Visual stdio source safe 教程

    VSS是存储和管理文件的工具,但是编辑和编译文件必须在VSS指定文件夹中进行。这个文件夹叫工作文件夹,它可以是现存的文件夹,也可以是VSS新建的文件夹。VSS浏览器在文件列表上方显示了文件的工作文件夹的路径。 在...

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

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

    UEditor入门基础

    在editor_config.js文件中找到initialContent参数,设置其值为需要的提示或者问候语即可,如initialContent:’欢迎使用UEditor!’。 场景二:编辑旧文章,从数据库中取出富文本放置到编辑器中。 显然,编辑文章时...

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

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

    Java EE常用框架.xmind

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

    Customer-Managment-Page-w--Python:使用python,SQlite和pyqt5 framewrok创建的具有CRUD功能的基本GUI。 这是一个不完整的项目,应该是一个员工管理系统

    带Python的客户管理页面 使用python,SQlite和pyqt5 framewrok创建的具有... 注意***看来您需要在Finalproject.exe外部取出appDb.db和customerDB.db并将其放置在刚好超出上述文件夹的环境中,并且与.vscode处于同一环

    会计理论考试题

    23.如果要把C盘某个文件夹中的一些文件复制到C盘的另外一个文件央中,在选定文件后,若采用拖放操作,可以用___B___目标的方法。 A、直接拖至 B、Ctrl十拖至 C、Alt十拖至 D、单击 24.Windows98中的磁盘的根文件夹是...

    蓝焰设计站图文管理系统

    ⑶ 新闻阅读:在其他页面中点击标题链接即进入新闻阅读页面,此时,每条新闻的详细信息将被取出,包括内容、标题、关键字等,并按照相对固定的格式放置在页面的不同区域,所有新闻使用大致相同的页面布局,只是各...

    易语言程序免安装版下载

    修改外部数据库在4.12版中导致的不兼容问题,并增加了对MS SQL Server数据库中image和text字段类型的说明。 7. 修改扩展界面支持库一,禁止透明标签在父窗口刷新时自动刷新,以解决其导致窗口刷新缓冲的问题。 8....

    数据透视表SQL语句入门

    上面那一句SQL语句的意思就是:从表材料进货明细表中取出定额名称及规格的值 例2、查询材料进货明细表的详细记录 SELECT * FROM [材料进货明细表$] 等价于: SELECT 序号, 定额名称,规格,日期,单位,数量 FROM ...

    powerbuilder

    需要注意的是,在Windows95和Windows NT 3.51以后的版本中,使用PrintSetup()函数设置的打印机设置只对当前应用起作用,并不影响其它应用的打印机设置。对Windows 3.1来说,使用PrintSetup()函数设置的打印机设置...

    LINGO软件的学习

    一个集部分可以放置于模型的任何地方,但是一个集及其属性在模型约束中被引用之前必须定义了它们。 2.3.1 定义原始集 为了定义一个原始集,必须详细声明: •集的名字 •可选,集的成员 •可选,集成员的属性 定义一...

    PT80-NEAT开发指南v1.1

    版权和许可条款 ...................................................................................................................................... 1 第二章 PT80 开发入门 ..............................

Global site tag (gtag.js) - Google Analytics