MongoDB - 整合 SpringBoot 操作全流程
目录
一、MongoDB 整合 SpringBoot
1.1、引入依赖
1.2、配置文件
1.3、集合操作
1.4、相关注解
1.5、文档操作
Tips:重要提示
1.5.1、查询
1.5.2、分页查询 + 排序
1.5.3、更新
1.5.4、删除
1.6、事务
一、MongoDB 整合 SpringBoot
1.1、引入依赖
org.springframework.boot spring-boot-starter-data-mongodb
1.2、配置文件
spring: data: mongodb: uri: mongodb://192.168.73.3:27017/demo field-naming-strategy: org.springframework.data.mapping.model.SnakeCaseFieldNamingStrategy # 自动转驼峰 # mongodb 一般不设置密码 # username: root # password: 1111
uri 格式为: mongodb://ip 地址:mongodb 端口号/集合名
1.3、集合操作
Ps:以 demo 集合为例
a)创建集合
if(!mongoTemplate.collectionExists("demo")) { //不存在才能创建,如果以及存在再创建就会报错 mongoTemplate.createCollection("demo"); }
b)删除集合
mongoTemplate.dropCollection("demo1");
1.4、相关注解
a)@Document
- 修饰范围:在类上.
- 作用:映射当前类的一个对象为 mongo 的一条文档.
- 属性:value 和 collection 都是用来表示操作的集合名.
b)@Id
- 修饰范围:成员变量、方法.
- 作用:将值映射成文档的 _id.
c)@Field
- 修饰范围:成员变量、方法.
- 作用:将值映射为文档中的一个 key 名称.
d)@Transient
- 修饰范围:成员变量、方法.
- 租用:指定值不参与文档序列化.
以 User 类为例:
@Document("demo") //表示当前文档属于哪个集合 public class User { @Id //当前类的 id 映射文档中的 _id private Integer id; private String name; private Integer age; @Field("work_day") //当前类的 workDay 映射文档中的 work_day private Date workDay; public User(Integer id, String name, Integer age, Date workDay) { this.id = id; this.name = name; this.age = age; this.workDay = workDay; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + ", workDay=" + workDay + '}'; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Date getWorkDay() { return workDay; } public void setWorkDay(Date workDay) { this.workDay = workDay; } }
1.5、文档操作
Tips:重要提示
mongo 对类型有严格的要求. 例如根据 id 查询用户,你使用 String 类型的 id 作为 查询的参数,而 mongo 文档中保存的是 Long 类型的参数,此时你的查询记不起作用.
这点需要跟 MySQL 区分开!!!
1.5.1、查询
//1.查询所有 System.out.println("------------------------------------------------"); List users = mongoTemplate.findAll(User.class); users.forEach(System.out::println); //2.根据 id 查询指定文档 System.out.println("------------------------------------------------"); User byId = mongoTemplate.findById(1, User.class); System.out.println(byId); //3.根据查询条件进行查询(参数1: 查询条件, 参数2: 返回类型) System.out.println("------------------------------------------------"); // mongoTemplate.find(new Query(), User.class); //没有查询条件就是查询所有 //a) 等值查询 System.out.println("------------------------------------------------"); List users1 = mongoTemplate.find(Query.query(Criteria.where("name").is("周杰伦")), User.class); users1.forEach(System.out::println); //b) > 查询: gt()、>= 查询: gte() 、
1.5.2、分页查询 + 排序
public List findPaginated(int page, int size) { // 创建查询对象 Query query = new Query(); // 添加过滤条件,如果有的话 // query.addCriteria(Criteria.where("fieldName").is("value")); // 添加排序条件,如果有的话 // query.with(Sort.by(Sort.Direction.ASC, "fieldName")); // 计算跳过的文档数量 long skip = (page - 1) * size; // 设置查询的起始位置和返回的数量 query.skip(skip).limit(size); // 执行查询并返回结果 return mongoTemplate.find(query, MyDocument.class, "collectionName"); }
1.5.3、更新
更新指定字段的值.
//1.更新条件 Query query = Query.query(Criteria.where("name").is("周杰伦")); //2.更新内容 Update update = new Update(); update.set("age", 20); //a) 更新单条 mongoTemplate.updateFirst(query, update, User.class); //b) 更新多条 mongoTemplate.updateMulti(query, update, User.class); //c) 不存在就插入(存在就更新第一条) mongoTemplate.upsert(query, update, User.class);
指定某字段自增一,或者自减一.
mongoTemplate.updateFirst( Query.query( Criteria .where("_id") .is(dto.getTargetId()) ), new Update().inc("like_cnt", 1), //如果是 -1,就表示自减一 AlbumStatGO.class );
1.5.4、删除
//1.删除所有 mongoTemplate.remove(new Query(), User.class); //2.条件删除 mongoTemplate.remove(Query.query(Criteria.where("name").is("林俊杰")), User.class);
1.6、事务
MongoDB 4.0 之后就支持事务了.
但是开启事务的前提如下:
a)开启集群模式(多副本集配置)
b)进行如下配置:
@Configuration class MongoTransaction { @Bean fun transactionManager(factory: MongoDatabaseFactory): MongoTransactionManager { return MongoTransactionManager(factory) } }
c)在需要回滚的地方加上 @Transactional 注解
@Transactional fun handler(dto: RegDto) { userIdentRepo.save(dto) throw AppException(ApiStatus.INVALID_PARAM, "这里故意触发异常,为了检验事务*-") userDetailRepo.save(dto.id!!) }
Ps:如果没有进行副本集的配置,就会报如下错误:
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理!
部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!
图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!