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多數據源的使用已經完成。
-------------
作者:純潔的微笑
版權歸作者所有,轉載請注明出處