文档章节

Spring-data-mongodb初步使用

B
 BaronChen
发布于 2016/11/30 22:20
字数 947
阅读 62
收藏 0

前几天调研了一下spring-data的使用。此处做一下使用的简单介绍:
在使用关系型数据库的传统Java web开发中,我们通常使用如下层级结构:
输入图片说明
Dao层主要完成OR-Mapping的功能,进行数据的存储。但是在我们使用Mongo数据库之后,原本的层级就可能变成了如下:
输入图片说明
因为我们从mongo的数据为json格式,可以使用fastjson与POJO进行相互转换。
这样层级设计,开发就可以能很快地完成,但是造成一些问题:

  1. 业务逻辑代码和数据库操作代码耦合在一起,较为难以分离
  2. 加大了单元测试的难度
  3. 结构层次不清晰

以下是理由:

  1. 上面1和3造成的原因都是因为函数体变长,业务代码和数据库代码杂糅在一起造成的,出错时,需要对整个函数进行复验,确保函数的编写的正确性。编写UT时也会造成需要覆盖的路径(语句)增多,难度因此增加。
  2. 结构层次不清晰,在分为Service和Dao层的情况下,逻辑层级更为清晰,业务层主做业务,Dao层主做数据库的CURD。

所以我们可以使用spring-data-mongo来完成dao层的编写。
以下代码都是测试通过的,主要注意几个点:

  1. 代码只需要定义成这样既可,一般的查询都可以使用这些自动生成的代码来进行完成
  2. 如果需要添加自定义的方法,在这边我使用的是JDK8的default关键字,直接将实现添加在了接口里面,实测可用
  3. 启动时spring会操作字节码自动生成实现类,所以启动可能较慢,并且一旦有bug调试起来很麻烦(基本无法调试)。

接口定义示例:

public interface UserRepository extends MongoRepository<User, String> {
    //////////////////////Query/////////////////////
    // Do not recommend using @Query annotation like this
    @Query("{ 'firstname' : ?0, 'password': ?1 }")
    public User findByUsernameAndPassword(String username, String password);

    // find age larger than
    // there are others:
    public List<User> findByAgeGreaterThan(Integer age);
    public List<User> findByAgeLessThan(Integer age);
    public List<User> findByAgeBetween(Integer from, Integer to);
    public List<User> findBySexNot(String sex);
    public List<User> findBySexLike(String sex);
    public List<User> findBySexNotLike(String sex);
    public List<User> findByUsernameNull();
    public List<User> findByUsernameNotNull();

    // find by username
    public User findByUsername(String username);

    // find distinct users by username
    public List<User> findDistinctUserByUsername(String username);
    public List<User> findUserDistinctByUsername(String username);

    // find users by username and age
    public List<User> findByUsernameAndAge(String username, Integer age);

    // find users by username or age
    public List<User> findByUsernameOrAge(String username, Integer age);

    // find users by sex with ignoring cases
    public List<User> findBySexIgnoreCase(String sex, Pageable pageable);

    // find users by sex with order firstname ascending
    public List<User> findBySexOrderByUsernameAsc(String sex);

    // find users by sex with the order sort specfied
    public List<User> findBySex(String sex, Sort sort);

    // find users bys sex with pageable
    public List<User> findBySex(String sex, Pageable pageable);

    // find the first ten results by user sex
    public Slice<User> findTop10BySex(String sex, Sort sort);
    public Slice<User> findFirst10BySex(String sex, Sort sort);

    // other query like Stream Query and Async Query could be
    // found here http://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#repositories.query-methods

    // define the method by ourself
    default User findByUsernameAndPasswordByOwn(String username, String password) {
        MongoOperations ops = DbUtil.getDbUtil().getMongoTemplate();
        User user = ops.findOne(query(where("username").is(username))
                .addCriteria(where("password").is(password)), User.class);
        return user;
    }

    default GroupByResults<User> findUserGroupBySex() {
        GroupByResults<User> results = DbUtil.getDbUtil().getMongoTemplate()
                .group("user", GroupBy.key("sex").initialDocument("{ count: 0 }")
                                .reduceFunction("function(doc, prev) { prev.count += 1 }"),
                User.class);
        return results;
    }

    //////////////////////Delete/////////////////////
    public void deleteByUsername(String username);
    public void removeByUsernameAndAge(String username, Integer age);

    /////////////////////update////////////////////////
    // normally, we use sper.update(), if the method can't meet your demand,
    // you can write the method yourself
    default void updateMultiByUsername(String username, Integer age) {
        MongoOperations ops = DbUtil.getDbUtil().getMongoTemplate();
        // update all the documents whose username atteribute is username
        // and the class need to be User
        ops.updateMulti(query(where("username").is(username)),
                Update.update("age", age), User.class);
    }

    //////////////////save///////////////
    // just use default save(). forget about the others.
}

使用例子:

@RestController
public class UserController {
    @Autowired
    UserRepository userRepository;

    @RequestMapping("/")
    public String sayHello(String name) {
        return "Hello, " + name;
    }

    @RequestMapping(value="/user", method = RequestMethod.POST)
    public String add(@RequestParam String companyId, @RequestBody User user) {
        user = userRepository.save(user);
        return user.getId();
    }

    @RequestMapping(value = "/user/username", method = RequestMethod.GET)
    public User getUserByUserName(@RequestParam String companyId, @RequestParam String username,
                                  @RequestParam String password) {
        User user;

        user = userRepository.findByUsernameAndPassword(username, password);
        return user;
    }

    @RequestMapping(value="/user/group/sex", method = RequestMethod.GET)
    public GroupByResults<User> groupUserBySex() {
        return userRepository.findUserGroupBySex();
    }
}

© 著作权归作者所有

B
粉丝 0
博文 11
码字总数 6676
作品 0
南京
私信 提问
Spring Data MongoDB 1.6.4 发布

Spring Data MongoDB 1.6.4 发布,此版本更新内容如下: * DATAMONGO-1304 - Release 1.6.4 (Evans). 下载:https://github.com/spring-projects/spring-data-mongodb/archive/1.6.4.RELEAS......

淡漠悠然
2015/10/15
740
0
Spring Data MongoDB 1.8.0 发布

Spring Data MongoDB 1.8.0 发布,此版本更新内容如下: * DATAMONGO-1282 - Release 1.8 GA (Gosling). * DATAMONGO-1280 - Add what's new section to refrence documentation. * DATAMONG......

淡漠悠然
2015/09/04
2.3K
0
spring-boot-starter-mongodb-pool

在日常工作中,我们通过Spring Data Mongodb来操作Mongodb数据库,在Spring Boot中只需要引入spring-boot-starter-data-mongodb即可。 很多时候我们往往需要操作多个数据库(微服务架构下一个...

尹吉欢
2018/04/22
0
0
spring MVC 整合mongodb

Spring Mongodb 目录 1 SPRING整合MONGODB 1 1.1 环境准备 1 1.2 包依赖 1 1.3 配置 2 2 案列 5 2.1 SPRING MVC整合MONGODB代码案例 5 1 Spring整合Mongodb 1.1 环境准备 1. mongodb官网 ht...

浅夏
2014/03/13
31.8K
0
使用 Spring Data & MongoDB

这篇文章包含以下三个方面内容: 在 Windows 下安装 MongoDB MongoDB Java 示例 Spring Data & MongoDB. 首先,安装 MongoDB 从官方网站上下载最新的 MongoDB ,地址:MongoDB website. 解压...

红薯
2011/08/29
16.9K
10

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot系列:Spring Boot集成Spring Cache

一、关于Spring Cache 缓存在现在的应用中越来越重要, Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口来统一不同的缓存技术,并支持使...

杨小格子
31分钟前
7
0
二、MySql存储引擎简介(笔记)

MySql体系 先来看一下MySql的架构图: MySql的存储引擎在架构的最下层,提供了各式各样的存储特性,下面介绍几个常用的存储引擎。 MyISAM 官方提供的一个存储引擎,在数据库的系统表和系统生...

XuePeng77
昨天
4
0
聊聊nacos config的deleteConfig

序 本文主要研究一下nacos config的deleteConfig ConfigController nacos-1.1.3/config/src/main/java/com/alibaba/nacos/config/server/controller/ConfigController.java @Controller@Re......

go4it
昨天
5
0
面试:原来Redis的五种数据类型底层结构是这样的

关注我,可以获取最新知识、经典面试题以及微服务技术分享   在Redis中会涉及很多数据结构,比如SDS,双向链表、字典、压缩列表、整数集合等等。Redis会基于这些数据结构自定义一个对象系统...

ccww_
昨天
8
0
java发送html模板的高逼格邮件

最近做了一个监测k8s服务pod水平伸缩发送邮件的功能(当pod的cpu/内存达到指定阈值后会水平扩展出多个pod、或者指定时间内pod数应扩展到指定数量),一开始写了个格式很low的邮件,像下面这样...

码农实战
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部