spring boot 中使用mongoDB
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
配置 MongoDB 连接
spring:
data:
mongodb:
uri: mongodb://test:test%2C123@localhost:27017/test?authSource=admin
创建实体类
package cn.com.rstone.apioarstone.mongodb.model.entity;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Document(collection = "log")
@Data// 指定集合名
public class Log {
@Id
private String id; //mongoDB中的id
//使用 MongoDbConstant 中 type 的常量
private String type;
//controller 功能名字
private String controllerName;
//使用 MongoDbConstant 中 status 的常量
//controller 执行:START、END
private String status;
private String userId;
private String userName;
private String sql;
private Long runTime;
private String exception;
private LocalDateTime createTime;
}
创建service
package cn.com.rstone.apioarstone.mongodb.service;
import cn.com.rstone.apioarstone.mongodb.model.entity.Log;
import jakarta.annotation.Resource;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class MongodbLogService {
@Resource
private MongoTemplate mongoTemplate;
// @Autowired
// private UserRepository userRepository;
// 使用 MongoTemplate 的 CRUD 操作
// 插入
public Log insertUser(Log sqlLog) {
return mongoTemplate.insert(sqlLog);
}
// 查询所有
public List<Log> findAllSqlLog() {
return mongoTemplate.findAll(Log.class);
}
// 条件查询
public List<Log> findUsersByCondition(String username, int minAge) {
Query query = new Query();
query.addCriteria(Criteria.where("username").is(username)
.and("age").gte(minAge));
return mongoTemplate.find(query, Log.class);
}
//更新
public void updateUserName(String logId, String userName) {
Query query = new Query(Criteria.where("_id").is(logId));
Update update = new Update().set("userName", userName);
mongoTemplate.updateFirst(query, update, Log.class);
}
// 删除
public void deleteSqlLog(String id) {
Query query = new Query(Criteria.where("_id").is(id));
mongoTemplate.remove(query, Log.class);
}
}
使用
package cn.com.rstone.apioarstone.system.controller;
import cn.com.rstone.apioarstone.common.BaseResponse;
import cn.com.rstone.apioarstone.common.ResultUtils;
import cn.com.rstone.apioarstone.mongodb.model.entity.Log;
import cn.com.rstone.apioarstone.mongodb.service.MongodbLogService;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDate;
import java.time.LocalDateTime;
@RestController
@RequestMapping("/system/mongdblog")
public class MongodbLogController {
@Resource
private MongodbLogService mongodbSqlLogService;
@PostMapping("/add")
public BaseResponse<?> add(){
Log sqlLog = new Log();
sqlLog.setSql("select");
sqlLog.setCreateTime(LocalDateTime.now());
sqlLog.setUserId("2");
sqlLog.setUserName("adong");
mongodbSqlLogService.insertUser(sqlLog);
return ResultUtils.success(true);
}
@GetMapping("/list")
public BaseResponse<?> list(){
return ResultUtils.success(mongodbSqlLogService.findAllSqlLog());
}
}
配置 MongoDB 连接池
spring:
data:
mongodb:
uri: mongodb://localhost:27017/mydb
# 连接池配置
min-connections-per-host: 10
max-connections-per-host: 100
max-wait-time: 120000
max-connection-idle-time: 60000
max-connection-life-time: 0
connect-timeout: 10000
socket-timeout: 0
配置索引
// 在实体类上配置索引
@Document(collection = "users")
@CompoundIndexes({
@CompoundIndex(name = "idx_username_email",
def = "{'username': 1, 'email': 1}",
unique = true)
})
public class User {
// ...
@Indexed(unique = true)
private String email;
@Indexed
private Integer age;
}
分页查询
import org.springframework.data.domain.*;
public Page<User> getUsersByPage(int page, int size) {
Pageable pageable = PageRequest.of(page, size, Sort.by("createTime").descending());
return userRepository.findAll(pageable);
}
监听器(审计功能)
import org.springframework.data.mongodb.core.mapping.event.*;
@Component
public class MongoEventListener extends AbstractMongoEventListener<User> {
@Override
public void onBeforeConvert(BeforeConvertEvent<User> event) {
User user = event.getSource();
if (user.getCreateTime() == null) {
user.setCreateTime(new Date());
}
}
@Override
public void onAfterSave(AfterSaveEvent<User> event) {
// 保存后的操作
}
}
# spring boot 中使用mongoDB
## 添加依赖
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
```
## 配置 MongoDB 连接
```yaml
spring:
data:
mongodb:
uri: mongodb://test:test%2C123@localhost:27017/test?authSource=admin
```
## 创建实体类
```java
package cn.com.rstone.apioarstone.mongodb.model.entity;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Document(collection = "log")
@Data// 指定集合名
public class Log {
@Id
private String id; //mongoDB中的id
//使用 MongoDbConstant 中 type 的常量
private String type;
//controller 功能名字
private String controllerName;
//使用 MongoDbConstant 中 status 的常量
//controller 执行:START、END
private String status;
private String userId;
private String userName;
private String sql;
private Long runTime;
private String exception;
private LocalDateTime createTime;
}
```
## 创建service
```
package cn.com.rstone.apioarstone.mongodb.service;
import cn.com.rstone.apioarstone.mongodb.model.entity.Log;
import jakarta.annotation.Resource;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class MongodbLogService {
@Resource
private MongoTemplate mongoTemplate;
// @Autowired
// private UserRepository userRepository;
// 使用 MongoTemplate 的 CRUD 操作
// 插入
public Log insertUser(Log sqlLog) {
return mongoTemplate.insert(sqlLog);
}
// 查询所有
public List<Log> findAllSqlLog() {
return mongoTemplate.findAll(Log.class);
}
// 条件查询
public List<Log> findUsersByCondition(String username, int minAge) {
Query query = new Query();
query.addCriteria(Criteria.where("username").is(username)
.and("age").gte(minAge));
return mongoTemplate.find(query, Log.class);
}
//更新
public void updateUserName(String logId, String userName) {
Query query = new Query(Criteria.where("_id").is(logId));
Update update = new Update().set("userName", userName);
mongoTemplate.updateFirst(query, update, Log.class);
}
// 删除
public void deleteSqlLog(String id) {
Query query = new Query(Criteria.where("_id").is(id));
mongoTemplate.remove(query, Log.class);
}
}
```
## 使用
```java
package cn.com.rstone.apioarstone.system.controller;
import cn.com.rstone.apioarstone.common.BaseResponse;
import cn.com.rstone.apioarstone.common.ResultUtils;
import cn.com.rstone.apioarstone.mongodb.model.entity.Log;
import cn.com.rstone.apioarstone.mongodb.service.MongodbLogService;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDate;
import java.time.LocalDateTime;
@RestController
@RequestMapping("/system/mongdblog")
public class MongodbLogController {
@Resource
private MongodbLogService mongodbSqlLogService;
@PostMapping("/add")
public BaseResponse<?> add(){
Log sqlLog = new Log();
sqlLog.setSql("select");
sqlLog.setCreateTime(LocalDateTime.now());
sqlLog.setUserId("2");
sqlLog.setUserName("adong");
mongodbSqlLogService.insertUser(sqlLog);
return ResultUtils.success(true);
}
@GetMapping("/list")
public BaseResponse<?> list(){
return ResultUtils.success(mongodbSqlLogService.findAllSqlLog());
}
}
```
## **配置 MongoDB 连接池**
```yaml
spring:
data:
mongodb:
uri: mongodb://localhost:27017/mydb
# 连接池配置
min-connections-per-host: 10
max-connections-per-host: 100
max-wait-time: 120000
max-connection-idle-time: 60000
max-connection-life-time: 0
connect-timeout: 10000
socket-timeout: 0
```
## 配置索引
```java
// 在实体类上配置索引
@Document(collection = "users")
@CompoundIndexes({
@CompoundIndex(name = "idx_username_email",
def = "{'username': 1, 'email': 1}",
unique = true)
})
public class User {
// ...
@Indexed(unique = true)
private String email;
@Indexed
private Integer age;
}
```
## **分页查询**
```java
import org.springframework.data.domain.*;
public Page<User> getUsersByPage(int page, int size) {
Pageable pageable = PageRequest.of(page, size, Sort.by("createTime").descending());
return userRepository.findAll(pageable);
}
```
## 监听器(审计功能)
```java
import org.springframework.data.mongodb.core.mapping.event.*;
@Component
public class MongoEventListener extends AbstractMongoEventListener<User> {
@Override
public void onBeforeConvert(BeforeConvertEvent<User> event) {
User user = event.getSource();
if (user.getCreateTime() == null) {
user.setCreateTime(new Date());
}
}
@Override
public void onAfterSave(AfterSaveEvent<User> event) {
// 保存后的操作
}
}
```