前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot入门建站全系列(二十六)Mongodb非关系型数据库的使用

SpringBoot入门建站全系列(二十六)Mongodb非关系型数据库的使用

作者头像
品茗IT
发布2019-09-12 09:43:28
3630
发布2019-09-12 09:43:28
举报
文章被收录于专栏:品茗IT品茗IT

SpringBoot入门建站全系列(二十六)Mongodb非关系型数据库的使用

一、概述

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织

优点:

  • 1、易于维护:都是使用表结构,格式一致;
  • 2、使用方便:SQL语言通用,可用于复杂查询;
  • 3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。

缺点:

  • 1、读写性能比较差,尤其是海量数据的高效率读写;
  • 2、固定的表结构,灵活度稍欠;
  • 3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。

非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等。

优点:

  • 1、格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
  • 2、速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
  • 3、高扩展性;
  • 4、成本低:nosql数据库部署简单,基本都是开源软件。

缺点:

  • 1、不提供sql支持,学习和使用成本较高;
  • 2、无事务处理;
  • 3、数据结构相对复杂,复杂查询方面稍欠。

代码可以在SpringBoot组件化构建https://www.pomit.cn/java/spring/springboot.html中的MongoDb组件中查看,并下载。

**如果大家正在寻找一个java的学习环境,或者在开发中遇到困难,可以<a

href="https://jq.qq.com/?_wv=1027&k=52sgH1J"

target="_blank">

加入我们的java学习圈,点击即可加入

</a>

,共同学习,节约学习时间,减少很多在学习中遇到的难题。**

二、配置

本文假设你已经引入spring-boot-starter-web。已经是个SpringBoot项目了,如果不会搭建,可以打开这篇文章看一看《SpringBoot入门建站全系列(一)项目建立》

2.1 Maven依赖

使用mongodb需要引入spring-boot-starter-data-mongodb。

代码语言:javascript
复制
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2.2 配置文件

在application.properties 中需要配置mongodb的信息,如:

代码语言:javascript
复制
spring.data.mongodb.uri=mongodb://localhost:27017/pomit

我这里只有一个mongodb的配置:

  • spring.data.mongodb.uri是mongodb的地址和库名称。

三、方式一:MongoRepository操作MongoDb

我们直接新建接口,继承MongoRepository接口, 这样一切都会变的特别简单。类似于Spring-data-jpa的写法。

3.1 数据库DAO

DAO中可以按照Spring-data的常规写法自定义查询方法,也可以直接使用MongoRepository定义好的方法。

UserAddationDao:

代码语言:javascript
复制
package com.cff.springbootwork.mongodb.dao;

import org.springframework.data.mongodb.repository.MongoRepository;

import com.cff.springbootwork.mongodb.model.User;

public interface UserAddationDao extends MongoRepository<User, Long> {
	User findByName(String name);
}

注意,实体User要用@Id指明id

3.2 业务逻辑层

我们直接调用UserAddationDao来做一些增删改查。

UserAddationService:

代码语言:javascript
复制
package com.cff.springbootwork.mongodb.service;

import java.util.Date;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.cff.springbootwork.mongodb.dao.UserAddationDao;
import com.cff.springbootwork.mongodb.model.User;

/**
 * 第一种方式
 * 
 * @author fufei
 *
 */
@Service
public class UserAddationService {
	private static final Logger logger = LoggerFactory.getLogger(UserAddationService.class);
	@Autowired
	private UserAddationDao userAddationDao;

	/**
	 * 保存对象
	 *
	 * @param book
	 * @return
	 */
	public String save(User user) {
		logger.info("--------------------->[MongoDB save start]");
		user.setRegisterTime(new Date());
		userAddationDao.save(user);
		return "添加成功";
	}

	/**
	 * 查询所有
	 *
	 * @return
	 */
	public List<User> findAll() {
		logger.info("--------------------->[MongoDB find start]");
		return userAddationDao.findAll();
	}

	/***
	 * 根据id查询
	 * 
	 * @param id
	 * @return
	 */
	public User getUserById(Long id) {
		logger.info("--------------------->[MongoDB find start]");
		return userAddationDao.findById(id).orElse(null);
	}

	/**
	 * 根据名称查询
	 *
	 * @param name
	 * @return
	 */
	public User getUserByName(String name) {
		logger.info("--------------------->[MongoDB find start]");
		return userAddationDao.findByName(name);
	}

	/**
	 * 更新对象
	 *
	 * @param book
	 * @return
	 */
	public String update(User user) {
		logger.info("--------------------->[MongoDB update start]");
		userAddationDao.save(user);
		return "success";
	}

	/***
	 * 删除对象
	 * 
	 * @param book
	 * @return
	 */
	public String deleteUser(User user) {
		logger.info("--------------------->[MongoDB delete start]");
		userAddationDao.delete(user);
		return "success";
	}
}
3.3 测试

MongodbAddationRest:

代码语言:javascript
复制
package com.cff.springbootwork.mongodb.web;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.cff.springbootwork.mongodb.model.User;
import com.cff.springbootwork.mongodb.service.UserAddationService;

@RestController
@RequestMapping("/mongo2")
public class MongodbAddationRest {
	@Autowired
	UserAddationService userService;

	@PostMapping("/save")
	public String saveObj(@RequestBody User user) {
		return userService.save(user);
	}

	@GetMapping("/findAll")
	public List<User> findAll() {
		return userService.findAll();
	}

	@GetMapping("/findOne")
	public User findOne(@RequestParam Long id) {
		return userService.getUserById(id);
	}

	@GetMapping("/findOneByName")
	public User findOneByName(@RequestParam String name) {
		return userService.getUserByName(name);
	}

	@PostMapping("/update")
	public String update(@RequestBody User user) {
		User existUser = userService.getUserById(user.getId());
		if (existUser == null) {
			existUser = user;
		} else {
			if (user.getAge() != null) {
				existUser.setAge(user.getAge());
			}

			if (user.getPassword() != null) {
				existUser.setPassword(user.getPassword());
			}

			if (user.getName() != null) {
				existUser.setName(user.getName());
			}

			if (user.getPhone() != null) {
				existUser.setPhone(user.getPhone());
			}

			if (user.getRegisterTime() != null) {
				existUser.setRegisterTime(user.getRegisterTime());
			}

			if (user.getUsername() != null) {
				existUser.setUsername(user.getUsername());
			}
		}

		return userService.update(existUser);
	}

	@PostMapping("/delOne")
	public String delOne(@RequestBody User user) {
		return userService.deleteUser(user);
	}
}

四、方式二:MongoTemplate操作MongoDb

4.1 直接在业务逻辑中调用MongoTemplate

UserService:

代码语言:javascript
复制
package com.cff.springbootwork.mongodb.service;

import java.util.Date;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.Service;

import com.cff.springbootwork.mongodb.model.User;

/**
 * 第一种方式
 * @author fufei
 *
 */
@Service
public class UserService {
	private static final Logger logger = LoggerFactory.getLogger(UserService.class);
	@Autowired
	private MongoTemplate mongoTemplate;

	/**
	 * 保存对象
	 *
	 * @param book
	 * @return
	 */
	public String save(User user) {
		logger.info("--------------------->[MongoDB save start]");
		user.setRegisterTime(new Date());
		mongoTemplate.save(user);
		return "添加成功";
	}

	/**
	 * 查询所有
	 *
	 * @return
	 */
	public List<User> findAll() {
		logger.info("--------------------->[MongoDB find start]");
		return mongoTemplate.findAll(User.class);
	}

	/***
	 * 根据id查询
	 * 
	 * @param id
	 * @return
	 */
	public User getUserById(Long id) {
		logger.info("--------------------->[MongoDB find start]");
		Query query = new Query(Criteria.where("_id").is(id));
		return mongoTemplate.findOne(query, User.class);
	}

	/**
	 * 根据名称查询
	 *
	 * @param name
	 * @return
	 */
	public User getUserByName(String name) {
		logger.info("--------------------->[MongoDB find start]");
		Query query = new Query(Criteria.where("name").is(name));
		return mongoTemplate.findOne(query, User.class);
	}

	/**
	 * 更新对象
	 *
	 * @param book
	 * @return
	 */
	public String update(User user) {
		logger.info("--------------------->[MongoDB update start]");
		Query query = new Query(Criteria.where("_id").is(user.getId()));
		Update update = new Update().set("password", user.getPassword()).set("age", user.getAge()).set("phone",
				user.getPhone());
		// updateFirst 更新查询返回结果集的第一条
		mongoTemplate.updateFirst(query, update, User.class);
		return "success";
	}

	/***
	 * 删除对象
	 * 
	 * @param book
	 * @return
	 */
	public String deleteUser(User user) {
		logger.info("--------------------->[MongoDB delete start]");
		mongoTemplate.remove(user);
		return "success";
	}
}
4.2 测试

MongodbRest:

代码语言:javascript
复制
package com.cff.springbootwork.mongodb.web;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.cff.springbootwork.mongodb.model.User;
import com.cff.springbootwork.mongodb.service.UserService;

@RestController
@RequestMapping("/mongo")
public class MongodbRest {
	@Autowired
	UserService userService;

	@PostMapping("/save")
	public String saveObj(@RequestBody User user) {
		return userService.save(user);
	}

	@GetMapping("/findAll")
	public List<User> findAll() {
		return userService.findAll();
	}

	@GetMapping("/findOne")
	public User findOne(@RequestParam Long id) {
		return userService.getUserById(id);
	}

	@GetMapping("/findOneByName")
	public User findOneByName(@RequestParam String name) {
		return userService.getUserByName(name);
	}

	@PostMapping("/update")
	public String update(@RequestBody User user) {
		return userService.update(user);
	}

	@PostMapping("/delOne")
	public String delOne(@RequestBody User user) {
		return userService.deleteUser(user);
	}
}

五、过程中用到的实体

User:

代码语言:javascript
复制
package com.cff.springbootwork.mongodb.model;

import java.util.Date;

import org.springframework.data.annotation.Id;

public class User {
	@Id
	private Long id;
	private String username;
	private String password;
	private Date registerTime;
	private String phone;
	private String name;
	private String sex;
	private Integer age;

	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 String getPassword() {
		return password;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public Date getRegisterTime() {
		return registerTime;
	}

	public void setRegisterTime(Date registerTime) {
		this.registerTime = registerTime;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	public void setPassword(String password) {
		this.password = password;
	}

}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-09-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SpringBoot入门建站全系列(二十六)Mongodb非关系型数据库的使用
  • 一、概述
  • 二、配置
    • 2.1 Maven依赖
      • 2.2 配置文件
      • 三、方式一:MongoRepository操作MongoDb
        • 3.1 数据库DAO
          • 3.2 业务逻辑层
            • 3.3 测试
            • 四、方式二:MongoTemplate操作MongoDb
              • 4.1 直接在业务逻辑中调用MongoTemplate
                • 4.2 测试
                • 五、过程中用到的实体
                相关产品与服务
                对象存储
                对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档