1. 程式人生 > >第十二章 springboot + mongodb(復雜查詢)

第十二章 springboot + mongodb(復雜查詢)

參考 參數 iter extends lec con display itl dad

  • 簡單查詢:使用自定義的XxxRepository接口即可。(見 第十一章 springboot + mongodb(簡單查詢))
  • 復雜查詢:使用MongoTemplate以及一些查詢條件構建類(BasicDBList、BasicDBObject、Criteria等)

1、application.properties

1 #mongodb note:mongo3.x will not use host and port,only use uri
2 #spring.data.mongodb.host=192.168.22.110
3 #spring.data.mongodb.port=27017
4 #spring.data.mongodb.database=myfirstMongodb
5 spring.data.mongodb.uri=mongodb://192.168.22.110:27017/myfirstMongodb

說明:

  • mongo2.x支持以上兩種配置方式
  • mongo3.x僅支持uri方式

2、Admin

技術分享
package com.xxx.firstboot.domain;

import org.springframework.data.annotation.Id;

/**
 * 測試復雜的mongo查詢
 */
public class Admin {
    @Id
    private String adminId;
    private String name;
    private Integer sex;
    private String address;

    
public String getAdminId() { return adminId; } public void setAdminId(String adminId) { this.adminId = adminId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public
Integer getSex() { return sex; } public void setSex(Integer sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
View Code

註意:

  • @Id必須有

3、AdminRepository

package com.xxx.firstboot.mongo;

import org.springframework.data.mongodb.repository.MongoRepository;

import com.xxx.firstboot.domain.Admin;

public interface AdminRepository extends MongoRepository<Admin, String> {
}

說明:該接口用於簡單查詢。這裏是一個空接口,具有CRUD功能。

4、CustomerController

技術分享
/*********************測試復雜的mongo查詢**********************/
    @Autowired
    private AdminRepository adminRepository;
    @Autowired
    private MongoTemplate mongoTemplate;
    
    @ApiOperation("增加一個Admin")
    @RequestMapping(value = "/addAdmin", method = RequestMethod.GET)
    public Admin addAdmin(@RequestParam("name") String name,
                          @RequestParam("sex") Integer sex,
                          @RequestParam("address") String address) {
        Admin admin = new Admin();
        admin.setName(name);
        admin.setSex(sex);
        admin.setAddress(address);
        return adminRepository.save(admin);
    }
    
    @ApiOperation("獲取所有的Admin")
    @RequestMapping(value = "/getAllAdmin", method = RequestMethod.GET)
    public List<Admin> getAllAdmin() {
        return adminRepository.findAll();
    }
    
    @ApiOperation("復雜的admin查詢")
    @RequestMapping(value = "/getAdminByNameAndSexOrAddress", method = RequestMethod.GET)
    public Admin getAdminByNameAndSexOrAddress(@RequestParam("name") String name,
                                                 @RequestParam(value="sex",required=false) Integer sex,
                                                 @RequestParam(value="address",required=false) String address) {
        /**
         * OR
         */
        BasicDBList orList = new BasicDBList(); //用於記錄
        if (sex != null) {
            orList.add(new BasicDBObject("sex", sex));
        }
        if (StringUtils.isNotBlank(address)) {
            orList.add(new BasicDBObject("address", address));
        }
        BasicDBObject orDBObject = new BasicDBObject("$or", orList);
        
        /**
         * and
         */
        BasicDBList andList = new BasicDBList();
        andList.add(new BasicDBObject("name", name));
        andList.add(orDBObject);
        BasicDBObject andDBObject = new BasicDBObject("$and", andList);
        
        return mongoTemplate.findOne(new BasicQuery(andDBObject), Admin.class);

    }
View Code

說明:

  • getAdminByNameAndSexOrAddress要實現select * from admin where name = ? and (sex = ? or address = ?)
  • 通過BasicDBList、BasicDBObject構建查詢參數
  • findOne返回第一個符合條件的結果、find返回符合條件的結果列表
  • 以上查詢的collection是admin(VO的簡單類名),也可以指定從某一個collection中查詢(查看find、findOne等方法)

註意:mongodb的查詢字段必須是小寫

測試:

啟動mongo,啟動應用,打開swagger,訪問即可。

參考:

http://blog.csdn.net/congcong68/article/details/47183209

第十二章 springboot + mongodb(復雜查詢)