SpringBoot整合mongodb,从安装到使用

SpringBoot整合mongodb,从安装到使用,第1张

一、首先使用docker安装mongodb

1.创建挂载目录: 

docker volume create mongo_data_db;
docker volume create mongo_data_configdb;

2,拉取镜像

docker pull mongo:4.0.3

 3.创建容器

docker create --name mongodb -p 27017:27017 -v /data/mongodb:/data/db mongo:4.0.3

启动容器

docker start mongodb

进入容器

docker exec -it mongodb /bin/bash

 

然后再输入mongo命令,进入mongodb客户端

输入exit退出客户端; 

 使用docker ps查看容器进程 

4.或者使用下边的命令方式直接进入容器及mongodb客户端,初始化admin库的管理员账号

# docker exec -it <容器名>  <数据库名>

docker exec -it mongodb mongo admin 

   创建最高权限用户

db.createUser({ user: 'admin', pwd: 'adminpwd', roles: [ { role: "root", db: "admin" } ] });

 

    user:用户名admin

  • pwd:密码adminpwd
  • role:角色root
  • db:授权使用admin库

 exit退出mongodb命令行及docker容器;

创建好了最高权限用户之后(这个容器进入mongodb不需要验证)

接下来创建一个需要验证的mongodb的docker容器,

第二种,创建需要用户名和密码验证的mongodb镜像

首先停止之前创建的镜像容器,并删除该镜像容器

接下来创建一个新的mongodb镜像容器,带验证

docker run --name mymongo -p 27017:27017 -v /mongo/data:/data/db -d mongo:4.0.3 --auth

 然后进入容器:

docker exec -it mymongo mongo admin

初始化admin系统库管理员用户

db.createUser({ user: 'admin', pwd: 'adminpwd', roles: [ { role: "root", db: "admin" } ] });

 

# 权限认证
# 返回 1 证明成功, 返回 0 证明失败
  db.auth("admin","adminpwd"); 

# 权限说明
  1.数据库用户角色:read、readWrite;
  2.数据库管理角色:dbAdmin、dbOwner、userAdmin;
  3.集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
  4.备份恢复角色:backup、restore
  5.所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
  6.超级用户角色:root

然后创建一个可用账号,并删除

 db.createUser({ user: 'testadmin', pwd: 'testadmin123', roles: [ { role: "root", db: "admin" } ] });

 

防火墙开启27017端口,阿里云服务器,需要到阿里云管理页面添加27017端口的对外开放规则

firewall-cmd --zone=public --add-port=27017/tcp --permanent
firewall-cmd --reload
firewall-cmd --query-port=27017/tcp

然后navicat premium中连接查看

因为第二种启动时候开启了验证,并且创建了验证账号,所以navicat连接时候是需要认证的,再验证那里选择password认证方式

用户名输入刚才创建的 admin ,密码是 adminpwd,然后测试连接,会提示连接成功,如果验证方式选择none,则会提示认证失败

 

如果是最开始创建的那种方式,启动没有加--auth选项的,则验证选择none,可以直接连接成功的 

 navicat premium中连接mongodb,默认情况下不显示mongodb的系统库(有三个,admin,local和config),只显示了我自己创建的一个visit的数据库,这时候需要在navicat的查看菜单中,勾选上显示隐藏项目

 

二,整合spring data mongodb *** 作数据

1.集成spring data mongodb,在项目Pom文件中引入依赖


    org.springframework.boot
    spring-boot-starter-data-mongodb

2.application.yml配置连接

org.springframework.boot.autoconfigure.mongo.MongoProperties 负责加载MonoDB配置

27017是MongoDB默认的端口,test是内置的数据库。如果MongoDB使用了--auth选项启动,则需要使用用户登录,则使用如下方式链接

spring:
  data:
    mongodb:
      uri: mongodb://test:123456@192.168.161.3:27017/testdb

上边是单机配置,如果是集群参考

    单机模式:mongodb://name:pwd@ip:port/database
    集群模式:mongodb://name:pwd@ip1:port1,ip2:port2/database

在项目入口启动类上面加一个注解@EnableMongoAuditing。开启Mongodb审计功能.

 接下来就可以写crud了

首先创建实体类

@Document(collection="article")//集合名
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Article  implements Serializable {

     private static final long serialVersionUID = 1L;

    @Id
    private String id;

    @Indexed
    private String author;
    private String title;
    @Field("msgContent")
    private String content;

    @CreatedDate
    private Date createTime;
    private List reader;


}

这里注意:

  1. 一定要实现Serializable 接口,否则在序列化的时候会报错。
  2. @Document(collection=“article”) 表示: *** 作的集合为:article
  3. 另外,针对@CreatedDate注解,也和jpa用法一样,创建时会自动赋值,需要在启动类中添加@EnableMongoAuditing注解使其生效!
  4. 可使用@Field注解,可指定存储的键值名称,默认就是类字段名。如设置@Field("msgContent")
  5. @Id主键,不可重复,自带索引,可以在定义的列名上标注,需要自己生成并维护不重复的约束。如果自己不设置@Id主键,mongo会自动生成一个唯一主键,并且插入时效率远高于自己设置主键。
  6. @Indexed声明该字段需要加索引,加索引后以该字段为条件检索将大大提高速度。
    唯一索引的话是@Indexed(unique = true)。

Dao接口可以按照自己需要集成Repository,CrudRepository,PagingAndSortingRepository,或者继承功能最全的 MongoRepository均可,如下

public interface ArticleDao extends MongoRepository {
        //支持关键字查询,和JPA的用法一样
        Article findByAuthor(String author);

       Page findAll(Pageable pageable);
}

在Controller里,可以自动注册ArticleDao

@Autowired
private Articledao;

@GetMapping("/all")
public List page(int page,int size){
  Pageable pageable = PageRequest.of(page,size);
  Page result =  dao.findAll(pageable);
  return result.getContent();
}

@GetMapping("/queryOne")
public Article queryDetail(String id){
  Optional optional = dao.findById(id);
  return optional.get();
}

今年五一,拿个博客五一勋章 

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/874496.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-13
下一篇2022-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存