SpringBoot+MongoDB+Thymeleaf简单增删改案例

1. 准备

JDK 1.8、IDEA2018.3.5、MongoDB 版本4.0.6、以及基本的springboot构建项目知识、thymeleaf相关知识,不了解的可以参考我之前的文章:

thymeleaf入门

2. MongnDB简单介绍

MongoDB是基于文档的存储的(而非表),是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。模式自由(schema-free),意味着对于存储在MongoDB数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

Mongo主要解决的是海量数据的访问效率问题。因为Mongo主要是支持海量数据存储的,所以Mongo还自带了一个出色的分布式文件系统GridFS,可以支持海量的数据存储。由于Mongo可以支持复杂的数据结构,而且带有强大的数据查询功能,因此非常受到欢迎。

2.1 主要特点

  1. MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。
  2. 你可以在MongoDB记录中设置任何属性的索引 (如:FirstName=“Sameer”,Address=“8 Gandhi Road”)来实现更快的排序。
  3. 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
  4. 如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
  5. Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
  6. MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
  7. Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
  8. Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
  9. Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
  10. GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
  11. MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
  12. MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
  13. 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 视图页面

  1. 新建一个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>
  1. 新建一个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>
  1. 新建一个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 运行测试

  1. 添加如下数据
    在这里插入图片描述
    查看数据库:
    在这里插入图片描述
    有数据,添加成功!

  2. 查询
    在这里插入图片描述

可以看到我添加进去的数据已经成功从数据库查询出来

其他功能请大家自行测试,有问题欢迎留言我们一起探讨。

本文源码已上传githug,需要的自行下载:点我前往下载源码

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值