Pom.xml依赖:
命名空间依赖:
xmlns:mongo="http://www.springframework.org/schema/data/mongo"
http://www.springframework.org/schema/data/mongo
http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
实体类上方:mongoDB识别不了date类型
@Document(collection="user")
public class User implements Serializable{
注意:需要JDK1.7的支持
根据ID修改:
Query query=new Query(new Criteria("uid").is(user.getUid()));
Update update=new Update();
update.set("password", user.getPassword());
mongoTemplate.updateFirst(query, update, User.class);
分页查询:
Query query=new Query().skip(skip).limit(limit);
return mongoTemplate.find(query, User.class);
保存:
mongoTemplate.insert(user);
删除:
Query query=new Query(new Criteria("uid").is(id));
mongoTemplate.remove(query, User.class);
创建集合:
@PostConstruct
public void init(){
if(!mongoTemplate.collectionExists(User.class)){
//如果user集合不存在,创建
mongoTemplate.createCollection(User.class);
}
注册:上传头像:
修改:
enctype="multipart/form-data"
/**
* 向MongoDB中保存用户头像
* @param request
* @param id 用户ID
*/
public void uploadFile(HttpServletRequest request,int id){
//将上下文初始化给 CommonsMultipartResolver (多部分解析器)
CommonsMultipartResolver resolver=
new CommonsMultipartResolver(request.getSession().getServletContext());
//检查request中是否包含 multipart数据
if(resolver.isMultipart(request)){
//将request中的数据,转换成multipart类型的数据
MultipartHttpServletRequest multipartRequest=(MultipartHttpServletRequest)request;
//获取所有的文件名,进行迭代
Iterator
while(iterator.hasNext()){
//得到上传的文件
MultipartFile file = multipartRequest.getFile(iterator.next());
if(file!=null){
try {
//向MongoDB中保存文件
service.saveFile(file.getInputStream(), id);
} catch (IOException e) {
System.out.println("获取输入流失败:"+e.getMessage());
}
}
}
}
}
/**
* 以内存流的方式显示头像信息
* @param id 用户的ID
* @param response
*/
@RequestMapping(value="/user/getFile",method=RequestMethod.GET)
public void getFile(String id,HttpServletResponse response){
GridFSDBFile file = service.getFile(id);
try {
InputStream in = file.getInputStream();
OutputStream out = response.getOutputStream();
byte[] buff=new byte[1024];
int len=0;
while((len=in.read(buff))>0){
out.write(buff, 0, len);
}
out.flush();
} catch (Exception e) {
System.out.println("获取图片错误:"+e.getMessage());
}
}
@Override
public GridFSInputFile saveFile(InputStream in, Object id) {
GridFS fs=new GridFS(mongoTemplate.getDb());
GridFSInputFile gridInput = fs.createFile(in);
//添加文件的标识filename
gridInput.put("filename", Constants.USER_PHOTO+id);
//保存文件
gridInput.save();
return gridInput;
}
@Override
public GridFSDBFile getFile(Object id) {
GridFS fs=new GridFS(mongoTemplate.getDb());
GridFSDBFile gridFSDBFile=null;
try {
//根据filename获取
gridFSDBFile = fs.findOne(Constants.USER_PHOTO+id);
} catch (Exception e) {
System.out.println("获取失败:"+e.getMessage());
}
return gridFSDBFile;
}
@Override
public void deleteFile(Object id) {
try {
GridFS fs=new GridFS(mongoTemplate.getDb());
//根据filename去删除
fs.remove(Constants.USER_PHOTO+id);
} catch (Exception e) {
System.out.println("该文件不存在,删除失败!");
}
}
如何将一个字节流转换为图片文件显示到页面上:
写一个servlet(假设名字是servletImg),页面的参数就是 id,然后将从DB得到的图像的byte[],通过流输出给页面。页面还是
一般情况下,你可以用关系型数据库的思维去理解它。保存文件的路径。
但是在你考虑使用MongoDB的时候说明你的系统的数据量已经达到了一个层级了。也就是说推荐使用分布式的文件存储系统。
mongodb操作文件,主要是通过GridFS类。存储文件主要存放在fs中,其中的fs是数据库默认的。并且GridFS是直接与数据库打交道,与collection集合无关。
由于MongoDB的文档结构为BJSON格式(BJSON全称:Binary JSON),而BJSON格式本身就支持保存二进制格式的数据,因此可以把文件的二进制格式的数据直接保存到MongoDB的文档结构中。