[Java基础篇]Spring Boot整合MongoDB
✨博主介绍
前言
MongoDB
CAP定理(CAP theorem)
NoSQL 的优点/缺点
NoSQL 数据库分类
MongoDB整合Spring Boot
在pom.xml添加坐标
添加MyUser实体类
MongoDB常用方法
MongoDB添加方法
MongoDB查询方法
💫点击直接资料领取💫
✨博主介绍
🌊 作者主页:苏州程序大白
🌊 作者简介:🏆CSDN人工智能域优质创作者🥇,苏州市凯捷智能科技有限公司创始之一,目前合作公司富士康、歌尔等几家新能源公司
💬如果文章对你有帮助,欢迎关注、点赞、收藏
💅 有任何问题欢迎私信,看到会及时回复
💅关注苏州程序大白,分享粉丝福利
前言
MongoDB
NoSQL = Not Only ),意即“NoSQL”。
在现代的计算系统上每天网络上都会产生大量的数据量。
1970 年 EFCodd 提出的关系模型的论文“Arelational model of data for large shared databases”,这部分数据有很大一部分关系数据库管理系统(RDBMS)来。简单。
应用非常证明,关系模式适合于客户服务器应用程序,通过范围的利益,今天它是数据在网络和商务应用的目标技术。
NoSQL是全新地的某人性运动早期提出,发展至09年趋势越发高涨。NoSQL的拥护者们覆盖使用2个数据库就关系型的数据存储,相对于铺天数据库的关系型应用,是一种全新的思想的注入。
CAP定理(CAP theorem)
在计算机科学中, CAP定理(CAP theorem), 又被称作 布鲁尔定理(Brewer’s theorem), 它指出对于一个分布式计算系统来说,不可能同时满足以下三点:
一致性(Consistency) (所有节点在同一时间具有相同的数据)
可用性(Availability) (保证每个请求不管成功或者失败都有响应)
分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)
CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。
因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三 大类:
CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
CP - 满足一致性,分区容忍性的系统,通常性能不是特别高。
AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。
NoSQL 的优点/缺点
优点:
高可扩展性
计算计算
标记
架构的,半数据数据
没有复杂的关系
缺点:
没有标准化
有限的查询功能(取消)
最终一致是不喜欢的程序
NoSQL 数据库分类
类型 代表部分 特点
列存储 Hbase Cassandra Hypertable 顾名思义,是按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查询有非常大的IO优势。
文档存储 MongoDB CouchDB 文档存储一般用类似json的格式存储,存储的内容是文档型的。这样也就有机会对某些字段建立索引,实现关系数据库的某些功能。
key-value存储 Tokyo Cabinet / Tyrant Berkeley DB MemcacheDB Redis 可以通过key快速查询到其value。一般来说,存储不管value的格式,照单全收。(Redis包含了其他功能)
图存储 Neo4J FlockDB 图形关系的最佳存储。使用传统关系数据库来解决的话性能低下,而且设计使用不方便。
对象存储 db4o Versant 通过类似面向对象语言的语法操作数据库,通过对象的方式存取数据。
xml数据库 Berkeley DB XML BaseX 高效的存储XML数据,并支持XML的内部查询语法,比如XQuery,Xpath。
MongoDB整合Spring Boot
在pom.xml添加坐标
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
在application文件添加mongodb的配置
spring.data.mongodb.uri=mongodb://106.75.148.160:27017/test
添加MyUser实体类
@Data @Document("MyUser") public class MyUser { @Id private String id; private String name; private Integer age; private String email; private String createDate; }
MongoDB常用方法
mongoTemplate.findAll(MyUser.class): 查询User文档的全部数据
mongoTemplate.findById(, MyUser.class): 查询User文档id为id的数据
mongoTemplate.find(query, MyUser.class):根据query内的查询条件查询
mongoTemplate.upsert(query, update, MyUser.class): 修改
mongoTemplate.remove(query, MyUser.class): 删除
mongoTemplate.insert(User): 新增
MongoDB添加方法
@RequestMapping("testMongoDBAdd") public String testMongoDBAdd(){ MyUser myUser = new MyUser(); myUser.setAge(22); myUser.setEmail("123456789@qq.com"); myUser.setName("苏州程序大白"); mongoTemplate.insert(myUser); return "添加成功"; }
MongoDB查询方法
Query对象
1、创建一个query对象(用来封装所有条件对象),再创建一个criteria对象(用来构建条件)。
2、 精准条件:criteria.and(“key”).is(“条件”)模糊条件:criteria.and(“key”).regex(“条件”)。
3、封装条件:query.addCriteria(criteria)。
4、大于(创建新的criteria):Criteria gt = Criteria.where(“key”).gt(“条件”)小于(创建新的criteria):Criteria lt = Criteria.where(“key”).lt(“条件”)。
5、Query.addCriteria(new Criteria().andOperator(gt,lt))。
6、一个query中只能有一个andOperator()。其参数也可以是Criteria数组。
7、排序 :query.with(new Sort(Sort.Direction.ASC, “age”). and(new Sort(Sort.Direction.DESC, “date”)))。
查询方法
@RequestMapping("testMongoDBfindAll") public String testMongoDBfindAll(){ List<MTest> mTests = mongoTemplate.findAll( MTest.class); System.out.println("mTests="+mTests); return "查询成功"; }
根据ID查询
@RequestMapping("testMongoDBfindById") public String testMongoDBfindById(){ MyUser myUser = mongoTemplate.findById("", MyUser.class); System.out.println("myUser="+myUser); return "查询成功"; }
条件查询
@RequestMapping("testMongoDBCriteria") public String testMongoDBCriteria(){ Query query = new Query(); Criteria criteria = Criteria.where("name").is("苏州程序大白"); query.addCriteria(criteria); List<MyUser> myUsers = mongoTemplate.find(query, MyUser.class); System.out.println("mTests="+myUsers); return "查询成功"; }
模糊查询
//模糊查询 public void findUsersLikeName() { String name = "est"; String regex = String.format("%s%s%s", "^.*", name, ".*$"); Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); Query query = new Query(Criteria.where("name").regex(pattern)); List<User> userList = mongoTemplate.find(query, User.class); System.out.println(userList); }
分页查询
//分页查询 public void findUsersPage() { String name = "est"; int pageNo = 1; int pageSize = 10; Query query = new Query(); String regex = String.format("%s%s%s", "^.*", name, ".*$"); Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); query.addCriteria(Criteria.where("name").regex(pattern)); int totalCount = (int) mongoTemplate.count(query, User.class); List<User> userList = mongoTemplate.find(query.skip((pageNo - 1) * pageSize).limit(pageSize), User.class); Map<String, Object> pageMap = new HashMap<>(); pageMap.put("list", userList); pageMap.put("totalCount",totalCount); System.out.println(pageMap); }
修改方法
//分页查询 public void findUsersPage() { String name = "est"; int pageNo = 1; int pageSize = 10; Query query = new Query(); String regex = String.format("%s%s%s", "^.*", name, ".*$"); Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); query.addCriteria(Criteria.where("name").regex(pattern)); int totalCount = (int) mongoTemplate.count(query, User.class); List<User> userList = mongoTemplate.find(query.skip((pageNo - 1) * pageSize).limit(pageSize), User.class); Map<String, Object> pageMap = new HashMap<>(); pageMap.put("list", userList); pageMap.put("totalCount",totalCount); System.out.println(pageMap); }
删除方法
//删除操作 @RequestMapping("TestMongoDBDelete") public void TestMongoDBDelete() { Query query = new Query(Criteria.where("_id").is("5ff45642ac290f356edf9b5aa")); DeleteResult result = mongoTemplate.remove(query, MyUser.class); long count = result.getDeletedCount(); System.out.println(count); }