引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
application.yml
1、没有密码
spring:
data:
mongodb:
uri: mongodb://服务器IP:端口/数据库名
2、有密码
spring:
data:
mongodb:
uri: mongodb://用户名:密码@服务器IP:端口/数据库名
# 也可以使用admin 数据库中的用户进行连接 统一到admin 数据库进行认证
# admin 用户认证 url 写法: mongodb://账户:密码%40@ip:端口/数据库名?authSource=admin&authMechanism=SCRAM-SHA-1
注意:
mysql 一个普通用户可以管理多个数据库
但是mongo每一个库都有一个独立的管理用户,连接时需要输入对应用户密码【一对一】
config
/**
* 监听mongodb 保存数据
* @author jane
* @date 2022/8/16
*/
public class ApplicationReadyListener implements ApplicationListener<ContextRefreshedEvent> {
@Autowired
MongoTemplate mongoTemplate;
private static final String TYPEKEY="_class";
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
MongoConverter converter = mongoTemplate.getConverter();
if (converter.getTypeMapper().isTypeKey(TYPEKEY)){
((MappingMongoConverter)converter).setTypeMapper(new DefaultMongoTypeMapper(null));
}
}
}
pojo
注意:不要写错,是collection 指定表名
@Data
//要指定表名
@Document(collection = "student")
public class Student {
/**
* 要指定id,如果不指定,就会默认生成objectId类型的_id字段
*/
@Id
private Long id;
private String username;
private LocalDateTime timer;
}
service
接口 :
public interface IStudentService {
//插入学生
int insert(Student student);
//修改学生
int update(Student student);
//删除学生
int delete(Long id);
//精准查询
Student findOne(Student student);
//模糊查询
List<Student> findLike(Student student);
//精准查询
List<Student> findMore(Student student);
//时间倒叙查询
List<Student> findTime();
//分页查询
List<Student> findByPage(Student student,int num,int size);
}
实现类:
查询:new Query(Criteria.where is and d等等)
删除:remove
更新:update
插入:Insert
@Service
public class StudentServiceImpl implements IStudentService{
//必须引入
@Autowired
MongoTemplate mongoTemplate;
@Override
public int insert(Student student) {
try {
student.setTimer(LocalDateTime.now());
mongoTemplate.insert(student);
return 1;
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
@Override
public int update(Student student) {
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;
}
}
@Override
public int delete(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;
}
}
@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;
}
@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;
}
@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;
}
@Override
public List<Student> findTime() {
Query query = new Query();
query.with(Sort.by(Sort.Direction.DESC,"timer"));
List<Student> students = mongoTemplate.find(query, Student.class);
return students;
}
/**
* 分页查询
* @param student
* @param num 当前页
* @param size 每页的大小
* @return
*/
@Override
public List<Student> findByPage(Student student,int num,int size) {
int pageSize= Optional.ofNullable(size).orElse(5);
int pageNum=Optional.ofNullable(num).orElse(1);
Query query = new Query();
query.with(Sort.by(Sort.Direction.DESC,"timer"));
query.skip((pageNum-1)*pageSize).limit(pageSize);
List<Student> students = mongoTemplate.find(query, Student.class);
return students;
}
}