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

作者:poseidon_ocean 时间:2023-05-05 02:36:54 

前言

本文主要给大家介绍了关于利用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);
}

}

来源:https://segmentfault.com/a/1190000010520535

标签:spring,data,mongodb
0
投稿

猜你喜欢

  • mybatis映射和实际类型不一致的问题

    2023-08-13 18:09:06
  • Mybatis-plus foreach拼接字符串查询无数据返回问题

    2022-09-26 17:29:02
  • Java System类两个常用方法代码实例

    2023-02-01 13:52:15
  • Kotlin原理详析之拓展函数

    2023-04-10 19:54:08
  • 在Spring中自动装配Bean的属性

    2022-01-29 07:01:28
  • C# 使用WPF 用MediaElement控件实现视频循环播放

    2022-04-28 03:34:26
  • c#与WMI使用技巧集第1/2页

    2022-03-16 05:16:01
  • SSM框架+Plupload实现分块上传大文件示例

    2023-06-01 01:58:21
  • C#操作INI配置文件示例详解

    2021-11-06 11:03:01
  • FeignClient如何脱离eureka自定义URL

    2022-08-27 01:37:25
  • C#Js时间格式化问题简单实例

    2023-05-17 01:49:19
  • SpringBoot2.0+阿里巴巴Sentinel动态限流实战(附源码)

    2021-05-25 18:52:47
  • 详细聊聊C#的并发机制优秀在哪

    2023-03-04 15:41:18
  • Android使用Retrofit实现自定义Converter解析接口流程详解

    2022-12-30 23:19:38
  • Android自定义文件路径选择器

    2022-11-09 03:04:07
  • Java数据结构中堆的向下和向上调整解析

    2022-01-02 07:34:58
  • java如何使用Lombok更优雅地编码

    2022-07-24 23:24:50
  • android 实现控件左右或上下抖动教程

    2023-03-19 17:02:07
  • Android小知识之OkHttp的2种请求方式详解

    2021-06-05 04:33:45
  • 详解spring boot配置单点登录

    2022-07-27 11:50:11
  • asp之家 软件编程 m.aspxhome.com