SpringBoot整合MongoDB(一)

SpringBoot整合MongoDB

此文章建立在Mongodb數據庫已安裝完成情況下。若服務器(linux系統/redhat)沒有安裝MongoDB,可查看我的另一篇文章 Centos7 使用Yum源安裝MongoDB4.2版本數據庫(補:密碼配置)

本文章僅僅爲單數據源配置,多數據源配置我在下一文中會編寫。

本文章使用MongoTemplate而非springdatamongodb(個人感覺使用起來更舒適)

一.準備

創建SpringBoot工程,添加吐下依賴 可在創建工程時nosql那欄選擇。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
二.文件配置
(1)YML文件配置

個人習慣使用yml格式對Springboot工程進行配置

mongodb連接配置如下:

無密碼連接

spring:
  data:
    mongodb:
      uri: mongodb://服務器IP:端口/數據庫名

有密碼連接

spring:
  data:
    mongodb:
      uri: mongodb://用戶名:密碼@服務器IP:端口/數據庫名
      # 上方爲明確指定某個數據的用戶進行連接
      # 也可以使用admin 數據庫中的用戶進行連接  統一到admin 數據庫進行認證
      # admin 用戶認證 url 寫法: mongodb://賬戶:密碼%40@ip:端口/數據庫名?authSource=admin&authMechanism=SCRAM-SHA-1

mongodb數據庫與mysql不一樣 mysql 一個普通用戶可以管理多個數據庫,但是mongo每一個庫都有一個獨立的管理用戶,連接時需要輸入對應用戶密碼

(2)MongoDB監聽配置

此類若不加,那麼插入的一行會默認添加一個_class字段來存儲實體類類型 如(com.example.demo.entity.Student)

/**
 * @author lei
 * @version 1.0
 * @date 2020/02/16 11:22
 * @desc: 監聽芒果 保存數據
 */
@Configuration
public class ApplicationReadyListener implements ApplicationListener<ContextRefreshedEvent> {

  @Autowired
  MongoTemplate oneMongoTemplate;
  
  private static final String TYPEKEY = "_class";

  @Override
  public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
    MongoConverter converter = oneMongoTemplate.getConverter();
    if (converter.getTypeMapper().isTypeKey(TYPEKEY)) {
      ((MappingMongoConverter) converter).setTypeMapper(new DefaultMongoTypeMapper(null));
    }
  }
}
三.pojo實體類,service,controller編寫

student 編寫以及主鍵ID注意事項

/**
 * @author : leilei
 * @date : 10:23 2020/2/16
 * @desc :student 實體類
 */
@Data
@Document(collection = "student")  //指定要對應的文檔名(表名)
public class Student {

    /*** 自定義mongo主鍵 加此註解可自定義主鍵類型以及自定義自增規則
     *  若不加 插入數據數會默認生成 ObjectId 類型的_id 字段
     *  org.springframework.data.annotation.Id 包下
     *  mongo庫主鍵字段還是爲_id 。不必細究(本文實體類中爲id)
     */
    @Id
    private Long id;
    private String username;
    private LocalDateTime timer;
}

service服務層編寫以及注意事項

接口實現類須注入MongoTemplate ,使用MongoTemplate 對Mongo庫進行操作

/**
 * @author : leilei
 * @date : 10:29 2020/2/16
 * @desc :
 */
@Service
public class StudentServiceImpl implements IStudentService {

    @Autowired
    private MongoTemplate mongoTemplate;
}
四.MongoTemplate 操作mongo庫
(1)新增

接口

int insertStudent(Student student);

實現類

@Override
    public int insertStudent(Student student) {
        student.setTimer(LocalDateTime.now());
        mongoTemplate.insert(student);
        try {
            return 1;
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        }
    }
(2)修改

此文根據Id修改 ,如需其他條件 修改Query 查詢條件即可

接口

int updateStudent(Student student);

實現類

需注意 Query 以及update 在org.springframework.data.mongodb.core.query 包下

    @Override
    public int updateStudent(Student student) {
    	//通過query根據id查詢出對應對象,通過update對象進行修改
        Query query = new Query(Criteria.where("_id").is(student.getId()));
        Update update = new Update().set("username", student.getUsername());
        try {
            mongoTemplate.updateFirst(query, update, Student.class);
            return 1;
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        }
    }
(3)刪除

此文根據id刪除,如需其他刪除條件,修改對應Query對象即可

接口

int removeStudent(Long id);

實現類

    @Override
    public int removeStudent(Long id) {
        Query query=new Query(Criteria.where("_id").is(id));
        try {
            mongoTemplate.remove(query,Student.class);
            return 1;
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        }
    }

(4)查詢一個

我這裏查詢條件統一爲實體類,取字段即可

查詢一個精確匹配

根據id/其他(更換query查詢條件) -------

接口

Student findOne(Student student);

實現類

    @Override
    public Student findOne(Student student) {
        Query query = new Query(Criteria.where("_id").is(student.getId()));
        Student one = mongoTemplate.findOne(query, Student.class);
        return one;
    }
(5)查詢集合-模糊匹配

查詢集合-模糊匹配

根據id/其他(更換query查詢條件) -------

我這裏查詢條件統一爲實體類,取字段即可

接口

 List<Student> findlike(Student student);

實現類

注意:Pattern 包路徑爲 java.util.regex.Pattern;

    @Override
    public List<Student> findlike(Student student) {
        Pattern pattern = Pattern.compile("^.*" + student.getUsername().trim() + ".*$", Pattern.CASE_INSENSITIVE);
        Query query = new Query(Criteria.where("username").regex(pattern));
        List<Student> studentList = mongoTemplate.find(query, Student.class);
        return studentList;
    }
(6)查詢集合-精確匹配

查詢集合-精確匹配

根據id/其他(更換query查詢條件) -------

我這裏查詢條件統一爲實體類,取字段即可

接口

List<Student> findmore(Student student);

實現類

    @Override
    public List<Student> findmore(Student student) {
        Query query = new Query(Criteria.where("username").is(student.getUsername()));
        List<Student> students = mongoTemplate.find(query, Student.class);
        return students;
    }
(7)倒敘排列查詢

根據時間倒敘排列查詢所有**

接口

 List<Student> findtime(Student student);

實現類

需注意 :Sort的包路徑爲 import org.springframework.data.domain.Sort;

SpringBoot2.2.X版本與Mongo整合寫法有變動 本文SpringBoot版本爲2.1.4

    @Override
    public List<Student> findtime(Student student) {
        Query query = new Query();
        query.with(new Sort(Sort.Direction.DESC, "timer"));
        List<Student> students = mongoTemplate.find(query, Student.class);
        return students;
    }
(8)MongoDB分頁查詢

接口

 List<Student> findtimeByPage(Student student);

實現類

需要注意:skip 和java8 Stream 中用法一致,即跳過多少個 limit 爲分頁的每頁最大條數 3 則每頁分3條 5則每頁分五條

 @Override
    public List<Student> findtimeByPage(Student student) {
        Query query = new Query();
        query.with(new Sort(Sort.Direction.DESC, "timer"));
        query.skip(0).limit(3);
        List<Student> students = mongoTemplate.find(query, Student.class);
        return students;
    }

項目中可以在進入Controller 中調用一個方法 ,將分頁數據存入到query中,後續查詢將query作爲參數代入查詢接口中的方法

我自己的demo

 /** 查詢玩家賬戶信息列表 */
  @RequiresPermissions("game:user:list")
  @PostMapping("/list")
  @ResponseBody
  public TableDataInfo list(User user) {
    Query query = MOngodbstartPage();
    ViewResponse viewResponse = userService.selectUserList(user, query);
    return MongogetDataTable(viewResponse.getLists(), viewResponse.getSize());
  }


 /** 設置請求分頁數據 得到query */ 
  protected Query MOngodbstartPage() {
    PageDomain pageDomain = TableSupport.buildPageRequest();
    Integer pageNum = pageDomain.getPageNum();
    Integer pageSize = pageDomain.getPageSize();
    Query query = new Query().skip((pageNum - 1) * pageSize).limit(pageSize);
    return query;
  }
  //後續查詢將query代入接口中,如需其他查詢條件  就query.方法  這要既有條件,又有分頁了
  userService.selectUserList(user, query);
  

項目連接:mongodb
MongoDB的基礎使用差不多就是這些了,後續的mongo多數據源以及 Aggregation管道高級查詢,將繼續更新。。。。。。。。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章