热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用spring管理MongoDB数据库

安装SpringforMongodbSpring项目为方便对Mongodb的操作,建立了spring-data的子项目,地址在:http://www.springsource.org/spring-data/mongodb,目前版本是1.0.0M2阶段,已支持对Mongodb的一系列基本操作。我们先从http://ww
安装Spring for Mongodb

Spring项目为方便对Mongodb的操作,建立了spring-data的子项目,地址在:

http://www.springsource.org/spring-data/mongodb,目前版本是1.0.0M2阶段,已支持对Mongodb的一系列基本操作。我们先从http://www.springsource.org/spring-data/mongodb中下载相关的包:spring-data-document-1.0.0.M2.zip,下载解压后,将解压后的四个JAR文件放到工程路径的lib库中,本文中还将使用Spring 3.0.4的版本,请读者自行下载配置。

Spring Mongodb的配置

目前,可以有两种方式对Spring mongodb进行配置。第一种是使用Spring 3中的注解,另外一种是使用传统的XML配置。下面分别进行讲解:

使用Spring 3中的注解

首先在配置类中,要继承AbstractMongoConfiguration类,

packagecom.mkyong.config;
 importorg.springframework.context.annotation.Bean;
 importorg.springframework.context.annotation.Configuration;
 importorg.springframework.data.document.mongodb.MongoTemplate;
 importorg.springframework.data.document.mongodb.config.AbstractMongoConfiguration;
 importcom.mongodb.Mongo;
 /**
 * Spring MongoDB configuration file
 *
*/
 @Configuration
 publicclassSpringMongoConfig extendsAbstractMongoConfiguration {
     @Override
     public@Bean Mongo mongo() throwsException {
         returnnewMongo("localhost");
     }
     @Override
     public@Bean MongoTemplate mongoTemplate() throwsException {
         returnnewMongoTemplate(mongo(),"yourdb","yourCollection");
     }
 }

这里,引入了MongoTemplate模版类,并且使用对连接数据库的地址,数据库名和collection进行了初始化。

在调用Spring Mongodb配置时,只需要在需要使用的类中调用AnnotationConfigApplicationContext,传入刚才配置好的SpringMongoConfig类即可。如下代码所示:

  ApplicationContext
ctx =newAnnotationConfigApplicationContext(SpringMongoConfig.class);
MongoOperations
mOngoOperation=(MongoOperations)ctx.getBean("mongoTemplate");

当获得了mongoOperation对象的实例后,即可进行对mongodb的相关操作。

使用XML配置文件

使用XML配置文件的方法如下:


       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:cOntext="http://www.springframework.org/schema/context"
     xmlns:mOngo="http://www.springframework.org/schema/data/mongo"
     xsi:schemaLocation="http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd
           http://www.springframework.org/schema/data/mongo
           http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
     
     
                        class="org.springframework.data.document.mongodb.MongoTemplate">
         
         
         
     
     
     
 

注意这里引用相关的命名空间xmlns:mOngo="http://www.springframework.org/schema/data/mongo"
,并且在名为mongoTemplate中注入相关的数据库地址,数据库名即可,使用方法如下:

ApplicationContext ctx =newGenericXmlApplicationContext("mongo-config.xml");

使用Spring Mongodb实现增删改查操作

下面通过实例讲解如何使用Spring Mongodb实现增删改查操作,假设我们现在有一个实

体类user如下:

packagecom.mkyong.user;
 publicclassUser {
 privateString id;
 privateString firstname;
 privateString lastname;
 privateintage;
 //getter and setter methods
}

接下来,我们看具体的操作代码,如下,这里假设要将user类保存到名为userprofile的数据集中。

packagecom.mkyong.core;
importjava.util.List;
importorg.springframework.context.ApplicationContext;
 importorg.springframework.context.annotation.AnnotationConfigApplicationContext;
 importorg.springframework.context.support.GenericXmlApplicationContext;
 importorg.springframework.data.document.mongodb.MongoOperations;
 importorg.springframework.data.document.mongodb.query.Criteria;
 importorg.springframework.data.document.mongodb.query.Query;
 importorg.springframework.data.document.mongodb.query.Update;
 importcom.mkyong.config.SpringMongoConfig;
 importcom.mkyong.user.User;
 publicclassApp
 {
 publicstaticvoidmain( String[] args )
 {
 ApplicationContext ctx =newAnnotationConfigApplicationContext(SpringMongoConfig.class);
 MongoOperations mongoOperation =(MongoOperations)ctx.getBean("mongoTemplate");
 User user =newUser("1001", "yong", "mook kim", 30);
 //保存
 mongoOperation.save("userprofile",user);
 //查找
 User savedUser =mongoOperation.findOne("userprofile",
 newQuery(Criteria.where("id").is("1001")),
 User.class);
 System.out.println("savedUser : "+savedUser);
 //更新
 mongoOperation.updateFirst("userprofile",
 newQuery(Criteria.where("firstname").is("yong")),
Update.update("lastname", "new lastname"));
 User updatedUser =mongoOperation.findOne("userprofile",
 newQuery(Criteria.where("id").is("1001")),
 User.class);
 System.out.println("updatedUser : "+updatedUser);
 //删除
 mongoOperation.remove("userprofile",
 newQuery(Criteria.where("id").is("1001")),
 User.class);
 //显示当前列表
 ListlistUser =
 mongoOperation.getCollection("userprofile", User.class);
 System.out.println("Number of user = "+listUser.size());
 }
 }

输出结果如下:

savedUser : User [id=1001, firstname=yong, lastname=mook kim, age=30]
updatedUser : User [id=1001, firstname=yong, lastname=newlastname, age=30]
Number of user =

Spring mongodb插入数据

下面详细讲解如何使用spring mongodb插入数据。在spring mongodb中,插入数据到

mongodb有如下几种方法:

User user =newUser("...");
 //将user对象保存到"user"这个collection中
 mongoOperation.save(user);
 //将user对象保存到"new collection"这个collection中
 mongoOperation.save("new collection",user);
 //将user对象保存到"user"这个collection中
 mongoOperation.insert(user);
 //将user对象保存到"new collection"这个collection中
 mongoOperation.insert("new collection", user);
 //将user的对象列表(List)保存到"user"collection中去
 mongoOperation.insertList(userInList);
 //将user的对象列表(List)保存到"new collection"collection中去
 mongoOperation.insertList("new collection", userInList);

要注意的是,Spring mongodb中,当没有指定collection时,就会把对象保存到以对象命名的collection中。比如上例中的mongoOperation.insert(user),由于没指定collection的名称,所以会把user对象保存到user这个新建立的collection中。

另外请注意其中的save和insert的区别。它们的区别为:

1)save意思是,当记录不存在时插入,或者是当记录已存在是更新,实际上就是saveorupdate的意思。

2) insert的意思是:当记录不存在时插入,而如果记录存在时则忽略,继续插入。

下面举例子说明:

packagecom.mkyong.core;
 importjava.util.ArrayList;
 importjava.util.List;
 importorg.springframework.context.ApplicationContext;
 importorg.springframework.context.annotation.AnnotationConfigApplicationContext;
 importorg.springframework.data.document.mongodb.MongoOperations;
 importorg.springframework.data.document.mongodb.query.Criteria;
 importorg.springframework.data.document.mongodb.query.Query;
 importcom.mkyong.config.SpringMongoConfig;
 importcom.mkyong.user.User;
 publicclassApp {
 publicstaticvoidmain(String[] args) {
 ApplicationContext ctx =newAnnotationConfigApplicationContext(
 SpringMongoConfig.class);
 MongoOperations mongoOperation =(MongoOperations) ctx
 .getBean("mongoTemplate");
 //新增一个user对象,并把它放到"ABC"这个collection中
 System.out.println("Case 1...");
 User userA =newUser("1111", "user", "A", 99);
 mongoOperation.save("ABC", userA);
 //查找刚插入的user对象
 User userA1 =mongoOperation.findOne("ABC",
 newQuery(Criteria.where("id").is("1111")), User.class);
 System.out.println(userA1);
 //插入新的user,放到userB这个collection中去
 System.out.println("Case 2...");
 User userB =newUser("2222", "user", "B", 99);
 mongoOperation.save(userB);
 //查找
 User userB1 =mongoOperation.findOne(
 newQuery(Criteria.where("id").is("2222")), User.class);
 System.out.println(userB1);
 //插入对象列表,放到arraylist中
 System.out.println("Case 3...");
 User userC =newUser("3333", "user", "C", 99);
 User userD =newUser("4444", "user", "D", 99);
 User userE =newUser("5555", "user", "E", 99);
 ListuserList =newArrayList();
 userList.add(userC);
 userList.add(userD);
 userList.add(userE);
 mongoOperation.insertList("ABC-List", userList);
 Listusers =mongoOperation.find("ABC-List", newQuery(Criteria
 .where("firstname").is("user")), User.class);
 for(User temp : users) {
 System.out.println(temp);
 }
 }
 }

输出结果如下:

Case 1...
User [id=1111, firstname=user, lastname=A, age=99]
Case 2...
User [id=2222, firstname=user, lastname=B, age=99]
Case 3...
User [id=3333, firstname=user, lastname=C, age=99]
User [id=4444, firstname=user, lastname=D, age=99]
User [id=5555, firstname=user, lastname=E, age=99]

更新Document

在mongodb中,可以使用save,updateFirst(),updateMulti()方法来进行更新,下面

是相关的例子

publicclassApp {
 publicstaticvoidmain(String[] args) {
 ApplicationContext ctx =newAnnotationConfigApplicationContext(
 SpringMongoConfig.class);
 MongoOperations mongoOperation =(MongoOperations) ctx
 .getBean("mongoTemplate");
 User user =newUser("1000", "user-first", "user-last", 17);
 System.out.println("Case 1...by save()");
 mongoOperation.save(user);
 User userPrint1 =mongoOperation.findOne(newQuery(Criteria.where("id").is("1000")), User.class);
 System.out.println(userPrint1);
 //修改user对象的lastname
 user.setLastname("new last name");
 //更新user对象
 mongoOperation.save(user);
 User userPrint2 =mongoOperation.findOne(newQuery(Criteria.where("id")
 .is("1000")), User.class);
 System.out.println(userPrint2);
 //Case 2 ... update firstname field, $set
 System.out.println("Case 2...by updateFirst() - $set");
 //将id为1000的user对象的firstname属性的值更新为”new firstname”
 mongoOperation.updateFirst("user",
 newQuery(Criteria.where("_id").is("1000")),
 Update.update("firstname", "new first name"));
 User userPrint3 =mongoOperation.findOne(newQuery(Criteria.where("id")
 .is("1000")), User.class);
 System.out.println(userPrint3);
 //对id为1000的user的age加上10
 System.out.println("Case 3...by updateFirst() - $inc");
 Update updateAge =newUpdate();
 updateAge.inc("age", 10);
 mongoOperation.updateFirst("user",
 newQuery(Criteria.where("_id").is("1000")), updateAge);
 User userPrint4 =mongoOperation.findOne(newQuery(Criteria
 .where("_id").is("1000")), User.class);
 System.out.println(userPrint4);
 }
 }

结果为:

Case 1...by save()
User [id=1000, firstname=user-first, lastname=user-last, age=17]
User [id=1000, firstname=user-first, lastname=newlast name, age=17]
Case 2...by updateFirst()-$set
User [id=1000, firstname=newfirst name, lastname=newlast name, age=17]
Case 3...by updateFirst()-$inc
User [id=1000, firstname=newfirst name, lastname=newlast name, age=27]

此外,还支持使用updateMulti,updateMulti是将所有的对象进行更新,比如:

mongoOperation.updateMulti("user",
newQuery(Criteria.where("firstname").is("yong")),
Update.update("age",40));

表示将所有firstname为yong的user对象的age属性全部更新为40。

查询Document

在spring mongodb中,可以使用findOne(),find()和getCollection()去查询mongodb,常见的用法如下:

User user =newUser("...");
 //找到第一个id=1001的user对象
 User user =mongoOperation.findOne("test", newQuery(Criteria
 .where("id").is("1001")), User.class);
 //从test集合中获得所有id<=1000并且age=21的user对象
 Listusers =mongoOperation.find("test", newQuery(Criteria
 .where("id").lte("2001").and("age").is(21)), User.class);
 //从test 集合中获得所有的user对象列表
 Listusers =mongoOperation.getCollection("test", User.class);

删除document

在spring mongodb中, 删除document使用remove方法,示例如下:

User user =newUser("...");
 //删除user集合中的user对象
 mongoOperation.remove(user);
 //删除test集合下的id=2的user对象
mongoOperation.remove("test", newQuery(Criteria
 .where("id").is("2")));
 //删除test集合下的,id=3的user对象,最后并且返回这个被删除的对象
 User deletedUser =mongoOperation.findAndRemove("test",
 newQuery(Criteria.where("id").is("3")), User.class);

推荐阅读
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了互联网思维中的三个段子,涵盖了餐饮行业、淘品牌和创业企业的案例。通过这些案例,探讨了互联网思维的九大分类和十九条法则。其中包括雕爷牛腩餐厅的成功经验,三只松鼠淘品牌的包装策略以及一家创业企业的销售额增长情况。这些案例展示了互联网思维在不同领域的应用和成功之道。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • Allegro总结:1.防焊层(SolderMask):又称绿油层,PCB非布线层,用于制成丝网印板,将不需要焊接的地方涂上防焊剂.在防焊层上预留的焊盘大小要比实际的焊盘大一些,其差值一般 ... [详细]
  • C#设计模式之八装饰模式(Decorator Pattern)【结构型】
    一、引言今天我们要讲【结构型】设计模式的第三个模式,该模式是【装饰模式】,英文名称:DecoratorPattern。我第一次看到这个名称想到的是另外一个词语“装修”,我就说说我对“装修”的理 ... [详细]
  • 浅解XXE与Portswigger Web Sec
    XXE与PortswiggerWebSec​相关链接:​博客园​安全脉搏​FreeBuf​XML的全称为XML外部实体注入,在学习的过程中发现有回显的XXE并不多,而 ... [详细]
  • 详解 Python 的二元算术运算,为什么说减法只是语法糖?[Python常见问题]
    原题|UnravellingbinaryarithmeticoperationsinPython作者|BrettCannon译者|豌豆花下猫(“Python猫 ... [详细]
  • step1.为mongodb添加admin管理员root@12.154.29.163:~#mongoMongoDBshellversionv3.4.2connectingto:mo ... [详细]
  • 一、前言在数据库中,慢查询日志通常是用来进行优化数据库,MySQL中存在慢查询,Mongodb中也是如此。在Mongo中的慢查询属于Mon ... [详细]
  • Abp+MongoDb改造默认的审计日志存储位置
    一、背景在实际项目的开发当中,使用AbpZero自带的审计日志功能写入效率比较低。其次审计日志数据量中后期十分庞大,不适合与业务数据存放在一起。所以我们可以重新实现A ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
author-avatar
于华521_811
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有