用过数据库的人都知道,像文件、图片、视频等这些大对象可以用两种方式来存取:1.将这些对象放到服务器的某个文件中,将它们的路径保存到数据库;2.直接将这些文件对象以二进制形式保存到数据库中,用时再通过流对象读取出来。
可能大多数人采用第一种方式,这里我主要试下第二种方式保存数据,原理主要是通过Oracle里面的BLOB数据类型来实现。
这个示例主要是将页面的学生信息录入数据库,然后点击查看按钮马上可以查看当前保存用户的资料,实现截图如下:
新建一张学生表,字段如下:
Student类
/**
* 学生类
*
*/
public class Student {
private int id;
private String sex;
private String username;
private String picName;
public String getPicName() {
return picName;
}
public void setPicName(String picName) {
this.picName = picName;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String toString() {
return "id: " + id + " username: " + username + " sex: " + sex;
}
}
Oracle数据库连接
/**
* 与Oracle数据库连接
*
*/
public class OracleConnection {
private static String ojdbcURL = "jdbc:oracle:thin:@localhost:1521:xe";
private static String ojdbcDriver = "oracle.jdbc.driver.OracleDriver";
private static String userName = "czc";
private static String password = "netjava";
private static Connection connec;
public static Connection getConnec() {
if (connec != null) {
return connec;
}
try {
Class.forName(ojdbcDriver);
connec = DriverManager.getConnection(ojdbcURL, userName, password);
System.out.println("与oracle数据库连接成功...");
} catch (Exception e) {
System.out.println("与oracle数据库连接失败...");
e.printStackTrace();
}
return connec;
}
}
Student操作类
/**
* 数据操作
*/
public class StudentDAO {
/**
* 将学生信息保存到数据库
*
* @param stu:学生对象
* @return :是否成功
*/
public boolean savaStuMsg(Student stu) {
try {
// 取得数据库连接对象
Connection connec = OracleConnection.getConnec();
// 写插入SQL
String sql = "insert into student(name,sex,picture) values(?,?,?)";
// 得到预编译对象
PreparedStatement pstm = connec.prepareStatement(sql);
pstm.setString(1, stu.getUsername());
pstm.setString(2, stu.getSex());
// 创建一个文件输入流对象
FileInputStream fins = new FileInputStream(stu.getPicName());
// 将图片以二制数据保存到数据库
pstm.setBinaryStream(3, fins, fins.available());
pstm.addBatch();
pstm.executeBatch();
System.out.println("学生信息保存成功!");
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
* 根据学生名字查询学生信息
*
* @param username:姓名
* @return
*/
public Student getStuMsg(String username) {
try {
Connection connec = OracleConnection.getConnec();
// 注:where后varchar字段必须加''
String sql = "select id,sex from student where name='" + username
+ "'";
Statement stmt = connec.createStatement();
ResultSet rset = stmt.executeQuery(sql);
Student stu = new Student();
if (rset.next()) {
stu.setId(rset.getInt("id"));
stu.setSex(rset.getString("sex"));
stu.setUsername(username);
}
return stu;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 查找要显示图片
*
* @param id:图片id
* @return:缓冲输入流
*/
public BufferedInputStream getPicMsg(int id) {
// 定义一个BLOB对象,这是一种数据对象,关键是这个BLOB对象的作用
BLOB blob = null;
try {
Connection connec = OracleConnection.getConnec();
String sql = "select picture from student where id=" + id;
Statement stmt = connec.createStatement();
ResultSet rset = stmt.executeQuery(sql);
if (rset.next()) {
// 得到图片BLOB对象
blob = (BLOB) rset.getBlob("picture");
}
// 得到图片输入流
InputStream in = blob.getBinaryStream();
// 包装成缓冲输入流
BufferedInputStream bfin = new BufferedInputStream(in);
return bfin;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
SaveServlet:处理页面提交信息的Servlet类
/**
* 将提交上来的数据保存到数据库
*
*/
public class SaveServlet extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String username = request.getParameter("username");
String sex = request.getParameter("sex");
String picture = request.getParameter("picture");
System.out.println("username:" + username + " sex:" + sex + " picture:"
+ picture);
// 创建一个学生对象
Student stu = new Student();
stu.setUsername(username);
stu.setSex(sex);
stu.setPicName(picture);
// 将学生信息保存到数据库
StudentDAO sdao = new StudentDAO();
boolean isSuccess = sdao.savaStuMsg(stu);
if (isSuccess) {
//将学生的名字放到request中
request.setAttribute("username", username);
request.getRequestDispatcher("/success.jsp").forward(request, response);
}else{
request.getRequestDispatcher("/error.jsp").forward(request, response);
}
}
}
SelectServlet:将保存的学生对象信息查询出来的Servlet
/**
* 将保存的学生查找出来
*
*/
public class SelectServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String username = request.getParameter("username");
System.out.println("要查询的学生名字是: " + username);
StudentDAO sdao = new StudentDAO();
// 根据学生名字得到学生对象
Student stu = sdao.getStuMsg(username);
if (stu != null) {
// 将对象放到session对象中
request.getSession().setAttribute("stu", stu);
request.getRequestDispatcher("/display.jsp").forward(request, response);
}
}
}
核心代码--DisplayServlet:显示图片的Servlet
/**
* 处理显示图片的servlet:将图片显示到页面
*
*/
public class DisplayServlet extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("image/jpg");
// 从session对象中得到学生对象
Student stu = (Student) request.getSession().getAttribute("stu");
// 得到图片流对象
StudentDAO sdao = new StudentDAO();
BufferedInputStream bfin = sdao.getPicMsg(stu.getId());
// 将ServletOutputStream包装成BufferedOutputStream
BufferedOutputStream bout = new BufferedOutputStream(response
.getOutputStream());
int i = 0;
while ((i = bfin.read()) != -1) {
bout.write(i);
}
bfin.close();
bout.flush();
bout.close();
}
}
display.jsp:显示学生信息的JSP页面
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page import="cn.netjava.pojo.Student"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>学生信息</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
//得到学生对象
Student stu =(Student)request.getSession().getAttribute("stu");
%>
<div style="text-align:center">
<table>
<caption>学生信息</caption>
<tr>
<td>姓名</td>
<td><%=stu.getUsername()%></td>
<!-- 核心代码:显示图片 -->
<td rowspan="2"><img src="DisplayServlet"></img></td>
</tr>
<tr>
<td>性别</td>
<td><%=stu.getSex()%></td>
</tr>
</table>
</div>
</body>
</html>
这个示例的代码已打包,如果有人感兴趣,或有人有更好的实现方法,欢迎大家一起讨论。
- 大小: 15.2 KB
- 大小: 10.7 KB
- 大小: 9.3 KB
- 大小: 11.4 KB
分享到:
相关推荐
当涉及到图像等非结构化数据时,一种常见的方法是将图片以二进制形式存入数据库。这种方法被称为“二进制大对象”(Binary Large Object,简称BLOB)。下面将详细阐述如何实现图片以二进制形式存入数据库,并从...
本示例主要涉及的是如何将图片通过BASE64编码加密后存入数据库的Blob类型字段,并能从数据库中取出这些数据再还原成原始图片。以下是相关知识点的详细说明: 1. **BASE64编码**:BASE64是一种用于将二进制数据转换...
通过以上步骤,我们成功地实现了在Java程序中读取Oracle数据库BLOB字段中存储的图片,并在前端页面上显示出来。此方法不仅适用于图片,还可以扩展到其他类型的二进制数据,如音频、视频等文件。这对于构建多媒体应用...
最后,将从数据库获取的字节流转回图片并显示。这一步通常在前端完成,通过HTTP响应将字节流发送给浏览器,浏览器会自动解析并显示图片。在服务器端,我们可以使用`ServletOutputStream`将字节流写入HTTP响应。 `...
在 SQL Server 中,Image 类型用于存储二进制大对象(BLOB),如图像、音频、视频等。Image 类型可以存储大量数据,但由于其存储方式和检索机制的限制,Image 类型数据的读写效率较低。 CLOB 字段在 Oracle 中的...
本文将详细讲解如何实现这个功能,包括图片的上传、存储到数据库以及从数据库中取出并显示。 首先,我们需要创建一个HTML表单来让用户选择他们想要上传的图片。表单通常包含一个`<input type="file">`元素,允许...
本示例主要讲解如何在Oracle数据库中操作Blob类型的数据,包括插入和取出。 首先,我们需要理解Oracle数据库对Blob类型的处理。Blob是Oracle中的一个大对象数据类型,它可以存储最多4GB的二进制数据。Blob数据可以...
1. **图片转二进制流**: 在Java中,我们可以使用`java.io`包中的`FileInputStream`或`BufferedInputStream`类读取图片文件并将其转换为字节流。通过调用`read()`方法,我们可以逐字节地读取文件内容,然后将其存储...
下面将详细介绍如何在Oracle中进行汉字转拼音,并提供相关的SQL语句示例。 一、Oracle中的汉字转拼音原理 Oracle数据库提供了名为`UTL_I18N`的包,其中包含了处理多语言字符集的函数。在处理汉字转拼音时,我们...
本篇文章将详细讲解如何从Oracle数据库中下载Blob数据并将其转化为图片文件保存到本地。 首先,我们需要了解Blob数据是如何存储在数据库中的。Blob数据类型可以存储最多4GB的数据,并且它不包含任何关于数据内容的...
- **定义**:Spfile 是一种二进制格式的文件,用于存储 Oracle 数据库实例启动时所需的参数。这种格式确保了较高的安全性和效率,但同时也意味着它不能通过普通的文本编辑器(如 vi 或 vim)进行编辑。 - **位置**...
4. **图片读取**:读取图片通常涉及打开图片文件,将其内容转换成二进制流,然后存入数据库中的BLOB字段。易语言中可以使用“读文件到缓冲区”命令读取文件,再用“转换为字节集”将缓冲区内容转换为适合数据库存储...
Oracle数据库是世界上最流行的数据库管理系统之一,它提供了丰富的内置函数,以方便用户进行数据处理和查询。以下是一些在Oracle中常用的函数,这些函数在数据库操作中扮演着重要角色。 1. ASCII函数:ASCII函数...
取出图像时,程序查询数据库,获取`ImageData`字段的二进制数据,再将其写入到响应中,供客户端浏览器解析显示。 这个实例可能包含了实现这一功能的源码,包括数据库连接代码、SQL语句以及读写二进制数据的函数。...
在IT行业中,数据库不仅仅是用来存储结构化数据,如数字、字符串和日期,有时也需要存储非结构化数据,比如图片、文档和其他二进制大对象(BLOB)。标题“向数据库中放置和取出文件”涉及的就是如何在数据库系统中...
因为文件每次只能读取32.765KB,因此需要计算文件的总大小,并通过循环方式分批次读取大型图形文件,并将其保存在长二进制类型的变量中。 4. **写入数据库**:最终通过调用`UpdateBlob()`函数将长二进制类型的数据...
例如,INSTR('oracle traning','ra',1,2)返回9,表示第二个'ra'的位置。 6. LENGTH函数:计算字符串的长度,不包括空格。在示例中,LENGTH('高乾竞')返回3,LENGTH('北京市海锭区')返回6。 7. LOWER函数:将所有...
最后,从数据库中取出图像数据并显示。可以使用SQL SELECT语句获取图像数据,然后将Blob数据写入一个临时文件,再用TImage组件加载这个临时文件,或者直接将Blob数据赋值给TImage的Bitmap属性。 在Delphi提供的MHT...
例如,INSTR('oracle traning', 'ra', 1, 2)将返回9,表示从第一个字符开始,第二个'ra'的位置。 6. LENGTH函数:LENGTH函数返回字符串的长度,不包括结束的空格。例如,LENGTH('高乾竞')返回3。 7. LOWER函数:将...