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管道高級查詢,將繼續更新。。。。。。。。。。。