博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mongodb数据库入门之Spring Mongodb
阅读量:6757 次
发布时间:2019-06-26

本文共 11251 字,大约阅读时间需要 37 分钟。

在上一篇教程中,我们学习了如何使用Mongodb 的JAVA API对Mongodb进行相关的数据库操作,在本文中,将学习使用Spring for Mongodb去简化对Mongodb的操作。

  安装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类,代码如下:

package com.mkyong.config;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.data.document.mongodb.MongoTemplate;

import org.springframework.data.document.mongodb.config.AbstractMongoConfiguration;

import com.mongodb.Mongo;

/**

* Spring MongoDB configuration file

*/

@Configuration

public 
class SpringMongoConfig 
extends AbstractMongoConfiguration {

    @Override

    
public @Bean Mongo mongo() 
throws Exception {

        
return 
new Mongo("localhost");

    }

    @Override

    
public @Bean MongoTemplate mongoTemplate() 
throws Exception {

        
return 
new MongoTemplate(mongo(),"yourdb","yourCollection");

    }

}

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

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

  ApplicationContext

ctx = 
new AnnotationConfigApplicationContext(SpringMongoConfig.
class);

MongoOperations 

mongoOperation = (MongoOperations)ctx.getBean("mongoTemplate");

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

  使用XML配置文件

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

<?
xml version="1.0" encoding="UTF-8"
?>

<
beans 
xmlns
="http://www.springframework.org/schema/beans"

    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"
>

    
<!--
 Default bean name is 'mongo' 
-->

    
<
mongo:mongo 
host
="localhost"
 port
="27017" 
/>

    
<
bean 
id
="mongoTemplate"
 
                 class
="org.springframework.data.document.mongodb.MongoTemplate"
>

        
<
constructor-arg 
ref
="mongo" 
/>

        
<
constructor-arg 
name
="databaseName"
 value
="yourdb" 
/>

        
<
constructor-arg 
name
="defaultCollectionName"
 value
="yourCollection" 
/>

    
</
bean
>

    
<!--
 To translate any MongoExceptions thrown in @Repository annotated classes 
-->

    
<
context:annotation-config 
/>

</
beans
>

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

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

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

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

  体类user如下:

package com.mkyong.user;

public 
class User {

private String id;

private String firstname;

private String lastname;

private 
int age;

//
getter and setter methods 

}

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

package com.mkyong.core;


import java.util.List;


import org.springframework.context.ApplicationContext;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import org.springframework.context.support.GenericXmlApplicationContext;

import org.springframework.data.document.mongodb.MongoOperations;

import org.springframework.data.document.mongodb.query.Criteria;

import org.springframework.data.document.mongodb.query.Query;

import org.springframework.data.document.mongodb.query.Update;

import com.mkyong.config.SpringMongoConfig;

import com.mkyong.user.User;

public 
class App

{

public 
static 
void main( String[] args )

{

ApplicationContext ctx = 
new AnnotationConfigApplicationContext(SpringMongoConfig.
class);

MongoOperations mongoOperation = (MongoOperations)ctx.getBean("mongoTemplate");

User user = 
new User("1001", "yong", "mook kim", 30);

//
保存

mongoOperation.save("userprofile",user);

//
查找

User savedUser = mongoOperation.findOne("userprofile",

new Query(Criteria.where("id").is("1001")),

User.
class);

System.out.println("savedUser : " + savedUser);

//
更新

mongoOperation.updateFirst("userprofile",

new Query(Criteria.where("firstname").is("yong")), 

Update.update("lastname", "new lastname"));

User updatedUser = mongoOperation.findOne("userprofile",

new Query(Criteria.where("id").is("1001")),

User.
class);

System.out.println("updatedUser : " + updatedUser);

//
删除

mongoOperation.remove("userprofile",

new Query(Criteria.where("id").is("1001")),

User.
class);

//
显示当前列表

List<User> listUser = 

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=
new lastname, age=30]

Number of user = 0

  Spring mongodb插入数据

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

  mongodb有如下几种方法:

User user = 
new User("...");

//
将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的意思是:当记录不存在时插入,而如果记录存在时则忽略,继续插入。

  下面举例子说明:

package com.mkyong.core;

import java.util.ArrayList;

import java.util.List;

import org.springframework.context.ApplicationContext;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import org.springframework.data.document.mongodb.MongoOperations;

import org.springframework.data.document.mongodb.query.Criteria;

import org.springframework.data.document.mongodb.query.Query;

import com.mkyong.config.SpringMongoConfig;

import com.mkyong.user.User;

public 
class App {

public 
static 
void main(String[] args) {

ApplicationContext ctx = 
new AnnotationConfigApplicationContext(

SpringMongoConfig.
class);

MongoOperations mongoOperation = (MongoOperations) ctx

.getBean("mongoTemplate");

//
新增一个user对象,并把它放到"ABC"这个collection中

System.out.println("Case 1...");

User userA = 
new User("1111", "user", "A", 99);

mongoOperation.save("ABC", userA);

//
 查找刚插入的user对象

User userA1 = mongoOperation.findOne("ABC",

new Query(Criteria.where("id").is("1111")), User.
class);

System.out.println(userA1);

//
插入新的user,放到userB这个collection中去

System.out.println("Case 2...");

User userB = 
new User("2222", "user", "B", 99);

mongoOperation.save(userB);

//
 查找

User userB1 = mongoOperation.findOne(

new Query(Criteria.where("id").is("2222")), User.
class);

System.out.println(userB1);

//
 插入对象列表,放到arraylist中

System.out.println("Case 3...");

User userC = 
new User("3333", "user", "C", 99);

User userD = 
new User("4444", "user", "D", 99);

User userE = 
new User("5555", "user", "E", 99);

List<User> userList = 
new ArrayList<User>();

userList.add(userC);

userList.add(userD);

userList.add(userE);

mongoOperation.insertList("ABC-List", userList);

List<User> users = mongoOperation.find("ABC-List", 
new Query(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()方法来进行更新,下面

  是相关的例子

public 
class App {

public 
static 
void main(String[] args) {

ApplicationContext ctx = 
new AnnotationConfigApplicationContext(

SpringMongoConfig.
class);

MongoOperations mongoOperation = (MongoOperations) ctx

.getBean("mongoTemplate");

User user = 
new User("1000", "user-first", "user-last", 17);

System.out.println("Case 1...by save()");

mongoOperation.save(user);

User userPrint1 = mongoOperation.findOne(
new Query(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(
new Query(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",

new Query(Criteria.where("_id").is("1000")),

Update.update("firstname", "new first name"));

User userPrint3 = mongoOperation.findOne(
new Query(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 = 
new Update();

updateAge.inc("age", 10);

mongoOperation.updateFirst("user",

new Query(Criteria.where("_id").is("1000")), updateAge);

User userPrint4 = mongoOperation.findOne(
new Query(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=
new last name, age=17]

Case 2...by updateFirst() - $set

User [id=1000, firstname=
new first name, lastname=
new last name, age=17]

Case 3...by updateFirst() - $inc

User [id=1000, firstname=
new first name, lastname=
new last name, age=27]

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

mongoOperation.updateMulti("user",

new Query(Criteria.where("firstname").is("yong")),

Update.update("age", 40));

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

  查询Document

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

User user = 
new User("...");

//
找到第一个id=1001的user对象

User user = mongoOperation.findOne("test", 
new Query(Criteria

.where("id").is("1001")), User.
class);

//
从test集合中获得所有id<=1000并且age=21的user对象

List<User> users = mongoOperation.find("test", 
new Query(Criteria

.where("id").lte("2001").and("age").is(21)), User.
class);

//
从test 集合中获得所有的user对象列表

List<User> users = mongoOperation.getCollection("test", User.
class);

  删除document

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

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

User user = 
new User("...");

//
删除user集合中的user对象

mongoOperation.remove(user);

//
删除test集合下的id=2的user对象 

mongoOperation.remove("test", 
new Query(Criteria

.where("id").is("2")));

//
删除test集合下的,id=3的user对象,最后并且返回这个被删除的对象

User deletedUser = mongoOperation.findAndRemove("test",

new Query(Criteria.where("id").is("3")), User.
class);

转载地址:http://fiweo.baihongyu.com/

你可能感兴趣的文章
15:开发Rsync服务启动脚本案例
查看>>
shiro 更改登录的用户名
查看>>
mysql 权限
查看>>
iOS的主要框架介绍
查看>>
继承与访问权限
查看>>
C++ While学习笔记(2)
查看>>
WPF Expander控件(扩展面板)
查看>>
Django 实现分库
查看>>
人事面试100问题--巧妙应答
查看>>
ES6学习笔记<三> 生成器函数与yield
查看>>
AR(增强现实) 知识篇
查看>>
BizTalk接收消息后路由失败
查看>>
【工具类】怎么进入阿里云docker仓库
查看>>
Ceres-Solver库入门
查看>>
悲惨而又丢人的创业经历:草根创业者含恨倾诉为什么失败
查看>>
理解WebKit和Chromium: WebKit, WebKit2, Chromium和Chrome介绍
查看>>
hanoi塔的递归算法
查看>>
C# 校验给定的ip地址是否合法
查看>>
lumen 登陆 注册 demo
查看>>
基于服务的并行系统的通讯方式探讨
查看>>