MongoDB系列:三、springboot整合mongoDB的简单demo
在上篇 MongoDB常用操作练习 中,我们在命令提示符窗口使用简单的mongdb的方法操作数据库,实现增删改查及其他的功能。在本篇中,我们将mongodb与spring boot进行整合,也就是在java中使用mongodb。当然了,这个只是一个简单到不能再简单的demo,我只是为了练手。实际项目中应用肯定比这复杂多了。话不多说,上代码。
一、pom.xml
在这里我集成的依赖有web,test,mongodb,devtools。其中devtools是热部署,它会自动的编译代码。如果不加入这个依赖,手动编译也是可以的,我主要是嫌手动编译麻烦就这样做了。
<?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>1.5.19.BUILD-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> <groupId>com.gougou</groupId>
<artifactId>springboot-demo02-mongo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-demo02-mongo</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-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <!-- mongo -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency> <!-- 热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency> </dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> <repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</pluginRepository>
</pluginRepositories> </project>
二、application.properties
这里我是修改了tomcat的端口号,如果你的8080端口没占用,可以注释掉这段代码。
# 配置tomcat的端口号
server.port=8081 # mongo(未设置密码)
spring.data.mongodb.uri=mongodb://localhost:27017/test # mongo(设置密码)
#spring.data.mongodb.uri=mongodb://user:password@localhost:27017/mydb
三、实体类Student
这里在实体类的id属性上你可以选择性的加上“@Id”注解,由于在不加此注解时,mongodb会自动生成“_id”,而加上此注解,不但需要手动指定主键,而且插入效率远远低于不加注解的情况。所以在这里我没有使用注解。
package com.gougou.student; public class Student { private String id; private String name; private Integer age; private Boolean gender; public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public Boolean getGender() {
return gender;
} public void setGender(Boolean gender) {
this.gender = gender;
} @Override
public String toString() {
return "Student{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age=" + age +
", gender=" + gender +
'}';
} public Student(){
} public Student(String name, Integer age, Boolean gender) {
this.name = name;
this.age = age;
this.gender = gender;
} }
四、仓库StudentRepository
写一个接口,继承MongoRepository,这个接口有了基本的CURD的功能。如果你想自定义一些查询,比如根据name来查询,或者根据age来查询,只需要定义一个方法即可。注意name严格按照存入的mongodb的字段对应。在典型的Java的应用程序,写这样一个接口的方法,需要自己实现,但是在springboot中,你只需要按照格式写一个接口名和对应的参数就可以了,因为springboot已经帮你实现了。
package com.gougou.student; import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query; import java.util.List; public interface StudentRepository extends MongoRepository<Student,String> { /**
* 根据实体属性进行精确查询:find + By + 属性名(首字母大写)
*/
List<Student> findByName(String name); List<Student> findByAge(Integer age); List<Student> findByGender(Boolean gender); /**
* 根据实体属性进行模糊查询:find + By + 属性名(首字母大写) + Like
*/
List<Student> findByNameLike(String name); /**
* 根据实体属性进行模糊查询+分页:find + By + 属性名(首字母大写) + Like
*/
Page<Student> findByNameLike(String name, PageRequest pageRequest); /**
* 查询所有数据,同时指定返回的键。
*
* 不能使用仓库中自带的findAll()方法了。我们可以查询所有id不为空的数据,同时指定返回的键。
* 当我们需要根据一个key且该key不为空进行查询,方法名的定义规则为:find + By + 属性名(首字母大写) + NotNull。
*
* 指定返回的键:也就是说当我们进行带分页的模糊查询时,不想返回数据库中的所有字段,只是返回一部分字段,若想指定返回的键,我们需要在
* PersonRepository中添加方法,同时使用注解@Query。其中value是查询的条件,?0这个是占位符,对应着方法中参数中的第一个参数,如果对应的是
* 第二个参数则为?1。fields是我们指定的返回字段,其中id是自动返回的,不用我们指定
*/
@Query(value = "{'_id':{'$ne':null}}",fields = "{'name':1}")
Page<Student> findByIdNotNull(Pageable pageable); }
五、service实现类StudentServiceImpl
package com.gougou.student; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service; import java.util.List; @Service
public class StudentServiceImpl implements StudentService { @Autowired
private StudentRepository studentRepository; /**
* @function 插入单条数据
* @param student
*/
@Override
public void insert(Student student) {
studentRepository.insert(student);
} /**
* @function 批量插入数据
*/
@Override
public void insertByList(List<Student> studentList) {
studentRepository.insert(studentList);
} /**
* @function 无条件计数
* @return
*/
@Override
public int count() {
return (int)studentRepository.count();
} /**
* @function 无条件查询所有的数据
* @return
*/
@Override
public List<Student> queryAll() {
return studentRepository.findAll();
} /**
* @function 无条件查询分页
* @return
*/
@Override
public Page<Student> queryByPage(int page, int rows) {
PageRequest pageRequest = new PageRequest(page,rows);
return studentRepository.findAll(pageRequest);
} /**
* 根据实体属性进行精确查询
*/
@Override
public List<Student> queryByName(String name) {
return studentRepository.findByName(name);
} @Override
public List<Student> queryByAge(Integer age) {
return studentRepository.findByAge(age);
} @Override
public List<Student> queryByGender(Boolean gender) {
return studentRepository.findByGender(gender);
} /**
* 根据实体属性进行模糊查询
*/
@Override
public List<Student> queryByNameLike(String name) {
return studentRepository.findByNameLike(name);
} /**
* 根据实体属性进行模糊查询并分页
* @return
*/
@Override
public Page<Student> queryByNameLikeAndPage(int page,int rows,String name) {
PageRequest pageRequest = new PageRequest(page,rows);
return studentRepository.findByNameLike(name,pageRequest);
} }
六、servie接口StudentService
package com.gougou.student; import org.springframework.data.domain.Page; import java.util.List; public interface StudentService { /**
* @function 插入单条数据
* @param student
*/
void insert(Student student); /**
* @function 批量插入数据
*/
void insertByList(List<Student> studentList); /**
* @function 无条件计数
* @return
*/
int count(); /**
* @function 无条件查询所有的数据
* @return
*/
List<Student> queryAll(); /**
* @function 无条件查询分页
* @return
*/
Page<Student> queryByPage(int page,int rows); /**
* 根据实体属性进行精确查询
*/
List<Student> queryByName(String name);
List<Student> queryByAge(Integer age);
List<Student> queryByGender(Boolean gender); /**
* 根据实体属性进行模糊查询
*/
List<Student> queryByNameLike(String name); /**
* 根据实体属性进行【模糊+分页】查询
*/
Page<Student> queryByNameLikeAndPage(int page,int rows,String name); }
七、StudentController
package com.gougou.student; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList;
import java.util.List; @RestController
@RequestMapping(value = "student")
public class StudentController { @Autowired
private StudentService studentService; /**
* 插入一条数据
* @return
*/
@RequestMapping(value = "insert")
public int insert(){
Student student = new Student("张三",25,true);
studentService.insert(student);
return 1;
} /**
* 插入一条数据
* @return
*/
@RequestMapping(value = "insertByList")
public int insertByList(){
List<Student> students = new ArrayList<>(10); Student student = null;
for (int i = 0;i<10;i++){
student = new Student("李斯"+i,i+15,i%2==0?true:false);
students.add(student);
}
studentService.insertByList(students);
return 1;
} /**
* 无条件的数据统计
*/
@RequestMapping(value="count")
public int count(){
return studentService.count();
} /**
* @function 无条件查询所有的数据
* @return
*/
@RequestMapping(value="queryAll")
public List<Student> queryAll(){
return studentService.queryAll();
} /**
* @function 无条件查询分页
* @return
*/
@RequestMapping(value="queryByPage")
public Page<Student> queryByPage(Integer page, Integer rows){
if(page == null || page <0){
page = 0;
}
if(rows == null || rows < 0){
rows = 5;
}
return studentService.queryByPage(page,rows);
} /**
* 根据实体属性进行精确查询
*/
@RequestMapping(value = "queryByName")
public List<Student> queryByName(String name){
return studentService.queryByName(name);
} @RequestMapping(value = "queryByAge")
public List<Student> queryByAge(Integer age){
return studentService.queryByAge(age);
} @RequestMapping(value = "queryByGender")
public List<Student> queryByGender(Boolean gender){
return studentService.queryByGender(gender);
} /**
* 根据实体属性进行模糊查询
*/
@RequestMapping(value = "queryByNameLike")
public List<Student> queryByNameLike(String name){
return studentService.queryByNameLike(name);
} /**
* 模糊查询加分页
*/
@RequestMapping(value = "queryByNameLikeAndPage")
public Page<Student> queryByNameLikeAndPage(Integer page,Integer rows,String name){
if(page == null || page <0){
page = 0;
}
if(rows == null || rows < 0){
rows = 5;
}
return studentService.queryByNameLikeAndPage(page,rows,name);
} }
MongoDB系列:三、springboot整合mongoDB的简单demo的更多相关文章
- Springboot整合MongoDB的Docker开发,其它应用也类似
1 前言 Docker是容器开发的事实标准,而Springboot是Java微服务常用框架,二者必然是会走到一起的.本文将讲解如何开发Springboot项目,把它做成Docker镜像,并运行起来. ...
- Springboot 整合 MongoDB
Springboot 整合 MongoDB 这节我们将整合 Spring Boot 与 Mongo DB 实现增删改查的功能,并且实现序列递增. Mongo DB 的基本介绍和增删改查的用法可以参考我 ...
- SpringBoot 整合 MongoDB 实战介绍
一.介绍 在前面的文章中,我们详细的介绍了 MongoDB 的配置和使用,如果你对 MongoDB 还不是很了解,也没关系,在 MongoDB 中有三个比较重要的名词:数据库.集合.文档! 数据库(D ...
- java操作mongodb & springboot整合mongodb
简单的研究原生API操作MongoDB以及封装的工具类操作,最后也会研究整合spring之后作为dao层的完整的操作. 1.原生的API操作 pom.xml <!-- https://mvnre ...
- SpringBoot整合mongoDB
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 这一片文章介绍一个springboot整合mongodb,如果你了解整合mysql之类的 ...
- 8、SpringBoot整合之SpringBoot整合MongoDB
SpringBoot整合MongoDB 一.创建项目,选择依赖 仅选择Spring Web.Spring Data MongoDB即可 二.引入相关依赖(非必要) 这里只是为了实体类的创建方便而引入l ...
- SpringBoot 整合mongoDB并自定义连接池
SpringBoot 整合mongoDB并自定义连接池 得力于SpringBoot的特性,整合mongoDB是很容易的,我们整合mongoDB的目的就是想用它给我们提供的mongoTemplate,它 ...
- springBoot整合MyBatise及简单应用
springBoot整合MyBatise及简单应用 我采用的是 工具IDEA 框架是springBoot+maven+Mybatise 第一步: pom.xml 引入相关jar包 <?xml v ...
- 从无到有Springboot整合Spring-data-jpa实现简单应用
本文介绍Springboot整合Spring-data-jpa实现简单应用 Spring-data-jpa是什么?这不由得我们思考一番,其实通俗来说Spring-data-jpa默认使用hiberna ...
- Springboot整合ElasticSearch进行简单的测试及用Kibana进行查看
一.前言 搜索引擎还是在电商项目.百度.还有技术博客中广泛应用,使用最多的还是ElasticSearch,Solr在大数据量下检索性能不如ElasticSearch.今天和大家一起搭建一下,小编是看完 ...
随机推荐
- javaScript设计模式--观察者模式(observer)
观察者模式(observer):又被称为 发布-订阅者模式或者消息机制,定义了一种依赖关系,解决了主体对象与观察者之间功能耦合. 一.这样的需求 在实现自己的需求,而添加一些功能代码,但是又不想新添加 ...
- 三分钟学会.NET微服务之Polly
熔断降级是一个非常重要的概念,我们先说一下什么是熔断降级,咱们都知道服务发现,一个有问题的服务器没来得急注销过一会就崩溃掉了,那么我们的请求就有可能访问一个已经崩溃的服务器,那么就会请求失败,因为已经 ...
- 《白帽子讲Web安全》- 学习笔记
一.为何要了解Web安全 最近加入新公司后,公司的官网突然被Google标记为了不安全的诈骗网站,一时间我们信息技术部门成为了众矢之的,虽然老官网并不是我们开发的(因为开发老官网的前辈们全都跑路了). ...
- 从零开始学习PYTHON3讲义(十二)画一颗心送给你
(内容需要,本讲使用了大量在线公式,如果因为转帖网站不支持公式无法显示的情况,欢迎访问原始博客.) <从零开始PYTHON3>第十二讲 上一节课我们主要讲解了数值计算和符号计算.数值计算的 ...
- 【Android Studio安装部署系列】二十五、Android studio使用NDK生成so文件和arr文件
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 Android Studio使用ndk的简单步骤. NDK环境搭建 下载NDK 下载链接:https://developer.and ...
- 利用Bootstrap Paginator插件和KnockoutJS完成分页功能
在最近一个项目中,需要结合一堆条件查询并对查询的结果数据完成一个简单分页功能,可是做着做着,自己的思路越来越模糊,做到心态崩溃!!! 哈哈,特此花点时间重新总结,并从最简单的分页,然后向多条件查询分页 ...
- JDK源码分析(11)之 BlockingQueue 相关
本文将主要结合源码对 JDK 中的阻塞队列进行分析,并比较其各自的特点: 一.BlockingQueue 概述 说到阻塞队列想到的第一个应用场景可能就是生产者消费者模式了,如图所示: 根据上图所示,明 ...
- jquery快速入门(三)
捕获内容和属性 1.DOM 操作 获得内容 - text().html() 以及 val() text() - 设置或返回所选元素的文本内容,如果不带值则是返回值,如果带值则是修改值,如:$('p') ...
- 原子操作&普通锁&读写锁
一:原子操作CAS(compare-and-swap) 原子操作分三步:读取addr的值,和old进行比较,如果相等,则将new赋值给*addr,他能保证这三步一起执行完成,叫原子操作也就是说它不能再 ...
- Ajax全局处理错误
背景:项目前端ajax请求很多都没有写error方法,所以用户体验很不好 新来的前端负责人发现这个问题,写了一个错误处理方法,如下 //统一处理Ajax错误方法 function onAjaxErro ...