最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring boot中mongodb的使用

 更新時間:2017年05月08日 16:07:47   投稿:mrr  
MongoDB是最早熱門非關系數(shù)據(jù)庫的之一,使用也比較普遍,一般會用做離線數(shù)據(jù)分析來使用,放到內(nèi)網(wǎng)的居多。這篇文章主要介紹了Spring boot中mongodb的使用,需要的朋友可以參考下

MongoDB是最早熱門非關系數(shù)據(jù)庫的之一,使用也比較普遍,一般會用做離線數(shù)據(jù)分析來使用,放到內(nèi)網(wǎng)的居多。由于很多公司使用了云服務,服務器默認都開放了外網(wǎng)地址,導致前一陣子大批 MongoDB 因配置漏洞被攻擊,數(shù)據(jù)被刪,引起了人們的注意,感興趣的可以看看這篇文章:場屠戮MongoDB的盛宴反思:超33000個數(shù)據(jù)庫遭遇入侵勒索,同時也說明了很多公司生產(chǎn)中大量使用mongodb。

mongodb簡介

MongoDB(來自于英文單詞“Humongous”,中文含義為“龐大”)是可以應用于各種規(guī)模的企業(yè)、各個行業(yè)以及各類應用程序的開源數(shù)據(jù)庫。基于分布式文件存儲的數(shù)據(jù)庫。由C++語言編寫。旨在為WEB應用提供可擴展的高性能數(shù)據(jù)存儲解決方案。MongoDB是一個高性能,開源,無模式的文檔型數(shù)據(jù)庫,是當前NoSql數(shù)據(jù)庫中比較熱門的一種。

MongoDB是一個介于關系數(shù)據(jù)庫和非關系數(shù)據(jù)庫之間的產(chǎn)品,是非關系數(shù)據(jù)庫當中功能最豐富,最像關系數(shù)據(jù)庫的。他支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似json的bjson格式,因此可以存儲比較復雜的數(shù)據(jù)類型。Mongo最大的特點是他支持的查詢語言非常強大,其語法有點類似于面向?qū)ο蟮牟樵冋Z言,幾乎可以實現(xiàn)類似關系數(shù)據(jù)庫單表查詢的絕大部分功能,而且還支持對數(shù)據(jù)建立索引。

傳統(tǒng)的關系數(shù)據(jù)庫一般由數(shù)據(jù)庫(database)、表(table)、記錄(record)三個層次概念組成,MongoDB是由數(shù)據(jù)庫(database)、集合(collection)、文檔對象(document)三個層次組成。MongoDB對于關系型數(shù)據(jù)庫里的表,但是集合中沒有列、行和關系概念,這體現(xiàn)了模式自由的特點。

MongoDB中的一條記錄就是一個文檔,是一個數(shù)據(jù)結(jié)構(gòu),由字段和值對組成。MongoDB文檔與JSON對象類似。字段的值有可能包括其它文檔、數(shù)組以及文檔數(shù)組。MongoDB支持OS X、Linux及Windows等操作系統(tǒng),并提供了Python,PHP,Ruby,Java及C++語言的驅(qū)動程序,社區(qū)中也提供了對Erlang及.NET等平臺的驅(qū)動程序。

MySQL的適合對大量或者無固定格式的數(shù)據(jù)進行存儲,比如:日志、緩存等。對事物支持較弱,不適用復雜的多文檔(多表)的級聯(lián)查詢。文中演示mongodb版本為3.4。

mongodb的增刪改查

spring Boot對各種流行的數(shù)據(jù)源都進行了封裝,當然也包括了mongodb,下面給大家介紹如何在spring boot中使用mongodb:

1、pom包配置

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

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

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、創(chuàng)建數(shù)據(jù)實體

public class UserEntity implements Serializable {
  private static final long serialVersionUID = -3258839839160856613L;
  private Long id;
  private String userName;
  private String passWord;
  //getter、setter省略
}

3、創(chuàng)建實體dao的增刪改查操作

dao層實現(xiàn)了UserEntity對象的增刪改查

@Component
public class UserDaoImpl implements UserDao {
 @Autowired
 private MongoTemplate mongoTemplate;
 /**
  * 創(chuàng)建對象
  * @param user
  */
 @Override
 public void saveUser(UserEntity user) {
  mongoTemplate.save(user);
 }
 /**
  * 根據(jù)用戶名查詢對象
  * @param userName
  * @return
  */
 @Override
 public UserEntity findUserByUserName(String userName) {
  Query query=new Query(Criteria.where("userName").is(userName));
  UserEntity user = mongoTemplate.findOne(query , UserEntity.class);
  return user;
 }
 /**
  * 更新對象
  * @param user
  */
 @Override
 public void updateUser(UserEntity user) {
  Query query=new Query(Criteria.where("id").is(user.getId()));
  Update update= new Update().set("userName", user.getUserName()).set("passWord", user.getPassWord());
  //更新查詢返回結(jié)果集的第一條
  mongoTemplate.updateFirst(query,update,UserEntity.class);
  //更新查詢返回結(jié)果集的所有
  // mongoTemplate.updateMulti(query,update,UserEntity.class);
 }
 /**
  * 刪除對象
  * @param id
  */
 @Override
 public void deleteUserById(Long id) {
  Query query=new Query(Criteria.where("id").is(id));
  mongoTemplate.remove(query,UserEntity.class);
 }
}

4、開發(fā)對應的測試方法

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserDaoTest {
 @Autowired
 private UserDao userDao;
 @Test
 public void testSaveUser() throws Exception {
  UserEntity user=new UserEntity();
  user.setId(2l);
  user.setUserName("小明");
  user.setPassWord("fffooo123");
  userDao.saveUser(user);
 }
 @Test
 public void findUserByUserName(){
  UserEntity user= userDao.findUserByUserName("小明");
  System.out.println("user is "+user);
 }
 @Test
 public void updateUser(){
  UserEntity user=new UserEntity();
  user.setId(2l);
  user.setUserName("天空");
  user.setPassWord("fffxxxx");
  userDao.updateUser(user);
 }
 @Test
 public void deleteUserById(){
  userDao.deleteUserById(1l);
 }
}

5、查看驗證結(jié)果

可以使用工具mongoVUE工具來連接后直接圖形化展示查看,也可以登錄服務器用命令來查看

1.登錄mongos

bin/mongo -host localhost -port 20000

2、切換到test庫

use test

3、查詢userEntity集合數(shù)據(jù)

db.userEntity.find()

根據(jù)3查詢的結(jié)果來觀察測試用例的執(zhí)行是否正確。

到此springboot對應mongodb的增刪改查功能已經(jīng)全部實現(xiàn)。

多數(shù)據(jù)源mongodb的使用

在多mongodb數(shù)據(jù)源的情況下,我們換種更優(yōu)雅的方式來實現(xiàn)

1、pom包配置

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

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
 <groupId>org.projectlombok</groupId>
 <artifactId>lombok</artifactId>
</dependency>
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-autoconfigure</artifactId>
 <version>RELEASE</version>
</dependency>

Lombok - 是一個可以通過簡單的注解形式來幫助我們簡化消除一些必須有但顯得很臃腫的Java代碼的工具,通過使用對應的注解,可以在編譯源碼的時候生成對應的方法。簡單試了以下這個工具還挺好玩的,加上注解我們就不用手動寫 getter\setter、構(gòu)建方式類似的代碼了。

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

2、配置文件使用YAML的形式添加兩條數(shù)據(jù)源,如下:

mongodb:
 primary:
 host: 192.168.9.60
 port: 20000
 database: test
 secondary:
 host: 192.168.9.60
 port: 20000
 database: test1

3、配置兩個庫的數(shù)據(jù)源

封裝讀取以mongodb開頭的兩個配置文件

@Data
@ConfigurationProperties(prefix = "mongodb")
public class MultipleMongoProperties {
 private MongoProperties primary = new MongoProperties();
 private MongoProperties secondary = new MongoProperties();
}

配置不同包路徑下使用不同的數(shù)據(jù)源

第一個庫的封裝

@Configuration
@EnableMongoRepositories(basePackages = "com.neo.model.repository.primary",
  mongoTemplateRef = PrimaryMongoConfig.MONGO_TEMPLATE)
public class PrimaryMongoConfig {
 protected static final String MONGO_TEMPLATE = "primaryMongoTemplate";
}

第二個庫的封裝

@Configuration
@EnableMongoRepositories(basePackages = "com.neo.model.repository.secondary",
  mongoTemplateRef = SecondaryMongoConfig.MONGO_TEMPLATE)
public class SecondaryMongoConfig {
 protected static final String MONGO_TEMPLATE = "secondaryMongoTemplate";
}

讀取對應的配置信息并且構(gòu)造對應的MongoTemplate

@Configuration
public class MultipleMongoConfig {
 @Autowired
 private MultipleMongoProperties mongoProperties;
 @Primary
 @Bean(name = PrimaryMongoConfig.MONGO_TEMPLATE)
 public MongoTemplate primaryMongoTemplate() throws Exception {
  return new MongoTemplate(primaryFactory(this.mongoProperties.getPrimary()));
 }
 @Bean
 @Qualifier(SecondaryMongoConfig.MONGO_TEMPLATE)
 public MongoTemplate secondaryMongoTemplate() throws Exception {
  return new MongoTemplate(secondaryFactory(this.mongoProperties.getSecondary()));
 }
 @Bean
 @Primary
 public MongoDbFactory primaryFactory(MongoProperties mongo) throws Exception {
  return new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),
    mongo.getDatabase());
 }
 @Bean
 public MongoDbFactory secondaryFactory(MongoProperties mongo) throws Exception {
  return new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),
    mongo.getDatabase());
 }
}

兩個庫的配置信息已經(jīng)完成。

4、創(chuàng)建兩個庫分別對應的對象和Repository

借助lombok來構(gòu)建對象

@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(collection = "first_mongo")
public class PrimaryMongoObject {
 @Id
 private String id;
 private String value;
 @Override
 public String toString() {
  return "PrimaryMongoObject{" + "id='" + id + '\'' + ", value='" + value + '\''
    + '}';
 }
}

對應的Repository

public interface PrimaryRepository extends MongoRepository<PrimaryMongoObject, String> {
}

繼承了 MongoRepository 會默認實現(xiàn)很多基本的增刪改查,省了很多自己寫dao層的代碼

Secondary和上面的代碼類似就不貼出來了

5、最后測試

@RunWith(SpringRunner.class)
@SpringBootTest
public class MuliDatabaseTest {
 @Autowired
 private PrimaryRepository primaryRepository;
 @Autowired
 private SecondaryRepository secondaryRepository;
 @Test
 public void TestSave() {
  System.out.println("************************************************************");
  System.out.println("測試開始");
  System.out.println("************************************************************");
  this.primaryRepository
    .save(new PrimaryMongoObject(null, "第一個庫的對象"));
  this.secondaryRepository
    .save(new SecondaryMongoObject(null, "第二個庫的對象"));
  List<PrimaryMongoObject> primaries = this.primaryRepository.findAll();
  for (PrimaryMongoObject primary : primaries) {
   System.out.println(primary.toString());
  }
  List<SecondaryMongoObject> secondaries = this.secondaryRepository.findAll();
  for (SecondaryMongoObject secondary : secondaries) {
   System.out.println(secondary.toString());
  }
  System.out.println("************************************************************");
  System.out.println("測試完成");
  System.out.println("************************************************************");
 }
}

到此,mongodb多數(shù)據(jù)源的使用已經(jīng)完成。

示例代碼

以上所述是小編給大家介紹的Spring boot中mongodb的使用,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關文章

  • 一文搞懂Spring AOP的五大通知類型

    一文搞懂Spring AOP的五大通知類型

    本文將詳細為大家介紹Spring AOP的五種通知類型(前置通知、后置通知、返回通知、異常通知、環(huán)繞通知),感興趣的朋友可以了解一下
    2022-06-06
  • Java的Socket實現(xiàn)長連接以及數(shù)據(jù)的發(fā)送和接收方式

    Java的Socket實現(xiàn)長連接以及數(shù)據(jù)的發(fā)送和接收方式

    這篇文章主要介紹了Java的Socket實現(xiàn)長連接以及數(shù)據(jù)的發(fā)送和接收方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • io.netty項目UDP實現(xiàn)方式

    io.netty項目UDP實現(xiàn)方式

    這篇文章主要介紹了io.netty項目UDP實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • SpringMVC上傳和解析Excel方法

    SpringMVC上傳和解析Excel方法

    這篇文章主要介紹了SpringMVC上傳和解析Excel方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • SpringBoot?項目瘦身maven/gradle詳解

    SpringBoot?項目瘦身maven/gradle詳解

    這篇文章主要介紹了SpringBoot項目瘦身(maven/gradle),本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-01-01
  • Java線程之程安全與不安全代碼示例

    Java線程之程安全與不安全代碼示例

    這篇文章主要介紹了Java線程之程安全與不安全代碼示例,還是比較不錯的,這里分享給大家,供需要的朋友參考。
    2017-11-11
  • 一文搞懂如何實現(xiàn)Java,Spring動態(tài)啟停定時任務

    一文搞懂如何實現(xiàn)Java,Spring動態(tài)啟停定時任務

    定時任務的應用場景十分廣泛,如定時清理文件、定時生成報表、定時數(shù)據(jù)同步備份等。本文將教你實現(xiàn)Java、Spring動態(tài)啟停定時任務,感興趣的可以學習一下
    2022-06-06
  • Java多線程中的Interrupt簡析

    Java多線程中的Interrupt簡析

    這篇文章主要介紹了Java多線程中的Interrupt簡析,Interrupt 的其作用是"中斷"線程, 但實際上線程仍會繼續(xù)運行, 這是一個非常容易混淆的概念,Interrupt 的真正作用是給線程對象設置一個中斷標記, 并不會影響線程的正常運行,需要的朋友可以參考下
    2023-09-09
  • Java swing實現(xiàn)音樂播放器桌面歌詞字體變色效果

    Java swing實現(xiàn)音樂播放器桌面歌詞字體變色效果

    這篇文章主要為大家詳細介紹了Java swing實現(xiàn)音樂播放器桌面歌詞字體變色效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • ElasticSearch不停機重建索引延伸思考及優(yōu)化詳解

    ElasticSearch不停機重建索引延伸思考及優(yōu)化詳解

    這篇文章主要為大家介紹了ElasticSearch不停機重建索引延伸思考及優(yōu)化詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02

最新評論

屏东县| 曲水县| 龙门县| 白城市| 绿春县| 泽普县| 新绛县| 五峰| 瑞昌市| 辉南县| 光泽县| 中江县| 津市市| 恩平市| 福建省| 吉林市| 金阳县| 明光市| 怀柔区| 特克斯县| 龙山县| 星子县| 南岸区| 遂昌县| 长阳| 乃东县| 黄梅县| 黎川县| 正安县| 永修县| 应城市| 云浮市| 永胜县| 雷州市| 蒙自县| 武平县| 忻城县| 桐柏县| 双牌县| 延庆县| 静乐县|