利用Spring Data MongoDB持久化文档数据的方法教程

所属分类: 软件编程 / java 阅读数: 23
收藏 0 赞 0 分享

前言

本文主要给大家介绍了关于利用Spring Data MongoDB持久化文档数据的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

介绍

  • NoSQL:not only SQL,非关系型数据
  • MongoDB是文档型数据,文档是独立的实体,文档数据库不适用于关联关系明显的数据

Spring Data MongoDB

1.Spring Data MongoDB提供了三种方式在Spring应用中使用MongoDB

  • 通过注解实现对象-文档映射
  • 使用MongoTemplate实现基于模板的数据库访问
  • 自动化的运行时Repository生成功能
import java.util.Collection;
import java.util.LinkedHashSet;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

/**
 * Spring Data MongoDB注解将Java类型映射为文档
 */
@Document  //这是一个文档
public class Order {

 @Id  //指定id
 private String id;
 
 @Field("client")  //覆盖默认的域名
 private String customer;
 
 private String type;
 
 private Collection<Item> items = new LinkedHashSet<>();

 public String getId() {
  return id;
 }

 public void setId(String id) {
  this.id = id;
 }

 public String getCustomer() {
  return customer;
 }

 public void setCustomer(String customer) {
  this.customer = customer;
 }

 public String getType() {
  return type;
 }

 public void setType(String type) {
  this.type = type;
 }

 public Collection<Item> getItems() {
  return items;
 }

 public void setItems(Collection<Item> items) {
  this.items = items;
 }
 
 
 
}

2.启用MongoDB

  • 通过@EnableJpaRepositories注解启用Spring Data的自动化JPA Repository生成功能
  • @EnableMongoRepositories为MongoDB实现了相同的功能

第一种方式:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;

import com.mongodb.MongoClient;

/**
 * 
 * Spring Data MongoDB的配置
 *
 */
@Configuration
@EnableMongoRepositories(basePackages="com.adagio.db") //启用MongoDB的Repository功能
public class MongoConfig {

 /**
  * MongoTemplate Bean
  * @param mongoDbFactory
  * @return
  */
 @Bean
 public MongoOperations mongoTemplate(){
  return new MongoTemplate(mongoDbFactory());
 }
 
 /**
  * MongoDbFactory bean
  * @return
  */
 public MongoDbFactory mongoDbFactory(){
  return new SimpleMongoDbFactory(mongoClient(), "com.adagio.db");
 }
 
 /**
  * MongoClient bean
  * @return
  */
 public MongoClient mongoClient(){
  return new MongoClient("localhost");
 }
 
}

第二种方式

import java.util.Arrays;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.data.mongodb.config.AbstractMongoConfiguration;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;

import com.mongodb.Mongo;
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;

/**
 * 
 * Spring Data MongoDB的配置
 * 扩展AbstractMongoConfiguration
 *
 */
@Configuration
@EnableMongoRepositories(basePackages="com.adagio.db") //启用MongoDB的Repository功能
public class MongoConfig2 extends AbstractMongoConfiguration {

 @Override
 protected String getDatabaseName() {
  return "OrdersDB";  //指定数据库名
 }

 @Autowired
 private Environment env;
 
 @Override
 public Mongo mongo() throws Exception {
//  return new MongoClient();  //创建Mongo客户端
  
  //如果MongoDB服务器运行在其他的机器上
//  return new MongoClient("mongoServer");
  
  //如果MongoDB服务器监听的端口不是默认端口27017
//  return new MongoClient("mongoServer", 37017);
  
  //如果MongoDB服务器在生产配置上,启用了认证功能
  MongoCredential credential = MongoCredential.createCredential(
    env.getProperty("mongo.username") , "OrdersDB", 
    env.getProperty("mongo.password").toCharArray());
  return new MongoClient(
    new ServerAddress("localhost", 37017),
    Arrays.asList(credential));
 }

 
}

3.为模型添加注解,实现MongoDB持久化

  • 用于对象-文档映射的Spring Data MongoDB注解
         @Document 标示映射到MongoDB文档上的领域对象 类似JPA @Entity注解
         @Id 标示某个域为ID域
         @DbRef 标示某个域要引用的其它的文档,这个文档有可能位于另一个数据库中
         @Field 为文档域指定自定义的元数据
         @Version 标示某个属性用作版域
  • 注意:没有添加注解的属性,也会持久化为文档中域,除非设置瞬时态(transient)
  • 注意:Order.items属性,不是 关联关系,会完全嵌入到Order中

4.使用MongoTemplate访问MongoDB

  • 配置类中配置的MongoTemplate bean,将其注入到使用的地方
  • @Autowired MongoOperations mongo;
  • MongoOperations是MongoTemplate所实现的接口
  • void save(Object objectToSave, String collectionName);
  • save第一个参数是新创建的对象,第二个参数是要保存的文档存储的名称

5.编写MongoDB Repository

  • 使用Spring Data MongoDB来创建Repository
  • 通过@EnableMongoRepositories注解启用Spring Data MongoDB的Repository功能
  • 通过扩展MongoRepository接口,能够继承多个CRUD操作

6.查询方式:

  • 自定义查询
  • 指定查询
  • 混合定义查询
//自定义查询
 List<Order> findByCustomer(String customer);
 List<Order> getByCustomer(String customer);
 List<Order> readByCustomer(String customer);
 
 int countByCustomer(String customer);
 
 List<Order> findByCustomerLike(String customer);

 List<Order> findByCustomerAndType(String customer, String type);

 List<Order> getByType(String type);
  
 //指定查询
 @Query("{customer:'Chuck Wagon'}")
 List<Order> findChucksOrders();

混合自定义的功能

1.首先,定义中间接口

import java.util.List;

public interface OrderOperations {

 List<Order> findOrderByType(String t);
}

2.编写混合实现

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;


public class OrderOperationsimpl implements OrderOperations {

 @Autowired
 private MongoOperations mongo;  //注入MongoOperations
 @Override
 public List<Order> findOrderByType(String t) {
  String type = t.equals("NET") ? "WEB" : t;
  
  //创建查询
  Criteria where = Criteria.where("type").is(type);
  Query query = Query.query(where);
  
  //执行查询
  return mongo.find(query, Order.class);
 }

}

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

更多精彩内容其他人还在看

Java的面向对象编程基本概念学习笔记整理

这篇文章主要介绍了Java的面向对象编程基本概念学习笔记整理,包括类与方法以及多态等支持面向对象语言中的重要特点,需要的朋友可以参考下
收藏 0 赞 0 分享

Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法

这篇文章主要介绍了Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法 的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

基于Java实现杨辉三角 LeetCode Pascal's Triangle

这篇文章主要介绍了基于Java实现杨辉三角 LeetCode Pascal's Triangle的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Java中Spring获取bean方法小结

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中获取Spring配置的bean呢?下面通过本文给大家介绍Java中Spring获取bean方法小结,对spring获取bean方法相关知识感兴趣的朋友一起学习吧
收藏 0 赞 0 分享

如何计算Java对象占用了多少空间?

在Java中没有sizeof运算符,所以没办法知道一个对象到底占用了多大的空间,但是在分配对象的时候会有一些基本的规则,我们根据这些规则大致能判断出来对象大小,需要的朋友可以参考下
收藏 0 赞 0 分享

剖析Java中的事件处理与异常处理机制

这篇文章主要介绍了Java中的事件处理与异常处理机制,讲解Java是如何对事件或者异常作出响应以及定义异常的一些方法,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Java的Struts2框架的结构及其数据转移方式

这篇文章主要介绍了详解Java的Struts2框架的结构及其数据转移方式,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

Java封装好的mail包发送电子邮件的类

本文给大家分享了2个java封装好的mail包发送电子邮件的类,并附上使用方法,小伙伴们可以根据自己的需求自由选择。
收藏 0 赞 0 分享

在Java的Struts中判断是否调用AJAX及用拦截器对其优化

这篇文章主要介绍了在Java的Struts中判断是否调用AJAX及用拦截器对其优化的方法,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

java多线程Future和Callable类示例分享

JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。今天我们就来研究下Future和Callab
收藏 0 赞 0 分享
查看更多