欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-22 13:33:52
前言 本文主要给大家介绍了关于利用spring data mongodb持久化文档数据的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 介绍...

前言

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

}

总结

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