SpringBoot--实战开发--集成Mongodb(六十四)

一、Mongodb简介

  MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是可以应用于各种规模的企业、各个行业以及各类应用程序的开源数据库。作为一个适用于敏捷开发的数据库,MongoDB的数据模式可以随着应用程序的发展而灵活地更新。与此同时,它也为开发人员 提供了传统数据库的功能:二级索引,完整的查询系统以及严格一致性等等。 MongoDB能够使企业更加具有敏捷性和可扩展性,各种规模的企业都可以通过使用MongoDB来创建新的应用,提高与客户之间的工作效率,加快产品上市时间,以及降低企业成本。
  MongoDB是专为可扩展性,高性能和高可用性而设计的数据库。它可以从单服务器部署扩展到大型、复杂的多数据中心架构。利用内存计算的优势,MongoDB能够提供高性能的数据读写操作。 MongoDB的本地复制和自动故障转移功能使您的应用程序具有企业级的可靠性和操作灵活性。
  简单来说,MongoDB是一个基于分布式文件存储的数据库,它是一个介于关系数据库和非关系数据库之间的产品,其主要目标是在键/值存储方式(提供了高性能和高度伸缩性)和传统的RDBMS系统(具有丰富的功能)之间架起一座桥梁,它集两者的优势于一身。
  MongoDB支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型,也因为他的存储格式也使得它所存储的数据在Nodejs程序应用中使用非常流畅。
  传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。
  MongoDB中的一条记录就是一个文档,是一个数据结构,由字段和值对组成。MongoDB文档与JSON对象类似。字段的值有可能包括其它文档、数组以及文档数组。MongoDB支持OS X、Linux及Windows等操作系统,并提供了Python,PHP,Ruby,Java及C++语言的驱动程序,社区中也提供了对Erlang及.NET等平台的驱动程序。
  MongoDB的适合对大量或者无固定格式的数据进行存储,比如:日志、缓存等。对事物支持较弱,不适用复杂的多文档(多表)的级联查询。

二、Maven依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

三、配置

  1. 单服务器配置
# mongodb数据库连接
spring.data.mongodb.uri=mongodb://192.168.56.101:27017/brahma_blog

本地安装的mongodb,没有用户名和密码,有用户名和密码的格式是

spring.data.mongodb.uri=mongodb://name:pass@localhost:27017/test,其中name是用户名,pass是密码
  1. 多数据库本配置
    配置多个数据库,则中间用","分割
spring.data.mongodb.uri=mongodb://192.168.1.1:20000,192.168.1.2:20000,192.168.252.12:20000/test

四、MongoTemplate

  1. 实体类
@Data
@Document(collection="user")
public class User {

    @NotBlank
    private String account;

    /**
     * 使用md5(username + original password + salt)加密存储
     */
    @NotBlank
    private String password;

    /**
     * 头像
     */
    private String avatar;

    private String email;  // 邮箱

    @NotBlank
    private String nickname;

    private String mobilePhoneNumber;


    /**
     * 加密密码时使用的种子
     */
    private String salt;


    /**
     * 创建时间
     */
    private LocalDate createDate;


    /**
     * 最后一次登录时间
     */
    private LocalDate lastLogin;

    /**
     * 系统用户的状态
     */
    private UserStatus status = UserStatus.normal;

    /**
     * 是否是管理员
     */
    private Boolean admin = false;

    /**
     * 逻辑删除flag
     */
    private Boolean deleted = Boolean.FALSE;
}
  1. 插入记录
@SpringBootTest
class BrahmaApiApplicationTests {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    void insert(){
        User user=new User();
        user.setAccount("admin");
        user.setPassword("123456");
        user.setAvatar("");
        user.setCreateDate(LocalDate.now());
        user.setEmail("marquis@qq.com");
        user.setAdmin(true);
        user.setNickname("管理员");
        user.setDeleted(false);
        mongoTemplate.insert(user);
    }
}
结果
  1. 查询记录
    @Test
    void select() {
        List<User> list = mongoTemplate.findAll(User.class);
        log.info(JSON.toJSONString(list));
    }
查询结果
  1. 更新数据
    @Test
    void update() {
        // 注意:id 为_id
        Query query = Query.query(Criteria.where("_id").is(1));
        Update update = new Update();
        User user=new User();
        user.setAccount("test");
        user.setPassword("000000");
        update.set("account", user.getAccount());
        update.set("password", user.getPassword());
        //  有则更新,没有则新增
        mongoTemplate.upsert(query, update, "user");
//        mongoTemplate.updateFirst(query, update, "user");
    }
结果
  1. 删除记录
    @Test
    void delete(){
        Query query = Query.query(Criteria.where("_id").is(1));
        this.mongoTemplate.remove(query, "user");
    }
删除记录

五、MongoRepository接口

  1. 接口定义
/**
 * 用户数据接口
 */
@Repository
public interface UserRepository  extends MongoRepository<User, String> {
    /**
     * 分页查询
     * @param account
     * @param pageable
     * @return
     */
    Page<User> findByAccountLike(String account, Pageable pageable);
}

  1. 添加记录
    @Autowired
    private  UserRepository userRepository;

    @Test
    void insert(){
        User user = new User();
        // 注意:id类型一定要与定义一致
        user.setId("1");
        user.setAccount("admin");
        user.setPassword("123456");
        user.setAvatar("");
        user.setCreateDate(LocalDate.now());
        user.setEmail("marquis@qq.com");
        user.setAdmin(true);
        user.setNickname("管理员");
        user.setDeleted(false);
        userRepository.save(user);
    }

  1. 条件查询
// 根据ID查询
        Optional<User> optionalUser =  userRepository.findById("1");
        log.info(JSON.toJSONString(optionalUser.get()));
// 根据账号查询
        User user = new User();
        // 精确匹配
        user.setAccount("admin");
        // 因为有默认值,这里一定要设置
        user.setAdmin(true);
        // 默认会忽略空值的字段
        Example<User> example = Example.of(user);
        Optional<User> optionalUser = userRepository.findOne(example);
        log.info(JSON.toJSONString(optionalUser.get()));
  1. 匹配器查询
        User user = new User();
        // 精确匹配
        user.setAccount("admin");
        ExampleMatcher matcher = ExampleMatcher
                .matching()
                // 全部模糊查询,即%{test}%
                .withMatcher("account", ExampleMatcher.GenericPropertyMatchers.contains())
                // 忽略字段,即不管createDate是什么值都不加入查询条件
                .withIgnorePaths("admin");
        // 默认会忽略空值的字段
        Example<User> example = Example.of(user, matcher);
        Optional<User> optionalUser = userRepository.findOne(example);
        log.info(JSON.toJSONString(optionalUser.get()));
  1. 更新记录
    @Test
    void update(){
        User user = new User();
        // 注意:id类型一定要与定义一致
        user.setId("1");
        user.setAccount("test");
        user.setPassword("888888");
        user.setCreateDate(LocalDate.now());
        user.setEmail("marquis@qq.com");
        user.setAdmin(true);
        user.setNickname("管理员");
        user.setDeleted(false);
        userRepository.save(user);
    }
  1. 删除记录
    @Test
    void delete(){
        User user = new User();
        // 注意:id类型一定要与定义一致
        user.setId("1");
        userRepository.delete(user);
    }
  1. 分页查询
    @Test
    void page() {
        PageRequest pageable = PageRequest.of(0, 2);
        Page<User> page = userRepository.findAll(pageable);
        log.info("总页数:{}",page.getTotalPages());
        log.info("总记录数:{}",page.getTotalElements());
    }
分页查询
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容

  • NoSQL 的全称是 Not Only SQL,也可以理解非关系型的数据库,是一种新型的革命式的数据库设计方式,不...
    tianjianlong阅读 4,011评论 1 25
  • Mongodb数据库 课程介绍 Ø 数据库概述(了解) Ø NoSQL和MongoDB简介(了解) Ø Mongo...
    致自己_cb38阅读 1,759评论 0 4
  • 一、MongoDB简介 1.概述 ​ MongoDB是一个基于分布式文件存储的数据库,由C++语言编写。旨在为WE...
    郑元吉阅读 977评论 0 2
  • mogon简介 MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可...
    猪哥亮阅读 2,000评论 0 10
  • MongoDB 1. MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用...
    Kevinr阅读 1,560评论 0 3