大字段共分两种,一是clob,即长文本。通常用来存储超过一定数量的(如4000)的字符,一是blob,即二进制字节数据,通常就是用户提交的附件
这里假定ssh+mysql的开发环境已配置完成。通过设计一个用户管理程序来举例说明针对mysql的大字段处理方法
一、数据库字段定义
CREATE TABLE `users` (
`enable` int(11) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`account` varchar(255) DEFAULT NULL,
`id` int(11) NOT NULL AUTO_INCREMENT,
`resume` text,
`photo` blob,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8
上面的resume字段用来存储长文本,类型定义为text,photo字段用来存储附件,类型定义为blob
二、POJO配置
User.java:
import java.sql.Blob;
import java.sql.Clob;
@Entity
@Table(name="users")
public class User {
private Integer id;
private String account;
private String password;
private Integer enable;
private String resume; //定义为string,对应数据库中resume(text)字段
private Blob photo; //定义为blob类型,对应数据库中photo(blob)字段
@Id
@GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getEnable() {
return enable;
}
public String getSummary() {
return summary;
}
public void setSummary(String summary) {
this.summary = summary;
}
public Blob getResume() {
return resume;
}
public void setResume(Blob resume) {
this.resume = resume;
}
public void setEnable(Integer enable) {
this.enable = enable;
}
}
三、配置struts的action
dao和service层没有什么特别的。也不需要特别处理,关键在struts 的action.
a 要配置附件接收属性,如:
private File file;
private String fileFileName;
private String fileContentType;
b 长文本字段由于在POJO里已配置为String,不需要特别处理
privage String resume
c 处理思路是通过hibernate将输入流转换为clob和blob之后再作持久化
UserAction.java:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.sql.Blob;
import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;
import org.hibernate.Hibernate;
import org.springframework.beans.factory.annotation.Autowired;
import cn.ibeans.ssh.users.model.User;
import cn.ibeans.ssh.users.service.UserManager;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
private static final long serialVersionUID = 3345502231566725471L;
private static Logger logger = Logger.getLogger(UserAction.class);
private User user;
private UserManager userManager;
//以下三项是struts处理文件上传的约定风格
private File photo;
private String photoFileName;
private String photoContentType;
public File getPhoto() {
return photo;
}
public void setPhoto(File photo) {
this.photo = photo;
}
public String getPhotoFileName() {
return photoFileName;
}
public void setPhotoFileName(String photoFileName) {
this.photoFileName = photoFileName;
}
public String getPhotoContentType() {
return photoContentType;
}
public void setPhotoContentType(String photoContentType) {
this.photoContentType = photoContentType;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Autowired
public void setUserManager(UserManager userManager) {
this.userManager = userManager;
}
/**
*
* @return
* @throws Exception
*/
public String save() throws Exception{
if(null==user) return this.INPUT;
logger.debug("开始日志^");
//以用户提交到服务器端的文件实例为实参构造一个输入流,支持对二进制数据的两种存储方式
InputStream is = new FileInputStream(photo);
//1、第一种方式,将二进制文件以blob的方式存储到数据库
//将输入流转换为hibernate能识别的blob型数据对象
user.setPhoto(Hibernate.createBlob(is));
userManager.addUser(user);
//2、第二种方式,将二进制文件以文件方式存储到服务器硬盘
/*
//取得附件在服务器上的存储路径
String root = ServletActionContext.getServletContext().getRealPath("/upload");
File f1 = new File(root,photoFileName);//构造一个存储到指定路径的空文件
//File f2 = new File("D:\\lvlf\\apps\\webapps\\mavenssh\\upload\\note1.txt");
//以空文件为实参构造一个输出流,用来向硬盘上输出文件
OutputStream os = new FileOutputStream(f1);
byte[] bufer = new byte[400];
int len =0;
//循环将输入流的字节数据读入到临时字节数组中
while((len =is.read(bufer))>0){
logger.debug("读入的字节总数为"+len);
//将临时字节数组中的数据定入到输出流中,由于输出流是用指定路径的空文件构造的,
//当输出流关闭时,所有数据都会写到这个空文件中去,实现了用户将客户端文件上传到服务端的功能
os.write(bufer, 0, len);
}
is.close();
os.close();
*/
return this.SUCCESS;
}
public String list() throws Exception{
logger.debug("开始查询列表……");
List<User> users = userManager.findByHql("from User user", null);
logger.debug("用户数为:"+users.size());
return this.SUCCESS;
}
}
以上需要注意的是,最好不要同时将二进制文件既存入数据库又以文件的形式保存在硬盘上,Hibernate.createBlob()会将所有二进制字节数据从输入流中全部cut掉,不做保留
四、页面配置
页面上的表单也要也action对应上
user-input.jsp:
<s:form action="user_save" method="POST" enctype="multipart/form-data">
<s:textfield key="user.account"/>
<s:password key="user.password" />
<s:textarea key="user.resume" cssStyle="width:100%"></s:textarea>
<s:file key="photo"></s:file>
<s:submit/>
</s:form>
分享到:
相关推荐
本系统是一套基于SSH+JSP+MYSQL技术的员工工作日志管理系统。它主要用于管理企业员工的日常工作日志,包括工作内容、工作时间、工作成果等。通过该系统,企业管理层可以对员工的工作进行实时监控,及时了解员工的工作...
专用系统使用的数据库是Mysql 数据库。基于JSP学生公寓管理系统的主要功能包括:可以实现对学生宿舍信息的录入功能,修改功能,删除功能。通过系统上述功能实现宿舍管理部门对于学生宿舍信息的日常管理,即方便宿舍...
ssm+dubbox+angularjs等多种模板的代码自动生成,可以极大提高开发效率,秒杀一切单表操作,支持oracle+mysql多数据库,开发人员必备工具,现提供给广大开发人员 选择你的数据库,然后就可以根据字段生成增删改查代码,再...
系统开发环境: Windows + Myclipse(服务器端) + Eclipse(手机客户端) + mysql数据库 服务器也可以用Eclipse或者idea等工具,客户端也可以采用android studio工具! 系统客户端和服务器端架构技术: 界面层,业务...
系统开发环境: Windows + Myclipse(服务器端) + Eclipse(手机客户端) + mysql数据库 服务器也可以用Eclipse或者idea等工具,客户端也可以采用android studio工具! 系统客户端和服务器端架构技术: 界面层,业务...
+ 4.12.5 用 SSH 从 Win32 连接一个远程MySQL + 4.12.6 MySQL-Win32与Unix MySQL 比较 o 4.13 OS/2 注意事项 o 4.14 TcX 二进制代码 o 4.15 安装后期(post-installation)的设置与测试 + 4.15.1 运行mysql_...
4.12.1 在 Win32 上安装 MySQL 4.12.2 在 Win95 /Win98上启动 MySQL 4.12.3 在 NT 上启动 MySQL 4.12.4 在 Win32 上运行 MySQL 4.12.5 用 SSH 从 Win32 连接一个远程MySQL 4.12.6 MySQL-Win...
Win32 上安装 MySQL 4.12.2 在 Win95 /Win98上启动 MySQL 4.12.3 在 NT 上启动 MySQL 4.12.4 在 Win32 上运行 MySQL 4.12.5 用 SSH 从 Win32 连接一个远程MySQL 4.12.6 MySQL-Win32与Unix ...
《mysql管理之道:性能调优、高可用与监控》由资深mysql专家撰写,以最新的mysql版本为基础,以构建高性能mysql服务器为核心,从故障诊断、表设计、sql优化、性能参数调优、mydumper逻辑、xtrabackup热备份与恢复、...
允许你编辑数据库,表格(字段和索引)和列,执行个性化查找和导入导出数据 自动补全关键词,表名,域名 自动段落化查询命令 IP直连数据库 表触发机制 服务器运行监控Query Favourites for SQL reuse 包括检索功能...
数据库采用mysql,数据库表.不是很会设计,借鉴书籍,比较简单的设计,个别字段有所更改. 本机数据库密码为123456,使用时可自行更改. 用的东西比较杂,主要为了学习一下知识呵呵: ssh2、dwr、jquery、extjs、jquery ...
只实现了登录和注册以及查看注册列表功能,功能简单,为初学实践使用。使用的是mysql数据库,需要自建数据库名为ssh,用户名和密码都为root,表名为admin,三个字段分别是id,user,password
里面包含2个简单的web项目,一个是 Spring + SpringMVC+Mybatis,一个是Spring+struts2+Hibernate,使用了mysql数据库,里面包含数据库字段,环境搭建好可以直接运行
数据库采用mysql,数据库表.不是很会设计,借鉴书籍,比较简单的设计,个别字段有所更改. 本机数据库密码为123456,使用时可自行更改. 用的东西比较杂,主要为了学习一下知识呵呵: ssh2、dwr、jquery、extjs、jquery ...
Struts 控制器(负责接收据+处理数据+响应结果(重定向+转)) Spring 工厂类 Hibernate 持久性访问层 *.hbm.xml(类—-表,属性–字段) 2注解 项目包 1,action 控制器 2,dao 操作数据库— 3,model 实体类模型 4...
MYSQL高级特性 81 4.1 集合函数 82 4.1.1 行列计数 82 4.1.2统计字段值的数目 82 4.1.3 计算字段的平均值 83 4.1.4 计算字段值的和 84 4.1.5 计算字段值的极值 84 4.1.6 总结 86 4.2 操作...
文件数据存储在Blob类型的FILE_CONTENT表字段上,在Spring中采用OracleLobHandler来处理Lob字段(包括Clob和Blob),由于在程序中不需要引用到oracle数据驱动程序的具体类且屏蔽了不同数据库处理Lob字段方法上的...
eclipse集成ssh,可以正常运行数据库mysql,一个表三个字段详情见
本项目是一套基于SSH的通讯录管理系统,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本、软件工具、项目说明等,该项目可以直接作为毕设使用。 项目都经过...