Spring Boot + MongoDB
Posted 橘子味儿的猫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot + MongoDB相关的知识,希望对你有一定的参考价值。
一、MongoDB介绍
MongoDB 是一个高性能,开源,无模式的文档型数据库,是当前noSql数据库产品中最热门的一种。它在许多场景下用于替代传统的关系型数据库或键值对存储方式,MongoDB是用C++开发,MongoDB的官方网址为 http://www.mongodb.org/
二、MongoDB特点
1. 特点
- 面向集合存储,易于存储对象类型的数据
- 模式自由
- 支持动态查询
- 支持完全索引,包含内部对象
- 支持查询
- 支持复制和故障恢复
- 使用高效的二进制数据存储,包括大型对象(如视频等)
- 自动处理碎片,以支持云计算的扩展性
- 支持 Python,php,Ruby,Java,C,C#,javascript,Perl 及 C++语言的驱动程序
- 社区中也提供了对 Erlang 及.NET 等平台的驱动程序
- 文件存储格式为 BSON(一种 JSON 的扩展)
- 可通过网络访问
2. 功能
- 面向集合的存储:适合存储对象及 JSON 形式的数据
- 动态查询:MongoDB 支持丰富的查询表达式。查询指令使用 JSON 形式的标记,可轻易
- 查询文档中内嵌的对象及数组
- 完整的索引支持:包括文档内嵌对象及数组。MongoDB 的查询优化器会分析查询表达式,并生成一个高效的查询计划
- 查询监视:MongoDB 包含一系列监视工具用于分析数据库操作的性能
- 复制及自动故障转移:MongoDB 数据库支持服务器之间的数据复制,支持主-从模式及
- 服务器之间的相互复制。复制的主要目标是提供冗余及自动故障转移
- 高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)
- 自动分片以支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器
3. 适用场合
- 网站数据:MongoDB 非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性
- 缓存:由于性能很高,MongoDB 也适合作为信息基础设施的缓存层。在系统重启之后,由 MongoDB 搭建的持久化缓存层可以避免下层的数据源过载
- 大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储
- 高伸缩性的场景:MongoDB 非常适合由数十或数百台服务器组成的数据库。MongoDB的路线图中已经包含对 MapReduce 引擎的内置支持
- 用于对象及 JSON 数据的存储:MongoDB 的 BSON 数据格式非常适合文档化格式的存储及查询
三、运行 springboot-mongodb 工程案例
git clone 下载工程 springboot-learning-example ,项目地址见 GitHub – https://github.com/zyuQ/springboot-learning-example.git
1. 安装MongoDB
详情跳转文章 -> MongoDB安装
2. 创建数据库
注:创建成功之后通过 show dbs 查询数据库。没有test 这个数据库是因为这个数据库目前没有数据,所以没有显示,实际上是已经创建成功了。
3. springboot-mongodb 功能代码结构
org.springboot.controller - Controller 层
org.springboot.dao - 数据访问层
org.springboot.pojo - 实体类
Application - 应用启动类
application.yml - 应用配置类
四、springboot-mongodb 工程代码详解
1. 工程项目Maven依赖
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- MongoDB --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> </dependencies>
2. application.yml 加入mongoDB相关配置
spring: data: mongodb: url: mongodb://localhost:27017/test # 我用的是本地安装的MongoDB,所以没有用户名和密码。 # url: mongodb://name:pass@localhost:27017/test # name: 用户名, pass: 密码 # url: mongodb://192:168:1:1:20000,192:168:1:2:20000,192:168:252:12:20000/test # 配置多个数据库用,则中间用 “,” 分割
User.class
package springboot.pojo; /** * 用户实体类 */ public class User { /** * 用户编号 */ private Long id; /** * 用户名称 */ private String userName; /** * 用户年龄 */ private int age; /** * 用户描述 */ private String desc; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } }
UserDao.class
package springboot.dao; import org.springframework.beans.factory.annotation.Autowired; 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.data.mongodb.core.query.Update; import org.springframework.stereotype.Component; import springboot.pojo.User; import java.util.List; /** * @Description: * @Author: zyu */ @Component public class UserDao { @Autowired private MongoTemplate mongoTemplate; /** * 创建对象 * @param user */ public User saveUser(User user) { User save = mongoTemplate.save(user); return save; } /** * 更新对象 * @param user */ public void updateUser(User user) { Query query = new Query(Criteria.where("id").is(user.getId())); Update update = new Update().set("userName", user.getUserName()).set("age", user.getAge()).set("desc", user.getDesc()); mongoTemplate.updateFirst(query, update, User.class); } /** * 根据用户名查询对象 * @param name * @return */ public User findUserByName(String name) { Query query = new Query(Criteria.where("userName").is(name)); User user = mongoTemplate.findOne(query, User.class); return user; } /** * 查询所有对象 * @return */ public List<User> findUserList() { List<User> all = mongoTemplate.findAll(User.class); return all; } /** * 删除对象 * @param id */ public void deleteUserById(String id) { Query query = new Query(Criteria.where("id").is(id)); mongoTemplate.remove(query, User.class); } }
HomeController.class
package springboot.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import springboot.dao.UserDao; import springboot.pojo.User; import java.util.List; /** * @Description: * @Author: zyu */ @RestController @RequestMapping("/user") public class UserController { @Autowired private UserDao userDao; @GetMapping("/findList") public List<User> findUserList() { List<User> userList = userDao.findUserList(); return userList; } @GetMapping("/findByName") public User findUserByName(@RequestParam String name) { User userByName = userDao.findUserByName(name); return userByName; } @GetMapping("/save") public User saveUser(@RequestParam long id,@RequestParam String name, @RequestParam Integer age, @RequestParam String desc) { User user = new User(); user.setUserName(name); user.setAge(age); user.setDesc(desc); user.setId(id); return userDao.saveUser(user); } @GetMapping("/update") public String updateUser(@RequestParam long id, @RequestParam String name, @RequestParam Integer age, @RequestParam String desc) { User user = new User(); user.setUserName(name); user.setDesc(desc); user.setAge(age); user.setId(id); userDao.updateUser(user); return "Success"; } }
注:如果保存的时候不存id,mongo会按照自己的规则分配一个字符串类型的id
下面我们启动程序进行测试
1. 新增: http://127.0.0.1:8080/user/save?id=1&name=zyu&age=21&desc=喜欢美食与旅行
可以看到新增成功
可以通过命令行: use test 进入 test 这个数据库
然后通过:db.user.find() 查询user这个文档对象下所有的数据
其他接口大家自己去测试吧
代码示例
本文示例读者可以通过查看下面仓库中代码:
以上是关于Spring Boot + MongoDB的主要内容,如果未能解决你的问题,请参考以下文章