一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Spring boot中mongodb的使用

Spring boot中mongodb的使用

2020-09-27 15:43Java之家 Java教程

MongoDB是最早熱門非關系數(shù)據(jù)庫的之一,使用也比較普遍,一般會用做離線數(shù)據(jù)分析來使用,放到內網(wǎng)的居多。這篇文章主要介紹了Spring boot中mongodb的使用,需要的朋友可以參考下

MongoDB是最早熱門非關系數(shù)據(jù)庫的之一,使用也比較普遍,一般會用做離線數(shù)據(jù)分析來使用,放到內網(wǎng)的居多。由于很多公司使用了云服務,服務器默認都開放了外網(wǎng)地址,導致前一陣子大批 MongoDB 因配置漏洞被攻擊,數(shù)據(jù)被刪,引起了人們的注意,感興趣的可以看看這篇文章:場屠戮MongoDB的盛宴反思:超33000個數(shù)據(jù)庫遭遇入侵勒索,同時也說明了很多公司生產中大量使用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ù)庫之間的產品,是非關系數(shù)據(jù)庫當中功能最豐富,最像關系數(shù)據(jù)庫的。他支持的數(shù)據(jù)結構非常松散,是類似json的bjson格式,因此可以存儲比較復雜的數(shù)據(jù)類型。Mongo最大的特點是他支持的查詢語言非常強大,其語法有點類似于面向對象的查詢語言,幾乎可以實現(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ù)結構,由字段和值對組成。MongoDB文檔與JSON對象類似。字段的值有可能包括其它文檔、數(shù)組以及文檔數(shù)組。MongoDB支持OS X、Linux及Windows等操作系統(tǒng),并提供了Python,PHP,Ruby,Java及C++語言的驅動程序,社區(qū)中也提供了對Erlang及.NET等平臺的驅動程序。

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包引用

?
1
2
3
4
5
6
<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
  </dependency>
</dependencies>

2、在application.properties中添加配置

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

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

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

2、創(chuàng)建數(shù)據(jù)實體

?
1
2
3
4
5
6
7
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對象的增刪改查

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
@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());
  //更新查詢返回結果集的第一條
  mongoTemplate.updateFirst(query,update,UserEntity.class);
  //更新查詢返回結果集的所有
  // 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ā)對應的測試方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@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、查看驗證結果

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

1.登錄mongos

?
1
bin/mongo -host localhost -port 20000

2、切換到test庫

?
1
use test

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

?
1
db.userEntity.find()

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

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

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

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

1、pom包配置

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<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代碼的工具,通過使用對應的注解,可以在編譯源碼的時候生成對應的方法。簡單試了以下這個工具還挺好玩的,加上注解我們就不用手動寫 gettersetter、構建方式類似的代碼了。

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

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

?
1
2
3
4
5
6
7
8
9
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開頭的兩個配置文件

?
1
2
3
4
5
6
@Data
@ConfigurationProperties(prefix = "mongodb")
public class MultipleMongoProperties {
 private MongoProperties primary = new MongoProperties();
 private MongoProperties secondary = new MongoProperties();
}

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

第一個庫的封裝

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

第二個庫的封裝

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

讀取對應的配置信息并且構造對應的MongoTemplate

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@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來構建對象

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@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

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

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

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

5、最后測試

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@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)站的支持!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲精品成人A8198A片漫画 | 久久精品国产清白在天天线 | 男女做污事 | 91香蕉依人综合久久 | 色图大全 | 日韩高清成人毛片不卡 | 色cccwww在线播放 | 特级夫妻大片免费在线播放 | 国产黑丝一区 | 欧洲老妇人70 | 青青草在线观看 | 明星梦淫 | 丝袜护士强制脚足取精 | poren黑人| 日本成人黄色网址 | 高清欧美videossexo免费 | 视频在线91 | 国产成人久久精品区一区二区 | 国内精品久久久久小说网 | 国产91精品区| 水多多www视频在线观看高清 | 给我免费的视频在线观看 | 国产午夜精品久久久久 | 国产欧美亚洲精品第一页青草 | 日本人泡妞xxxxxx69 | 人与动人物人a级特片 | a4yy欧美一区二区三区 | 亚洲免费精品视频 | 免费观看国产视频 | 成年人在线视频观看 | 亚洲AV 日韩 国产 有码 | 美日韩在线观看 | 单亲乱l仑在线观看免费观看 | 久久影院中文字幕 | 色综合久久六月婷婷中文字幕 | 欧美亚洲视频在线观看 | 91久久国产露脸精品 | 男人把大ji巴放进男人免费视频 | 成人综合婷婷国产精品久久免费 | 久久国产视频网 | 精品无码久久久久久久久 |