springboot整合MongoDB,使用mongoTemplate操作mongo数据库

本文介绍了MongoDB的关系型与非关系型特点,包括用户、数据库、集合和文档的概念,以及如何在Docker中安装MongoDB并进行基本操作,如创建用户、角色和数据管理。还提到了SpringBoot集成MongoDB的配置和使用MongoTemplate进行数据操作的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.mongo的介绍

数据库,有关系型数据库和非关系型数据库。

        关系型数据库(RDBMS)是指采用了关系模型来组织数据的数据库系统。在关系型数据库中,数据以表(table)的形式存储,每个表包含若干行(row)和列(column),并且表与表之间可以通过外键等方式建立关联。最常见的关系型数据库包括 MySQL、PostgreSQL、Oracle、SQL Server 等。

        相对应的,非关系型数据库(NoSQL)是指一类不同于传统关系型数据库的数据库管理系统。非关系型数据库不采用传统的表格形式存储数据,而是使用文档、键值对、列族或图等方式组织数据。非关系型数据库通常具有分布式、高可用、横向扩展等特点,适合处理大规模数据和需要高性能的场景。常见的非关系型数据库包括 MongoDB、Cassandra、Redis、Elasticsearch 等。

        所以,我们得了解mongo的几个基本的概念(从大到小):用户(user)-->数据库(db)-->
集合(collection)-->文档;

        用户不用多说,我们登录admin数据库,然后才可以创建用户,赋予对应的权限。

        切换为对应用户之后,就可以创建自己的数据库了。请注意,在操作mongo的时候,数据库存在,就会切换到对应的数据库;如果不存在,就会自动创建一个数据库。

        集合,在关系型数据库中对应"表",但是不叫table,而是叫做collection。可以用show collection命令来查看有哪些集合。

        文档,在关系型数据库对应字段。因为mongo是非关系型数据库,所以可以随便存值,不用保证每条数据都要用共同的字段。

2.docker安装mongo数据库

1.docker安装

1.官网下载Tags · apolloconfig/apollo · GitHubApollo is a reliable configuration management system suitable for microservice configuration management scenarios. - Tags · apolloconfig/apolloicon-default.png?t=N7T8https://github.com/apolloconfig/apollo/tags

2.打开虚拟机,rz导入文件

3.tar -zxvf java.tar.gz

        解压到指定的文件夹

        tar -zxvf java.tar.gz -C /usr/java

2.mongo安装

搜索MongoDB镜像

docker search mongo

拉取镜像

docker pull mongo

创建容器

docker run -itd --name mongod -p 27017:27017 mongo:4.2.6 --auth ​

--auth:要求使用密码登录

进入客户端

docker exec -it mongod mongo admin

第一个mongod:容器名称

第二个mongo:启动mongo客户端

admin表示使用admin数据库做身份验证

创建用户

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


user:用户名
pwd:密码
role:角色
db:所属数据库

查看用户: show users  或者  db.system.users.find();
修改用户密码: db.changeUserPassword("用户名", "新密码");

Mongo支持的角色
read    允许用户读取指定数据库
readWrite    允许用户读写指定数据库
dbAdmin    允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin    允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin    只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限
readAnyDatabase    只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase    只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase    只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase    只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限
root    只在admin数据库中可用。超级账号,超级权限

3.使用

windows开启关闭防火墙

1、打开运行,输入cmd。

2、直接执行命令:

NetSh Advfirewall set allprofiles state on //开启防火墙

NetSh Advfirewall set allprofiles state off //关闭防火墙

docker 进入 mongodb

docker exec -it mongod mongo admin

登录
db.auth("zsc","123456");
​
 show users;查看用户
 show dbs; 查看库
 show collections;查看文档

对数据库的管理
切换和创建数据库
use 数据库名  
​
存在就切换,不存在就创建
默认不会持久化到硬盘,所以show dbs; 看不见
查看数据库

show dbs;

删除数据库
use 数据库   进入您要删除的数据库
db.dropDatabase(); 不要传任何参数

对集合管理(对应表管理)
创建集合

db.createCollection("tmp");

查看集合
show collections;
集合状态
db.集合名称.stats();
删除集合

db.tmp.drop();

文档管理 (对应数据管理)

mongodb中所有数据都是一个个文档

文档的数据结构和 JSON基本一样。所有存储在集合中的数据都是BSON格式(Binary JSON 的简写)

文档无约束,字段、内容、容量都可以随意写;

insert 新增
db.集合名.insert();
​
db.item.insert({"name":"大括号代表里面是一个对象"});
​
提示:WriteResult({ "nInserted" : 1 })
​
db.item.insert([{"name":"第一行"},{"name":"第二行"}]);
​
提示:BulkWriteResult({
    "writeErrors" : [ ],
    "writeConcernErrors" : [ ],
    "nInserted" : 2,
    "nUpserted" : 0,
    "nMatched" : 0,
    "nModified" : 0,
    "nRemoved" : 0,
    "upserted" : [ ]
})

3.2以后是新版本。

把insert();拆为了insertOne({});和insertMany([{},{}]);

db.item.insertOne({"name":"插入一个"});
​
db.item.insertMany([{"name":"插入第一个"},{"name":"插入第二个"}]);

save 保存


(适合做一条数据完整写操作,且包含主键。如果不存在就插入,如果存在就全量替换)

保存可以和新增一样,新增数据

db.item.save({"name":"save一条数据"});
提示:WriteResult({ "nInserted" : 1 })

也可以进行一条数据修改 (全量覆盖)

首先查看文档中数据
> db.item.find();
{ "_id" : ObjectId("6523a1e3536ad0bbc3357c46"), "name" : "大括号代表里面是一个对象" }
{ "_id" : ObjectId("6523a2a5536ad0bbc3357c47"), "name" : "zsc" }
{ "_id" : ObjectId("6523a2a5536ad0bbc3357c48"), "name" : "第二行" }
{ "_id" : ObjectId("6523a5a4849c738f0b308418"), "name" : "插入第二个" }
{ "_id" : ObjectId("6523a608849c738f0b308419"), "name" : "插入第二个" }
{ "_id" : ObjectId("6523a639849c738f0b30841a"), "name" : "重新插入第一个" }
{ "_id" : ObjectId("6523a639849c738f0b30841b"), "name" : "重新插入第二个" }
{ "_id" : ObjectId("6523a8a5849c738f0b30841c"), "name" : "save一条数据" }
​
对于“8419”的数据做修改保存
> db.item.save({ "_id" : ObjectId("6523a608849c738f0b308419"), "name" : "错误插入第二个" });
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
​
但是不能对批量做修改,会报错“主键冲突”

上面是为了造一些数据。具体的操作就用程序实现了

3.springboot集成mongo

1.mongo的依赖
<!--mongo的依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2.mongo 的配置
#mongo的配置
spring.data.mongodb.uri=mongodb://username:password@localhost:27017/?authSource=admin
spring.data.mongodb.database=database
​
username:password  表示数据库的用户名和密码
localhost:27017  表示MongoDB服务器的地址和端口号
?authSource=admin  表示是否验证是在admin数据库
​
database 表示你要连接的MongoDB数据库名称
3.具体的代码操作是MongoTemplate

请注意,mongoTemplate是要在类中,方法上面引入的

@Resource
private MongoTemplate mongoTemplate;

这里代码演示查找,插入和删除

根据id查找的代码如下:
mongoTemplate.findById(toracleDemoUserBO.getUserAddressBO().getUserAdressId(),
        UserAddressBO.class, CommonConstant.MONGODB_USER_COLLECTION);
​
toracleDemoUserBO.getUserAddressBO().getUserAdressId() 
    :表示找出mongo集合中的唯一键UserAddressId
UserAddressBO.class :表示返回的结果是这个类的样子,里面的字段是一一对应的
CommonConstant.MONGODB_USER_COLLECTION :这是我自定义的一个常量,
    具体内容是"user_address",这表示我操作的是mongo数据库中的user_address集合
保存数据如下:
mongoTemplate.save(userAddressPO)
插入数据如下:
mongoTemplate.insert(userAddressPO, CommonConstant.MONGODB_USER_COLLECTION)
    userAddressPO : 表示我插入的数据都放在这个对象中
    CommonConstant.MONGODB_USER_COLLECTION : 这是我自定义的一个常量,具体内
        是"user_address",这表示我操作的是mongo数据库中的user_address集合
根据条件删除的语句如下:
//构造一个查询条件
Query query = new Query();
//添加查询标准:表中的id 和 saveUserAdress对象中的userAddressId相同;
query.addCriteria(Criteria.where("_id").is(saveUserAdress.getUserAddressId()));
//使用remove方法,加入条件
mongoTemplate.remove(query);

请注意:在Criteria的where语句中 得用"_id" 而非 "id",不然是找不到对应字段的。 如有疑问,请用可视化软件比如navicat 连接一下mongo,去观察一下数据库。这个自动生成的唯一标识id,是 " _id"的字样。

 4.视频资料推荐:

【尚学堂】JAVA高级框架之MongoDB数据库视频教程

### 如何在 Spring BootMongoDB 中正确设置和处理日期格式 #### 1. 使用 `@JsonFormat` 注解来指定日期格式 为了确保应用程序中的日期字段能够按照预期的方式序列化和反序列化,在实体类中可以使用 Jackson 提供的 `@JsonFormat` 注解。这允许开发者定义输入输出时使用的具体模式。 ```java import com.fasterxml.jackson.annotation.JsonFormat; import java.util.Date; public class MyDocument { @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8") private Date createTime; // getters and setters omitted for brevity } ``` 此方法适用于大多数场景下的简单应用需求[^1]。 #### 2. 自定义 `MongoCustomConversions` 来全局配置日期解析器 对于更加复杂的项目,可能需要自定义转换服务以统一管理整个项目的日期格式。通过实现 `MongoCustomConversions` 接口并注册到 Spring 上下文中,可以在不修改现有模型的情况下改变默认行为。 ```java @Configuration public class MongoConfig { @Bean public MongoCustomConversions mongoCustomConversions() { List<Converter<?, ?>> converters = new ArrayList<>(); converters.add(new Converter<String, Date>() { @Override public Date convert(String source) { try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); return sdf.parse(source); } catch (ParseException e) { throw new RuntimeException(e); } } }); converters.add(new Converter<Date, String>() { @Override public String convert(Date source) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); return sdf.format(source); } }); return new MongoCustomConversions(converters); } } ``` 这种方式不仅限于日期类型的转换,还可以扩展至其他任何对象之间的映射关系[^2]。 #### 3. 利用 `application.properties` 文件调整时间戳表示形式 如果只是想要更改存储在数据库内的 ISODate 字段显示样式而不需要额外编码,则可以直接编辑 application.properties 或 yml 文件: ```properties spring.data.mongodb.auto-index-creation=true spring.data.mongodb.uri=mongodb://localhost:27017/testdb?connectTimeoutMS=30000&socketTimeoutMS=30000 # 设置为true会使得所有的时间都保存成UTC标准时间而不是本地时间 spring.data.mongodb.use-datetime-timestamps=false ``` 当属性 `use-datetime-timestamps` 被设为 false 后,默认情况下所有的 Java Util Date 类型都会被当作字符串存入 DB 并采用系统当前区域设定作为参考[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值