专栏首页品茗ITSpring和Mongodb非关系型数据库整合详解

Spring和Mongodb非关系型数据库整合详解

Spring和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、数据结构相对复杂,复杂查询方面稍欠。

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

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

target="_blank">

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

</a>

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

二、环境配置

本文假设你已经引入Spring必备的一切了,已经是个Spring项目了,如果不会搭建,可以打开这篇文章看一看《Spring和Spring Mvc 5整合详解》

2.1 maven依赖

使用Mongodb需要引入spring-data-mongodb。

<?xml version="1.0"?>
<project
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
	xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>cn.pomit</groupId>
		<artifactId>SpringWork</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<artifactId>Mongodb</artifactId>
	<packaging>jar</packaging>
	<name>Mongodb</name>
	<url>http://maven.apache.org</url>
	<properties>
		<!-- redis 版本 -->
		<mongodb.version>2.1.8.RELEASE</mongodb.version>

	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-mongodb</artifactId>
			<version>${mongodb.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-api</artifactId>
		</dependency>

		<!--log4j-core -->
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-core</artifactId>
		</dependency>

		<!-- log4j-web -->
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
		</dependency>
	</dependencies>
	<build>
		<finalName>Mongodb</finalName>
	</build>
</project>

父模块可以在https://www.pomit.cn/spring/SpringWork/pom.xml获取。

2.2 Spring配置

需要配置mongodb地址登信息、mongoTemplate和mongo:repositories 。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mongo="http://www.springframework.org/schema/data/mongo"
	xsi:schemaLocation="http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context.xsd
          http://www.springframework.org/schema/data/mongo 
          http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
          http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="annotationPropertyConfigurerMongodb"
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="order" value="1" />
		<property name="ignoreUnresolvablePlaceholders" value="true" />
		<property name="locations">
			<list>
				<value>classpath:mongodb.properties</value>
			</list>
		</property>
	</bean>

	<mongo:mongo-client host="${mongodb.host}" port="${mongodb.port}">
		<mongo:client-options connections-per-host="8"
			threads-allowed-to-block-for-connection-multiplier="4"
			connect-timeout="1000" max-wait-time="1500" socket-keep-alive="true"
			socket-timeout="1500" />
	</mongo:mongo-client>

	<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
		<constructor-arg ref="mongoClient" />
		<constructor-arg name="databaseName" value="${mongodb.dbName}" />
	</bean>
	
	<mongo:repositories base-package="cn.pomit.springwork.mongodb.dao" />
</beans>

mongodb.properties中存放mongodb的地址端口信息和数据库名称。

mongodb.properties:

mongodb.host=localhost
mongodb.port=27017
mongodb.dbName=pomit

三、使用MongoRepository访问数据层

3.1 Dao数据访问

我们直接使用Spring-data-mongodb, 一切都会变的特别简单。Spring-data-mongodb支持快速查询。

UserAddationDao:

package cn.pomit.springwork.mongodb.dao;

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

import cn.pomit.springwork.mongodb.model.User;

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

这个写法和Spring-data-jpa基本上一样,应该说Spring-data系列的写法都是类同的。

**注意,User实体需要加上@Document注解指明mongodb中的collection。

3.2 业务逻辑

我们可以新建一个service来使用上面的MongoRepository。

UserAddationService :

package cn.pomit.springwork.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 cn.pomit.springwork.mongodb.dao.UserAddationDao;
import cn.pomit.springwork.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 测试Web

package cn.pomit.springwork.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 cn.pomit.springwork.mongodb.model.User;
import cn.pomit.springwork.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,我们可以不需要建dao这一层,在业务逻辑中直接使用MongoTemplate进行数据访问。

UserService :

package cn.pomit.springwork.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 cn.pomit.springwork.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 测试Web

MongodbRest :

package cn.pomit.springwork.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 cn.pomit.springwork.mongodb.model.User;
import cn.pomit.springwork.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 :

package cn.pomit.springwork.mongodb.model;

import java.util.Date;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection="user")
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;
	}

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring和WebSocket整合详解(建立Web聊天室)

    WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。

    品茗IT
  • Spring和Token整合详解

    Spring 是一个非常流行和成功的 Java 应用开发框架。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决...

    品茗IT
  • Spring和Swagger文档规范整合详解

    Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来...

    品茗IT
  • Springboot整合Shiro之认证

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明...

    用户4919348
  • Springboot整合Shiro之授权

    Shiro是我们常用的一个权限管理框架,本文的重点是来介绍下在SpringBoot环境下我们怎么来使用Shiro。

    奋斗蒙
  • SpringBoot+Shiro+Redis共享Session入门小栗子

    在单机版的Springboot+Shiro的基础上,这次实现共享Session。

    Java团长
  • SpringBoot+Shiro+Redis共享Session实例

    在单机版的Springboot+Shiro的基础上,这次实现共享Session。

    用户5224393
  • Springboot集成sqlite数据库,并使用jpa、Hibernate操作sqlite

    之前举例使用jpa、Hibernate多是以mysql为例,这次因为需要使用一个内嵌式数据库,选择了sqlite,网上多是讲一些sqlite的api封装的框架。...

    天涯泪小武
  • SpringBoot2.x配置Shiro实现权限管理,根据URL鉴权

    之前使用 Shiro 鉴权的时候,一直用的是注解,如 @RequiresPermissions() 和 @RequiresRoles(),这种方法不利于维护和动...

    奋斗蒙
  • Nginx+Zuul集群实现高可用网关

    代码参考:https://github.com/HCJ-shadow/Zuul-Gateway-Cluster-Nginx

    Noneplus

扫码关注云+社区

领取腾讯云代金券