Spring Data Mongo配置和使用

本文介绍了Spring Data Mongo的配置和使用方法,包括添加依赖、配置Mongo连接、创建entity和repository,以及测试UserRepository操作。通过Spring Data Mongo,开发者可以利用其自动根据函数名生成查询的方法,简化MongoDB的开发流程,提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring Data Mongo

什么是Spring Data?
官方的解释Spring Data

Spring Data’s mission is to provide a familiar and consistent, Spring-based programming model for data access while still retaining the special traits of the underlying data store.
意思是Spring 提供一致的数据访问操作,不管你用的什么持久化技术,关系型数据库,NoSQL等,Spring Data的编程接口都类似,提供相似的一致的,基于Spring的数据访问技术。

Spring Data Mongo 是基于Spring Data的扩展,提供了对文档型数据库MongoDB的支持。

本文将讲解Spring Data Mongo配置

一,引入Spring Data Mongo 依赖

在maven项目pom.xml中添加依赖

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-mongodb</artifactId>
    <version>1.9.5.RELEASE</version>
</dependency>

二,Mongo连接配置

<?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:mongo="http://www.springframework.org/schema/data/mongo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/data/mongo
        http://www.springframework.org/schema/data/mongo/spring-mongo.xsd">
    <!-- MongoDB factory  -->
    <mongo:db-factory id="mongoDbFactory" host="10.0.0.2" port="27017" dbname="test" />

    <!-- MongoTemplate -->
    <mongo:template db-factory-ref="mongoDbFactory"/>
    <!-- 自动扫描该包下的repository,自动生成实现了类,根据接口的函数名生成相应的操作  -->
    <mongo:repositories base-package="me.zhengkun.springdatamogotest.repository"/>

</beans>

三,创建entity和repository

User实体

package me.zhengkun.springdatamogotest.entity;

import org.springframework.data.annotation.Id;

/**
 * Created by unicorn on 2016/11/17.
 */
public class User {
    /**
     * 标识ID信息
     * 插入数据时如果没有提供,MongoDB会自动生成
     */
    @Id
    private String id;
    private String name;
    private String password;

    public User() {

    }

    public User(String name, String password) {
        this.name = name;
        this.password = password;
    }
    // 省略get set方法
}

UserRepository 仓库
只需要继承MongoRepository, 无需实现接口,Spring Data会自动根据函数名生成响应的操作指令,然后通过MongoTemplate执行

package me.zhengkun.springdatamogotest.repository;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;

import java.util.List;

import me.zhengkun.springdatamogotest.entity.User;

/**
 * 继承MongoRepository接口,其提供了常用的CRUD操作
 * 只需要定义接口,不需要实现该接口,Spring Data Mongo会自动生成实现该接口的代理类
 * 并且根据接口的方法名进行相应的操作
 *
 * MongoRepository泛型接口有两个参数,分别是实体类和主键类型
 * Created by unicorn on 2016/11/17.
 */
public interface UserRepository extends MongoRepository<User, String> {
    /**
     * 根据name查找
     * @param name name
     * @return user list
     */
    List<User> findByName(String name);

    /**
     * 同时根据name和password查找
     * @param name name
     * @param password password
     * @return user list
     */
    List<User> findByNameAndPassword(String name, String password);

    /**
     * 分页查找
     * @param name name
     * @param pageable 分页请求
     * @return 查找出的当前页的结果
     */
    Page<User> findByName(String name, Pageable pageable);

    /**
     * 自定义查找
     * 查找姓名为name1 或者 name2 的user
     * @param name1 name1
     * @param name2 name2
     * @return user list
     */
    @Query("{'$or':[{'name': ?0}, {'name': ?1}]}")
    List<User> customFind(String name1, String name2);
}

三,测试UserRepository操作

使用了Junit和Spring-Test,需要请引入相关的依赖

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-test</artifactId>
   <version>4.2.8.RELEASE</version>
   <scope>test</scope>
</dependency>

UserRepositoryTest 测试代码

package me.zhengkun.springdatamongotest.repository;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.List;

import javax.annotation.Resource;

import me.zhengkun.springdatamogotest.entity.User;
import me.zhengkun.springdatamogotest.repository.UserRepository;

/**
 * Created by unicorn on 2016/11/17.
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class UserRepositoryTest {
    @Resource
    private UserRepository userRepository;

    @Before
    public void before() {
        // 删除原有的数据
        userRepository.deleteAll();
        User user = new User("Jack", "YouJumpIJump");
        userRepository.save(user);

        User user1 = new User("Rose", "JackILoveU");
        userRepository.save(user1);

    }

    @After
    public void after() {
        // 测试完毕,删除数据
        userRepository.deleteAll();
    }

    @Test
    public void testFindByName() {
        List<User> users = userRepository.findByName("Jack");
        System.out.println(users);
    }

    @Test
    public void testFindByNameAndPassword() {
        List<User> users = userRepository.findByNameAndPassword("Rose", "JackILoveU");
        System.out.println(users);
    }

    @Test
    public void testCustomFind() {
        List<User> users = userRepository.customFind("Jack", "Rose");
        System.out.println(users);
    }

    @Test
    public void testFindByPage() {
        // 查找第0页,共1条
        Page<User> page = userRepository.findByName("Jack", new PageRequest(0, 1));
        System.out.println(page.getContent());
    }

}

总结

Spring Data为MongoDB的操作提供了一致的Repository接口,可以自动根据函数名生成查询方法,简化了操作,大大提高了开发效率。

示例代码地址SpringDataMongoTest

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值