资讯专栏INFORMATION COLUMN

使用Spring Data MongoDB持久化文档数据

go4it / 3061人阅读

摘要:介绍非关系型数据是文档型数据,文档是独立的实体,文档数据库不适用于关联关系明显的数据提供了三种方式在应用中使用通过注解实现对象文档映射使用实现基于模板的数据库访问自动化的运行时生成功能注解将类型映射为文档这是一个文档指定覆盖默认的域名启用

介绍

NoSQL:not only SQL,非关系型数据

MongoDB是文档型数据,文档是独立的实体,文档数据库不适用于关联关系明显的数据

Spring Data MongoDB

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 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 getItems() {
        return items;
    }

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

启用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));
    }

    
}

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

用于对象-文档映射的Spring Data MongoDB注解

@Document 标示映射到MongoDB文档上的领域对象 类似JPA @Entity注解

@Id 标示某个域为ID域

@DbRef 标示某个域要引用的其它的文档,这个文档有可能位于另一个数据库中

@Field 为文档域指定自定义的元数据

@Version 标示某个属性用作版域

注意:没有添加注解的属性,也会持久化为文档中域,除非设置瞬时态(transient)

注意:Order.items属性,不是 关联关系,会完全嵌入到Order中

使用MongoTemplate访问MongoDB

配置类中配置的MongoTemplate bean,将其注入到使用的地方

@Autowired MongoOperations mongo;

MongoOperations是MongoTemplate所实现的接口

void save(Object objectToSave, String collectionName);

save第一个参数是新创建的对象,第二个参数是要保存的文档存储的名称

编写MongoDB Repository

使用Spring Data MongoDB来创建Repository

通过@EnableMongoRepositories注解启用Spring Data MongoDB的Repository功能

通过扩展MongoRepository接口,能够继承多个CRUD操作

查询方式:

自定义查询

指定查询

混合定义查询

//自定义查询
    List findByCustomer(String customer);
    List getByCustomer(String customer);
    List readByCustomer(String customer);
    
    int countByCustomer(String customer);
    
    List findByCustomerLike(String customer);

    List findByCustomerAndType(String customer, String type);

    List getByType(String type);
        
    //指定查询
    @Query("{customer:"Chuck Wagon"}")
    List findChucksOrders();
混合自定义的功能

首先,定义中间接口

import java.util.List;

public interface OrderOperations {

    List findOrderByType(String t);
}

编写混合实现

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 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);
    }

}

引用:《Spring In Action 4》第十二章

越想快一点的时候,越慢
越想要的,越难以得到
抓到越紧,越是徒劳

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/19063.html

相关文章

  • 使用Spring Data MongoDB久化文档数据

    摘要:介绍非关系型数据是文档型数据,文档是独立的实体,文档数据库不适用于关联关系明显的数据提供了三种方式在应用中使用通过注解实现对象文档映射使用实现基于模板的数据库访问自动化的运行时生成功能注解将类型映射为文档这是一个文档指定覆盖默认的域名启用 介绍 NoSQL:not only SQL,非关系型数据 MongoDB是文档型数据,文档是独立的实体,文档数据库不适用于关联关系明显的数据 S...

    alighters 评论0 收藏0
  • 两年了,我写了这些干货!

    摘要:开公众号差不多两年了,有不少原创教程,当原创越来越多时,大家搜索起来就很不方便,因此做了一个索引帮助大家快速找到需要的文章系列处理登录请求前后端分离一使用完美处理权限问题前后端分离二使用完美处理权限问题前后端分离三中密码加盐与中异常统一处理 开公众号差不多两年了,有不少原创教程,当原创越来越多时,大家搜索起来就很不方便,因此做了一个索引帮助大家快速找到需要的文章! Spring Boo...

    宋华 评论0 收藏0
  • 两年了,我写了这些干货!

    摘要:开公众号差不多两年了,有不少原创教程,当原创越来越多时,大家搜索起来就很不方便,因此做了一个索引帮助大家快速找到需要的文章系列处理登录请求前后端分离一使用完美处理权限问题前后端分离二使用完美处理权限问题前后端分离三中密码加盐与中异常统一处理 开公众号差不多两年了,有不少原创教程,当原创越来越多时,大家搜索起来就很不方便,因此做了一个索引帮助大家快速找到需要的文章! Spring Boo...

    huayeluoliuhen 评论0 收藏0
  • Spring 指南(目录)

    摘要:指南无论你正在构建什么,这些指南都旨在让你尽快提高工作效率使用团队推荐的最新项目版本和技术。使用进行消息传递了解如何将用作消息代理。安全架构的主题指南,这些位如何组合以及它们如何与交互。使用的主题指南以及如何为应用程序创建容器镜像。 Spring 指南 无论你正在构建什么,这些指南都旨在让你尽快提高工作效率 — 使用Spring团队推荐的最新Spring项目版本和技术。 入门指南 这些...

    only_do 评论0 收藏0
  • MongoDB遇上Spring

    摘要:每个条件必须引用一个属性,并且还可以指定一种比较操作。如果省略比较操作符的话,那么这暗指是一种相等比较操作。 Spring-data对MongoDB进行了很好的支持,接下来就讲解一下关于Spring对MongoDB的配置和一些正常的使用 我下面的工程使用的是Spring的Java配置的方式和Maven构建 具体的工程代码大家可以访问我的Github地址:https://github.c...

    Lorry_Lu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<