1. 准备
JDK 1.8、IDEA2018.3.5、MongoDB 版本4.0.6、以及基本的springboot构建项目知识、thymeleaf相关知识,不了解的可以参考我之前的文章:
2. MongnDB简单介绍
MongoDB是基于文档的存储的(而非表),是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。模式自由(schema-free),意味着对于存储在MongoDB数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
Mongo主要解决的是海量数据的访问效率问题。因为Mongo主要是支持海量数据存储的,所以Mongo还自带了一个出色的分布式文件系统GridFS,可以支持海量的数据存储。由于Mongo可以支持复杂的数据结构,而且带有强大的数据查询功能,因此非常受到欢迎。
2.1 主要特点
- MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。
- 你可以在MongoDB记录中设置任何属性的索引 (如:FirstName=“Sameer”,Address=“8 Gandhi Road”)来实现更快的排序。
- 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
- 如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
- Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
- MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
- Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
- Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
- Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
- GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
- MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
- MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
- MongoDB安装简单。
3. 安装
安装包官方下载地址:点击前往下载
具体的安装过程这里就不一一介绍了,可以参考一下其他文章:Windows下安装MongoDB
4. 案例
先放出整个工程的目录
下面我们一步步来
新建一个工程,模板选上web,模板引擎用thymeleaf
4.1 修改pom.xml文件
添加相关依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--添加MongonDB的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
</dependencies>
4.2 修改application.properties文件
#MongoDB的配置
spring.data.mongodb.uri=mongodb://localhost:27017/user
# 如果mongodb设置了密码,这样配置 spring.data.mongodb.uri=mongodb://username:123456@localhost:27017/user
#多节点配置
# more ip cluster
##spring.data.mongodb.uri=mongodb://user:pwd@ip1:port1,ip2:port2/database
#thymeleaf 配置
spring.thymeleaf.mode=HTML5
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.servlet.content-type=text/html
#缓存设置为false, 这样修改之后马上生效,便于调试
spring.thymeleaf.cache=false
#上下文,可以不需要,如果加上则要在浏览器url加上/thymeleaf
#server.servlet.context-path=/thymeleaf
4.3 新建实体类
新建一个pojo包,用于存放实体类
在包下新建一个User类
package com.eknaij.springbootmongodb.pojo;
public class User {
int userId;
String name;
public String getName() {
return name;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "user:[userId:"+userId+"---name:"+name+"]";
}
}
4.3 Dao层
新建一个dao包,用于存放相关的dao接口
新建一个UserDao接口
package com.eknaij.springbootmongodb.dao;
import com.eknaij.springbootmongodb.pojo.User;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface UserDao extends MongoRepository<User, Integer> {
public User getByUserId(int id);
public User getByUserIdLike(int id);
}
MongoRepository是MongoDB自带的一个仓库,满足基本的增删查改操作,可以直接使用,<User, Integer>表示实体类和主键,如果自带的函数不满足需求,可以在接口编写新的方法。这里新加两个方法,根据ID查找user,一个精确查找,一个模糊查找。
4.4 service层
新建一个service包,用于存放service层的相关类
新建一个UserService
package com.eknaij.springbootmongodb.service;
import com.eknaij.springbootmongodb.pojo.User;
import java.util.List;
public interface UserService {
public User getByUserid(int id);
public User getByUseridLike(int id);
public void saveUser(User user);
public void removeUserByUserid(int id);
public void updateUser(User user);
public List<User> getAllUser();
public User findOne(int id);
}
4.5 service的实现类
新建一个用于存放service的实现类的Impl包
新建service的实现类,实现了UserService的接口
package com.eknaij.springbootmongodb.serviceImpl;
import com.eknaij.springbootmongodb.dao.UserDao;
import com.eknaij.springbootmongodb.pojo.User;
import com.eknaij.springbootmongodb.service.UserService;
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.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
@Resource
private MongoTemplate mongoTemplate;
@Resource
private UserDao userDao;
@Override
public User getByUserid(int id) {
return userDao.getByUserId(id);
}
@Override
public User getByUseridLike(int id) {
return userDao.getByUserIdLike(id);
}
@Override
public void saveUser(User user) {
userDao.save(user);
}
@Override
public void removeUserByUserid(int id) {
Query q=new Query(new Criteria("userId").is(id));
mongoTemplate.remove(q,User.class);
}
@Override
public void updateUser(User user) {
Query q=new Query(new Criteria("userId").is(user.getUserId()));
Update update=new Update();
update.set("userId", user.getUserId());
update.set("name", user.getName());
mongoTemplate.updateMulti(q, update,User.class);
}
@Override
public List<User> getAllUser() {
return userDao.findAll();
}
@Override
public User findOne(int id) {
Query q=new Query(new Criteria("userId").is(id));
return mongoTemplate.findOne(q,User.class);
}
}
4.6 controller层
新建一个controller包,用来存放controller类
新建一个UserController类
package com.eknaij.springbootmongodb.controller;
import com.eknaij.springbootmongodb.pojo.User;
import com.eknaij.springbootmongodb.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Controller
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/add")
public String addUser() {
return "add";
}
/**
* 添加一条数据
* @param user
* @return
*/
//@RequestMapping("/saveUser")
@PostMapping("/user")//restful风格
public String saveUser(User user) {
System.out.println("添加的数据是:"+user);
userService.saveUser(user);
return "redirect:/getAll";
}
/**
* 查询所有数据
* @param model
* @return
*/
@RequestMapping("/getAll")
public String findallUser(Model model){
List ls= userService.getAllUser();
model.addAttribute("users",ls);
return "show";
}
/**
* 根据id查找一条数据
* @return
*/
// @RequestMapping("/findOne")
@GetMapping("/user/{id}")
public String findOne(@PathVariable("id") int id, Model model){
User user = userService.findOne(id);
System.out.println("查询到的数据是:"+user);
model.addAttribute("user",user);
return "edit";
}
/**
* 根据id删除一条数据
* @param id
* @return
*/
@RequestMapping("/removeUserById")
public String removeUserById(int id) {
System.out.println("需要删除的编号是:"+id);
userService.removeUserByUserid(id);
return "redirect:/getAll";
}
/**
* 修改数据
* @return
*/
// @RequestMapping("/updateUser")
@PutMapping("/user/{id}")
public String updateUser(User user) {
userService.updateUser(user);
return "redirect:/getAll";
}
}
4.7 视图页面
- 新建一个add.html用于添加数据
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>添加数据</title>
</head>
<body>
<form action="user" method="post">
userId: <input name="userId" /> <br/>
name: <input name="name"/> <br/>
<button type="submit">添加</button>
</form>
</body>
</html>
- 新建一个show.html用于查询所有数据
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>查询所有数据</title>
</head>
<body>
<table align='center' border='1' cellspacing='0'>
<tr>
<td>序号</td>
<td>id</td>
<td>name</td>
<td>编辑</td>
<td>删除</td>
</tr>
<tr th:each="u,status:${users}">
<td th:text="${status.count}"></td>
<td th:text="${u.userId}">1</td>
<td th:text="${u.name}">name</td>
<td><a th:href="@{/user/}+${u.userId}">编辑</a></td>
<td><a th:href="@{/removeUserById(id=${u.userId})}">删除</a></td>
</tr>
</table>
</body>
</html>
- 新建一个edit.html用于修改数据
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>修改信息</title>
</head>
<body>
<div style="margin:0px auto; width:500px">
<form action="/user/${user.userId}" method="post">
<input type="hidden" name="_method" th:value="PUT">
userId: <input name="userId" th:value="${user.userId}"/><br/>
name: <input name="name" th:value="${user.name}"/> <br/>
<button type="submit">提交</button>
</form>
</div>
</body>
</html>
5 运行测试
-
添加如下数据
查看数据库:
有数据,添加成功! -
查询
可以看到我添加进去的数据已经成功从数据库查询出来
其他功能请大家自行测试,有问题欢迎留言我们一起探讨。
本文源码已上传githug,需要的自行下载:点我前往下载源码