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

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

至于导入第三方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) ;
}
}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值