Spring boot中mongodb的使用(转)

https://www.cnblogs.com/ityouknow/p/6828919.html












springboot(十一):Spring boot中mongodb的使用

mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多。由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配置漏洞被攻击,数据被删,引起了人们的注意,感兴趣的可以看看这篇文章:场屠戮MongoDB的盛宴反思:超33000个数据库遭遇入侵勒索,同时也说明了很多公司生产中大量使用mongodb。

mongodb简介

MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是可以应用于各种规模的企业、各个行业以及各类应用程序的开源数据库。基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种。

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。

MongoDB中的一条记录就是一个文档,是一个数据结构,由字段和值对组成。MongoDB文档与JSON对象类似。字段的值有可能包括其它文档、数组以及文档数组。MongoDB支持OS X、Linux及Windows等操作系统,并提供了Python,PHP,Ruby,Java及C++语言的驱动程序,社区中也提供了对Erlang及.NET等平台的驱动程序。

MongoDB的适合对大量或者无固定格式的数据进行存储,比如:日志、缓存等。对事物支持较弱,不适用复杂的多文档(多表)的级联查询。文中演示mongodb版本为3.4。

mongodb的增删改查

Spring Boot对各种流行的数据源都进行了封装,当然也包括了mongodb,下面给大家介绍如何在spring boot中使用mongodb:

1、pom包配置

pom包里面添加spring-boot-starter-data-mongodb包引用

org.springframework.bootspring-boot-starter-data-mongodb

2、在application.properties中添加配置

spring.data.mongodb.uri=mongodb://name:pass@localhost:27017/test

多个IP集群可以采用以下配置:

spring.data.mongodb.uri=mongodb://user:pwd@ip1:port1,ip2:port2/database

2、创建数据实体

publicclassUserEntityimplementsSerializable{privatestaticfinallongserialVersionUID = -3258839839160856613L;privateLong id;privateString userName;privateString passWord;//getter、setter省略}

3、创建实体dao的增删改查操作

dao层实现了UserEntity对象的增删改查

@ComponentpublicclassUserDaoImplimplementsUserDao{@AutowiredprivateMongoTemplate mongoTemplate;/**    * 创建对象    *@paramuser    */@OverridepublicvoidsaveUser(UserEntity user){        mongoTemplate.save(user);    }/**    * 根据用户名查询对象    *@paramuserName    *@return*/@OverridepublicUserEntityfindUserByUserName(String userName){        Query query=newQuery(Criteria.where("userName").is(userName));        UserEntity user =  mongoTemplate.findOne(query , UserEntity.class);returnuser;    }/**    * 更新对象    *@paramuser    */@OverridepublicvoidupdateUser(UserEntity user){        Query query=newQuery(Criteria.where("id").is(user.getId()));        Update update=newUpdate().set("userName", user.getUserName()).set("passWord", user.getPassWord());//更新查询返回结果集的第一条mongoTemplate.updateFirst(query,update,UserEntity.class);//更新查询返回结果集的所有// mongoTemplate.updateMulti(query,update,UserEntity.class);}/**    * 删除对象    *@paramid    */@OverridepublicvoiddeleteUserById(Long id){        Query query=newQuery(Criteria.where("id").is(id));        mongoTemplate.remove(query,UserEntity.class);    }}

4、开发对应的测试方法

@RunWith(SpringRunner.class)@SpringBootTestpublicclassUserDaoTest{@AutowiredprivateUserDao userDao;@TestpublicvoidtestSaveUser()throwsException{        UserEntity user=newUserEntity();        user.setId(2l);        user.setUserName("小明");        user.setPassWord("fffooo123");        userDao.saveUser(user);    }@TestpublicvoidfindUserByUserName(){      UserEntity user= userDao.findUserByUserName("小明");      System.out.println("user is "+user);    }@TestpublicvoidupdateUser(){        UserEntity user=newUserEntity();        user.setId(2l);        user.setUserName("天空");        user.setPassWord("fffxxxx");        userDao.updateUser(user);    }@TestpublicvoiddeleteUserById(){        userDao.deleteUserById(1l);    }}

5、查看验证结果

可以使用工具mongoVUE工具来连接后直接图形化展示查看,也可以登录服务器用命令来查看

1.登录mongos

bin/mongo -host localhost -port 20000

2、切换到test库

use test

3、查询userEntity集合数据

db.userEntity.find()

根据3查询的结果来观察测试用例的执行是否正确。

到此springboot对应mongodb的增删改查功能已经全部实现。

多数据源mongodb的使用

在多mongodb数据源的情况下,我们换种更优雅的方式来实现

1、pom包配置

添加lombok和spring-boot-autoconfigure包引用

org.springframework.bootspring-boot-starter-data-mongodborg.projectlomboklombokorg.springframework.bootspring-boot-autoconfigureRELEASE

Lombok - 是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。简单试了以下这个工具还挺好玩的,加上注解我们就不用手动写 getter\setter、构建方式类似的代码了。

spring-boot-autoconfigure - 就是spring boot的自动化配置

2、配置文件使用YAML的形式添加两条数据源,如下:

mongodb:primary:host:192.168.9.60port:20000database: testsecondary:host:192.168.9.60port:20000database: test1

3、配置两个库的数据源

封装读取以mongodb开头的两个配置文件

@Data@ConfigurationProperties(prefix ="mongodb")publicclassMultipleMongoProperties{privateMongoProperties primary =newMongoProperties();privateMongoProperties secondary =newMongoProperties();}

配置不同包路径下使用不同的数据源

第一个库的封装

@Configuration@EnableMongoRepositories(basePackages ="com.neo.model.repository.primary",        mongoTemplateRef = PrimaryMongoConfig.MONGO_TEMPLATE)publicclassPrimaryMongoConfig{protectedstaticfinalString MONGO_TEMPLATE ="primaryMongoTemplate";}

第二个库的封装

@Configuration@EnableMongoRepositories(basePackages ="com.neo.model.repository.secondary",        mongoTemplateRef = SecondaryMongoConfig.MONGO_TEMPLATE)publicclassSecondaryMongoConfig{protectedstaticfinalString MONGO_TEMPLATE ="secondaryMongoTemplate";}

读取对应的配置信息并且构造对应的MongoTemplate

@ConfigurationpublicclassMultipleMongoConfig{@AutowiredprivateMultipleMongoProperties mongoProperties;@Primary@Bean(name = PrimaryMongoConfig.MONGO_TEMPLATE)publicMongoTemplateprimaryMongoTemplate()throwsException{returnnewMongoTemplate(primaryFactory(this.mongoProperties.getPrimary()));    }@Bean@Qualifier(SecondaryMongoConfig.MONGO_TEMPLATE)publicMongoTemplatesecondaryMongoTemplate()throwsException{returnnewMongoTemplate(secondaryFactory(this.mongoProperties.getSecondary()));    }@Bean@PrimarypublicMongoDbFactoryprimaryFactory(MongoProperties mongo)throwsException{returnnewSimpleMongoDbFactory(newMongoClient(mongo.getHost(), mongo.getPort()),                mongo.getDatabase());    }@BeanpublicMongoDbFactorysecondaryFactory(MongoProperties mongo)throwsException{returnnewSimpleMongoDbFactory(newMongoClient(mongo.getHost(), mongo.getPort()),                mongo.getDatabase());    }}

两个库的配置信息已经完成。

4、创建两个库分别对应的对象和Repository

借助lombok来构建对象

@Data@AllArgsConstructor@NoArgsConstructor@Document(collection ="first_mongo")publicclassPrimaryMongoObject{@IdprivateString id;privateString value;@OverridepublicStringtoString(){return"PrimaryMongoObject{"+"id='"+ id +'\''+", value='"+ value +'\''+'}';    }}

对应的Repository

publicinterfacePrimaryRepositoryextendsMongoRepository{}

继承了 MongoRepository 会默认实现很多基本的增删改查,省了很多自己写dao层的代码

Secondary和上面的代码类似就不贴出来了

5、最后测试

@RunWith(SpringRunner.class)@SpringBootTestpublicclassMuliDatabaseTest{@AutowiredprivatePrimaryRepository primaryRepository;@AutowiredprivateSecondaryRepository secondaryRepository;@TestpublicvoidTestSave(){        System.out.println("************************************************************");        System.out.println("测试开始");        System.out.println("************************************************************");this.primaryRepository                .save(newPrimaryMongoObject(null,"第一个库的对象"));this.secondaryRepository                .save(newSecondaryMongoObject(null,"第二个库的对象"));        List primaries =this.primaryRepository.findAll();for(PrimaryMongoObject primary : primaries) {            System.out.println(primary.toString());        }        List secondaries =this.secondaryRepository.findAll();for(SecondaryMongoObject secondary : secondaries) {            System.out.println(secondary.toString());        }        System.out.println("************************************************************");        System.out.println("测试完成");        System.out.println("************************************************************");    }}

到此,mongodb多数据源的使用已经完成。

示例代码


-------------

作者:纯洁的微笑

出处:http://www.ityouknow.com/

版权归作者所有,转载请注明出处

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,875评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,569评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,475评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,459评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,537评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,563评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,580评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,326评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,773评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,086评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,252评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,921评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,566评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,190评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,435评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,129评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,125评论 2 352

推荐阅读更多精彩内容