Spring Boot中使用MongoDB数据库

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/q383965374/article/details/80367821
本章我们来学习Spring Boot中使用MongoDB数据库,有两种使用方式,一是直接使用mongotemplate,二是新建实体相关的repository接口。

引入依赖
在pom.xml中加入spring-boot-starter-data-mongodb引入对mongodb的访问支持依赖,它的实现依赖spring-data-mongodb。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

 

最终pom.xml如下:

<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>
<groupId>com.biologic</groupId>
<artifactId>23mofang-biologic</artifactId>
<version>0.0.1-SNAPSHOT</version>


<!-- 编译版本为JDK 1.8 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>

<!-- Spring Boot 核心jar包 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
</parent>
<dependencies>
<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> 
</dependencies>

<build> 
<plugins> 
<plugin> 
<groupId>org.springframework.boot</groupId> 
<artifactId>spring-boot-maven-plugin</artifactId> 
</plugin> 
</plugins> 
</build> 

</project>

 

数据源的配置
如果mongodb端口是默认端口,并且没有设置密码,可不配置,sprinboot会开启默认的。

spring.data.mongodb.uri=mongodb://localhost:27017/mydb

 

如何mongodb设置了密码,这样配置:

spring.data.mongodb.uri=mongodb://zzq:123456@localhost:27017/mydb

 

如果多个节点集群配置

#more ip cluster 
#spring.data.mongodb.uri=mongodb://user:pwd@ip1:port1,ip2:port2/database 

 

新建实体

package com.biologic.entity;

@Document(collection = "user")
public class User {

@Id
private String id;
@Field("username")
private String username;
private String password;
private String registerTime;
private String phone;
private String name;
private String sex;
private String age;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

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

public String getRegisterTime() {
return registerTime;
}

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

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 String getAge() {
return age;
}

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

}

 

方式一直接使用mongotemplate
springboot会自动注入mongotemplate,使用引用

@Autowired
MongoTemplate mongotemplate;

 

即可。如下:

package com.biologic.api;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
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.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.biologic.entity.User;

@Controller
@EnableAutoConfiguration
public class SampleController {

@Autowired
MongoTemplate mongotemplate;

@RequestMapping("/")
@ResponseBody
String home() {
Query query = new Query();
query.addCriteria(Criteria.where("name").is("酒仙"));
String name = mongotemplate.findOne(query, User.class).getName();
return name;
}

public static void main(String[] args) throws Exception {
SpringApplication.run(SampleController.class, args);
}

}

 

方式二新建实体相关的repository接口
新建定义repository接口继承mongoRepository接口

package com.biologic.api.service;

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

import com.biologic.entity.User;


@Service
public interface UserRepository extends MongoRepository<User, String> { 

public User findByName(String name);

}

 

写一个接口,继承MongoRepository,这个接口有了几本的CURD的功能。如果你想自定义一些查询,比如根据name来查询,只需要定义一个方法即可。注意firstName严格按照存入的mongodb的字段对应。在典型的Java的应用程序,写这样一个接口的方法,需要自己实现,但是在springboot中,你只需要按照格式写一个接口名和对应的参数就可以了,因为springboot已经帮你实现了。

repository接口需要在启动程序的同级目录或者子目录中,例如结构如下:


使用方式如下:

package com.biologic.api;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.biologic.api.service.UserRepository;

 

@Controller
@EnableAutoConfiguration
public class SampleController {

@Autowired
UserRepository userRepository;

@RequestMapping("/")
@ResponseBody
String home() {
String name = userRepository.findByName("酒仙").getName();
return name;
}

public static void main(String[] args) throws Exception {
SpringApplication.run(SampleController.class, args);
}

}

 

可能遇到的问题
Description:

Field userRepository in com.biologic.api.SampleController required a bean of type 'com.biologic.service.UserRepository' that could not be found.


Action:

Consider defining a bean of type 'com.biologic.service.UserRepository' in your configuration.

原因

SpringBoot项目的Bean装配默认规则是根据Application类所在的包位置从上往下扫描!
“Application类”是指SpringBoot项目入口类。这个类的位置很关键:

如果Application类所在的包为:com.biologic.api,则只会扫描com.biologic.api包及其所有子包,如果service或dao所在包不在com.biologic.api及其子包下,则不会被扫描!

根据英文的提示是在配置中找不到一个指定自动注入类型的bean,经过多方排查得出结论:
正常情况下加上@Component注解的类会自动被Spring扫描到生成Bean注册到spring容器中,既然说没找到,也就是该注解被没有被spring识别,问题的核心关键就在application类的注解SpringBootApplication上。

解决方式

至此,得出两种解决办法:
  1 .将接口与对应的实现类放在与application启动类的同一个目录或者他的子目录下,这样注解可以被扫描到,这是最省事的办法
注意这样也是扫描不到的

这样是可以的


2,如果是其他子项目引入进来的包,可以通过对Application类添加@ComponentScan(basePackages={“xxx.xxx”,”xxx.xxx”})来指定扫描的包,但是需要注意的是引入的包路径仍然需要跟application启动类的同一个目录或者他的子目录下。而且一旦指定后就不会在默认扫描Application类下的包,所以需要扫描Application类下的包需要把Application类下的包也加在路径里。在指定的application类上加上扫描路径这么一行注解,手动指定application类要扫描哪些包下的注解,如下:

@ComponentScan(basePackages = {"com.biologic.api","com.biologic.service"})

 


————————————————
版权声明:本文为CSDN博主「张小凡vip」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zzq900503/article/details/80367821

posted @ 2019-11-21 14:35  门罗的魔术师  阅读(446)  评论(0编辑  收藏  举报