Artikelverzeichnis
Für die grundlegende Grammatik von MongoDB klicken Sie bitte auf: Grundlegende Grammatik von MongoDB
Wenn Sie SpringBootMongoDB direkt verwenden, um MongoDB zu betreiben, können Sie keine MongoDB-Datenbank direkt erstellen. Sehr angenehm.
1. Vorbereitung
0.Docker installiert MongoDB
# 拉取镜像
docker pull mongo:3.6
# 查看镜像
docker images
# 创建容器
docker run --name mongo -v ~/docker/mongo:/data/db -p 27017:27017 -d mongo:3.6
# 查看容器
docker ps
# 进入容器
docker exec -it mongo /bin/bash
1.pom Abhängigkeit
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2.yml Konfigurationsdatei
spring:
data:
mongodb:
host: 116.62.13.104
database: spitdb
3. Die Hauptstartklasse
Da die MySQL-Datenbank nicht verwendet wird, ist die Datenquellenkonfiguration ausgeschlossen
@EnableEurekaClient
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class SpitApplication {
public static void main(String[] args) {
SpringApplication.run(SpitApplication.class);
}
@Bean
public IdWorker getIdWorkder() {
return new IdWorker(1,1);
}
}
Der Startfehler ist darauf zurückzuführen, dass keine Informationen zur Konfigurationsdatenquelle vorhanden sind.
Zwei, der Code
Entitätsklasse
/**
* 不使用JPA 所有不需要设置@Entity和@Table
*/
@Data
public class Spit implements Serializable {
@Id
private String _id;
private String content;
private Date publishtime;
private String userid;
private String nickname;
private Integer visits;
private Integer thumbup;
private Integer share;
private Integer comment;
private String state;
private String parentid;
}
Verwenden Sie MongoRepository, um MongoDB zu betreiben
Erstellen Sie eine Schnittstelle, um ein MongoRepository zu erben. Sie können die Standardoperation zum Hinzufügen, Löschen, Ändern und Überprüfen verwenden
package com.lsh.repository;
import com.lsh.model.Spit;
import org.springframework.data.mongodb.repository.MongoRepository;
/**
* @author :LiuShihao
* @date :Created in 2020/10/29 2:57 下午
* @desc :类似于JPA的操作一样,创建接口继承一个MongoRepository,就可以使用默认的增删改查的操作
*/
public interface SpitRepository extends MongoRepository<Spit, String> {
}
Bedienung
package com.lsh.service;
import com.lsh.model.Spit;
import java.util.List;
/**
* @author :LiuShihao
* @date :Created in 2020/10/29 2:53 下午
* @desc :
*/
public interface SpitService {
/**
* 查询全部数据
* @return
*/
List<Spit> findAll();
/**
* 根据id查询
* @return
*/
Spit findById(String id);
/**
* 添加数据
* @return
*/
void save(Spit spit);
/**
* 更新数据
* @return
*/
void update(Spit spit);
/**
* 删除数据
* @return
*/
void deleteById(String id);
}
ServiceImpl
package com.lsh.service.impl;
import com.lsh.model.Spit;
import com.lsh.repository.SpitRepository;
import com.lsh.service.SpitService;
import com.lsh.util.IdWorker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* @author :LiuShihao
* @date :Created in 2020/10/29 2:59 下午
* @desc :
*/
@Service
@Transactional
public class SpitServiceImpl implements SpitService {
@Autowired
SpitRepository repository;
@Autowired
IdWorker idWorker;
@Override
public List<Spit> findAll() {
return repository.findAll();
}
@Override
public Spit findById(String id) {
return repository.findById(id).get();
}
@Override
public void save(Spit spit) {
repository.save(spit);
}
@Override
public void update(Spit spit) {
repository.save(spit);
}
@Override
public void deleteById(String id) {
repository.deleteById(id);
}
}
Regler
package com.lsh.controller;
import com.lsh.model.Spit;
import com.lsh.service.SpitService;
import com.lsh.util.ResultObject;
import com.lsh.util.StatusCode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* @author :LiuShihao
* @date :Created in 2020/10/29 2:53 下午
* @desc :
*/
@RestController
@CrossOrigin
@RequestMapping("/spit")
public class SpitController {
@Autowired
SpitService spitService;
@GetMapping
public ResultObject findAll(){
return new ResultObject(true, StatusCode.OK, "查询成功", spitService.findAll());
}
@GetMapping(value = "/{spitId}")
public ResultObject findById(@PathVariable String spitId){
return new ResultObject(true, StatusCode.OK, "查询成功", spitService.findById(spitId));
}
@PostMapping
public ResultObject save(@RequestBody Spit spit){
spitService.save(spit);
return new ResultObject(true, StatusCode.OK, "保存成功");
}
@PutMapping(value = "/{spitId}")
public ResultObject update(@PathVariable String spitId, @RequestBody Spit spit){
spit.set_id(spitId);
spitService.update(spit);
return new ResultObject(true, StatusCode.OK, "修改成功");
}
@DeleteMapping(value = "/{spitId}")
public ResultObject delete(@PathVariable String spitId){
spitService.deleteById(spitId);
return new ResultObject(true, StatusCode.OK, "删除成功");
}
}
Verwenden Sie MongoTemplate, um MongoDB zu betreiben
@Autowired
private MongoTemplate mongoTemplate;
public void thumbup(String spitId) {
//方式一:效率有问题
//Spit spit = spitDao.findById(spitId).get();
//spit.setThumbup((spit.getThumbup()==null ? 0 : spit.getThumbup()) + 1);
//spitDao.save(spit);
//方式二:使用原生mongo命令来实现自增 db.spit.update({"_id":"1"},{$inc:{thumbup:NumberInt(1)}})
Query query = new Query();
query.addCriteria(Criteria.where("_id").is(spitId));
Update update = new Update();
update.inc("visist", 1);
mongoTemplate.updateFirst(query,update,"spit");
}
Drei, BUG
Bug1 Mongo kann keine Remoteverbindung herstellen
Verbindung zu MongoDB konnte nicht hergestellt werden
Grund:
Der Mongodb im Spiegel ändert die Remoteverbindung nicht und kann nur innerhalb der virtuellen Maschine aufgerufen werden!
Lösung:
#进入mongo容器内部
docker exec -it mongodb /bin/bash
#输入mongo进入mongo数据库
mongo
# 进入 admin 的数据库
use admin
# 创建管理员用户
db.createUser(
{
user: "admin",
pwd: "123456",
roles: [ {
role: "userAdminAnyDatabase", db: "admin" } ]
}
)
# 创建有可读写权限的用户. 对于一个特定的数据库, 比如'demo'
db.createUser({
user: 'spit',
pwd: '123456',
roles: [{
role: "read", db: "spitdb"}]
})
# 远程连接的开启
# 在容器内部当中
#更新源
apt-get update
# 安装 vim
apt-get install vim
# 修改 mongo 配置文件
vim /etc/mongod.conf.orig
将其中的
bindIp: 127.0.0.1
注释掉# bindIp: 127.0.0.1
或者改成bindIp: 0.0.0.0
即可开启远程连接
Bug2 Update im Dokcer-Container kann nicht passend abgerufen werden
Kopieren Sie die Dateien im Container auf den Host, ändern Sie sie auf dem Host und laden Sie sie an den ursprünglichen Speicherort im Docker-Container hoch.
Stoppen Sie zuerst den Container, andernfalls kann cp fehlschlagen und die Datei wird möglicherweise verwendet
docker cp mongo:/etc/mongod.conf.orig /data/
将其中的
bindIp: 127.0.0.1
注释掉# bindIp: 127.0.0.1
或者改成bindIp: 0.0.0.0
即可开启远程连接
docker cp /data/mongod.conf.orig mongo:/etc/mongod.conf.orig
Starten Sie den Container neu und stellen Sie fest, dass die Datei erfolgreich geändert wurde
Der Alibaba Cloud-Server muss daran denken, externe Ports zu öffnen
Besuchen Sie ip + 27017 im Suchbereich, um diesen Satz zu sehen. Dies bedeutet, dass die Installation erfolgreich ist. Remoteverbindung herstellen
Wenn Sie keine Remoteverbindung herstellen können, starten Sie den Docker-Dienst neu.
Bug3-Abfrage ist nicht zertifiziert
Der Grund ist: Die
Spring-Boot-Starter-Sicherheitsabhängigkeit wird der POM-Datei hinzugefügt.
Entfernen Sie einfach diese Abhängigkeit.
Suche erfolgreich