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管道高级查询,将继续更新。。。。。。。。。。。