手把手教springboot访问/操作mongodb(查询、插入、删除)
springboot是一种程序设计框架,其中集成了多个常用的模块用来完成许多常见的操作,比如web请求、关系型/非关系型数据库访问等,框架的使用可以简化开发工作减少业务代码,因为许多底层的代码都被封装好了,开发人员只需要调用框架中给出的接口即可。本文将介绍如何利用springboot来操作mongodb。
本文提供的程序可以实现在web端网址中传递参数来完成对mongodb的查询、插入以及删除操作。操作示例如图1和图2所示:
注意:web http请求参数以?开头并用&分隔参数。
以下基于springboot和maven来详细讲解如何用springboot框架访问和操作mongodb。
第1步:基于maven新建springboot工程
<!-- pom.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- web依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- jpa依赖(访问关系型数据库,此案例中可以不加) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- mongodb依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<!--spring-boot-starter-data-jpa依赖于spring-boot-starter-jdbc,而Spring Boot对JDBC做了一些自动配置。源码放置在org.springframework.boot.autoconfigure.jdbc下,如图-->
<!--<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>-->
<!--<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>-->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
第2步: 配置文件application.properties
# mongodb 2.4以上版本支持uri配置(此处未设置用户名密码,mongodb默认不设置用户名密码)
spring.data.mongodb.uri=mongodb://localhost:27017/test
# 设置日志文件保存路径
#logging.path=/Users/ycaha/Desktop/
logging.file=/Users/ycaha/Desktop/spring-xxx.log
# 设置日志级别
logging.level.root=debug
logging.level.org.springframework.data=DEBUG
# 默认端口8080
# server.port=
# 默认ip是localhost
# server.address=
# 设置profile
# spring.profiles.active=dev
# 设置覆写bean
# spring.main.allow-bean-definition-overriding=true
# jdbc设置
# spring.jpa.database = MYSQL
# spring.datasource.url=jdbc:mysql://localhost:3306/alex?useSSL=false
# spring.datasource.username=root
# spring.datasource.password=root
# spring.datasource.driver-class-name=com.mysql.jdbc.Driver
第3步:mongodb中新建collection并插入数据
mongodb中创建名为alex数据库,并在alex数据库下新建名为student的collection,并在student中插入以下数据:
> db.student.find({})
{ "_id" : ObjectId("5c861a495d0cb790bc47b77e"), "id" : 100001, "name" : "lee", "age" : 11 }
{ "_id" : ObjectId("5c861a555d0cb790bc47b77f"), "id" : 100002, "name" : "zhang", "age" : 12 }
{ "_id" : ObjectId("5c861a5c5d0cb790bc47b780"), "id" : 100002, "name" : "wang", "age" : 13 }
>
第4步:基于springboot框架编写java程序
基于mvc设计程序:
该程序按照spring mvc来设计,其中entity实体类定义了java类和mongodb 集合之间的映射关系,repository定义了操作mongodb底层的方法实现,service层了逻辑处理并调用了repository操作mongodb的方法,controller层则定义了和web端交互的逻辑(controller层会与service层和web层打交道,比如响应web层的请求并调用service层(service层会调用repository即DAO层)来访问数据库)。按照mvc设计可以减少程序各层之间的耦合,使得代码层次结构更加清晰,更加易于维护。
// 与mongo collection对应的Entity类
/**
* ORM对象关系映射,即java 实体类和mongodb collection的映射关系:
* 类成员变量 -> collection字段,类名 -> collection名
**/
package com.example.mongo;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
import javax.persistence.Entity;
import javax.persistence.Id;
// 注解实体类,springboot自动装载为bean
@Entity
@Document("student")
public class Student {
// 指定主键字段,注意import是javax持久化的Id而非springboot annotation的Id
// @Field("id")指定该主键名称为id,如果不添加此项注解的话,
// 程序会认为private int id对应的是mongodb studdent集合中的objectid字段(该字段是mongodb中的默认主键)
@Id
@Field("id")
private int id;
private String name;
private int age;
// 默认构造方法
public Student(){
}
// 有参构造方法
public Student(int id, String name, int age){
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
// 自定义的Repository接口
package com.example.mongo;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
// MongoRepository中已经定义了许多操作mongodb的底层方法(开发人员只需要调用封装好的接口即可
// 负责和mongodb打交道(springboot启动的时候会自动装载)
@Repository
public interface StuRepository extends MongoRepository<Student, Integer> {
}
// Service接口(解耦合)
// 主要负责业务逻辑处理
package com.example.mongo;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public interface StuService {
List<Student> getAllStus();
void addStu(Student student);
void delStu(Student student);
}
// @Service类
// service层:主要负责业务逻辑处理
import java.util.List;
@Service
public class StuServiceImpl implements StuService {
@Autowired
private StuRepository stuRepository;
@Override
public List<Student> getAllStus() {
// 调用MongoRepository操作mongodb的方法,获取student集合中的所有document
return stuRepository.findAll();
}
@Override
public void addStu(Student student) {
// 调用MongoRepository操作mongodb的方法,插入一个document
stuRepository.save(student);
}
@Override
public void delStu(Student student) {
// 调用MongoRepository操作mongodb的方法,删除一个document
stuRepository.delete(student);
}
}
// controller类
// 主要进行对页面的处理(和页面有mapping),包括跳转或者传参等等
package com.example.mongo;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.convert.CustomConversions;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.convert.DbRefResolver;
import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@Configuration
@RestController
@RequestMapping("stu-controller")
public class StuController {
// 如果不加上该方法的话,插入mongodb collection中的数据会多出“_class”字段
@Bean
public MappingMongoConverter mappingMongoConverter(MongoDbFactory factory, MongoMappingContext context, BeanFactory beanFactory) {
DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);
MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context);
try {
mappingConverter.setCustomConversions(beanFactory.getBean(CustomConversions.class));
} catch (NoSuchBeanDefinitionException ignore) {
}
// Don't save _class to mongo
mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null));
return mappingConverter;
}
@Autowired
private StuServiceImpl stuServiceImpl;
@ResponseBody // 返回xml、json内容到web端
@RequestMapping(value = "/docs") // 指定web端http请求地址和后端server响应方法的映射关系
private List<Student> getAllDocs(){
// 该方法用来获取student集合中所有document内容并以json格式返回给web端
return stuServiceImpl.getAllStus();
}
@RequestMapping("/addDoc")
private String addDoc(@RequestParam(name = "id", required = true) int id,
@RequestParam(name = "name", required = false,defaultValue = "null") String name,
@RequestParam(name = "age", required = false, defaultValue = "18") Integer age){
// 向mongodb student集合中插入一条document
stuServiceImpl.addStu(new Student(id, name, age));
return String.format(">>> record (id=%s, name=%s, age=%s) added.", id, name, age);
}
@RequestMapping("/delDoc")
private String delDoc(@RequestParam(name = "id", required = true) int id,
@RequestParam(name = "name", required = false,defaultValue = "null") String name,
@RequestParam(name = "age", required = false, defaultValue = "18") Integer age){
// 从mongodb student集合中删除一条document
Student student = new Student(id, name, age);
stuServiceImpl.delStu(student);
return String.format(">>> record (id=%s, name=%s, age=%s) deleted.", id, name, age);
}
}
// 主类
package com.example.mongo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
@SpringBootApplication(exclude=DataSourceAutoConfiguration.class)
// 需要加上exclude,因为pom.xml中添加了springboot jpa依赖,如果没有exclude的话,会报找不到datasource url的错误
//@SpringBootApplication
@EnableMongoRepositories
public class StuMain {
public static void main(String[] args){
SpringApplication.run(StuMain.class);
}
}
以上就是基于springboot框架和maven来完成对mongodb访问/操作的基本过程,不对之处敬请大神纠正!