【Spring连载】使用Spring Data访问 MongoDB(二)----Template API
【Spring连载】使用Spring Data访问 MongoDB(二)----Template API
- 一、方便的方法
- 二、执行回调函数Execute Callbacks
- 三、Fluent API
- 四、异常转换
- 五、域类型映射
- 六、配置
- 6.1 默认读取首选项Read Preference
- 6.2 WriteResultChecking策略
- 6.3 默认写安全WriteConcern
- 6.4 WriteConcernResolver
- 6.5 发布实体生命周期事件
- 6.6 配置EntityCallbacks
- 6.7 Document count配置
- 七、索引及集合管理
- 八、保存、更新和删除Documents
- 九、查询Documents
- 9.1 查询集合中的Documents
- 9.2 选择字段
- 9.3 其他查询选项
- 9.3.1 Hints
- 9.3.2 游标批大小Cursor Batch Size
- 9.3.3 Collations
- 9.3.4 读取首选项Read Preference
- 9.3.5 Comments
- 十、Counting Documents
- 十一、聚合(Aggregation)框架支持
MongoTemplate及其反应式(reactive)对应类位于org.springframework.data.mongodb.core包中,是Spring MongoDB支持的中心类,为与数据库交互提供了丰富的功能集。该template提供了创建、更新、删除和查询MongoDB文档的方便操作,并提供了域对象和MongoDB documents之间的映射。
配置后,MongoTemplate是线程安全的,可以在多个实例中重用。
一、方便的方法
MongoTemplate类实现了MongoOperations接口。在尽可能多的情况下,MongoOperations上的方法以MongoDB driver Collection对象上可用的方法命名,以便让现有使用driver API的MongoDB开发人员熟悉。例如,你可以找到find, findAndModify, findAndReplace, findOne, insert, remove, save, update, 和 updateMulti等方法。设计目标是尽可能容易地在使用基础MongoDB driver和MongoOperations之间进行转换。这两个API之间的主要区别在于,MongoOperations可以传递域对象,而不是Document。此外,MongoOperations为Query, Criteria, 和 Update操作提供了流畅的API,而不是填充Document来指定这些操作的参数。
有关更多信息,请参阅文档的CRUD(章节八、九)部分。
引用MongoTemplate实例上的操作的首选方式是通过其接口MongoOperations。
二、执行回调函数Execute Callbacks
MongoTemplate提供了许多方便的方法来帮助你轻松执行常见任务。但是,如果你需要直接访问MongoDB driver API,可以使用几种Execute回调方法之一。execute回调为你提供了对MongoCollection或MongoDatabase对象的引用。
- < T> T execute (Class<?> entityClass, CollectionCallback< T> action):为指定类的实体集合运行给定的CollectionCallback。
- < T> T execute (String collectionName, CollectionCallback action):在给定名称的集合上运行给定的CollectionCallback。
- < T> T execute (DbCallback action):运行DbCallback,根据需要转换任何异常。Spring Data MongoDB为MongoDB 2.2版引入的聚合(Aggregation)框架提供了支持。
- < T> T execute (String collectionName, DbCallback< T> action):在给定名称的集合上运行DbCallback,根据需要转换任何异常。
- < T> T executeInSession (DbCallback< T> action):在与数据库的同一连接中运行给定的DbCallback,以确保写操作繁重的环境中的一致性,在这里你可能读取你所写的数据。
以下示例使用CollectionCallback返回有关索引的信息:
boolean hasIndex = template.execute("geolocation", collection ->Streamable.of(collection.listIndexes(org.bson.Document.class)).stream().map(document -> document.get("name")).anyMatch("location_2d"::equals)
);
三、Fluent API
作为与MongoDB进行更低级交互的核心组件,MongoTemplate提供了广泛的方法,涵盖了从集合创建、索引创建和CRUD操作到更高级的功能(如Map Reduce和聚合)的需求。你可以为每个方法找到多个重载。其中大多数涉及API的可选的或可为null的部分。
FluentMongoOperations为MongoOperations的常见方法提供了一个更窄的接口,并提供了更易读、更流畅的API。入口点(insert(…), find(…), update(…), 和其他)遵循基于要运行的操作的自然命名模式。从入口点(entry point)来看,API设计为仅提供依赖于上下文的方法,这些方法会导致调用实际MongoOperations对应方的终止方法 — 在以下示例的情况下使用all方法:
List<Jedi> all = template.query(SWCharacter.class) --------1.inCollection("star-wars") --------2.as(Jedi.class) --------3.matching(query(where("jedi").is(true))) --------4.all();1. 用于将查询中使用的字段映射到的类型。
2. 如果未在域类型上定义,则要使用的集合名称。
3. 如果未使用原始域类型,则用此结果类型。
4. 查找查询。
使用投影(projections)允许MongoTemplate通过将实际响应限制在投影目标类型所需的字段来优化结果映射。只要查询本身不包含任何字段限制,并且目标类型是closed接口或DTO投影,这一点就适用。
投影不得应用于DBRefs。
你可以通过终止(terminating)方法在检索单个实体和检索多个实体之间切换,作为List或Stream :first(), one(), all(), 或 stream()。
当使用near(NearQuery)编写地理空间查询时,终止(terminating)方法的数量会更改为仅包括对在MongoDB中运行geoNear命令有效的方法(在GeoResults中获取GeoResult实体),如下例所示:
GeoResults<Jedi> results = template.query(SWCharacter.class).as(Jedi.class).near(alderaan) // NearQuery.near(-73.9667, 40.78).maxDis….all();
四、异常转换
Spring框架为各种各样的数据库和映射技术提供了异常转换。这在传统上是JDBC和JPA的功能。Spring对MongoDB的支持通过提供“org.springframework.dao.support.PersistenceExceptionTranslator”接口的实现,将此功能扩展到MongoDB数据库。
映射到与Spring一致的数据访问异常层次结构背后的动机是,你可以编写可移植的描述性异常处理代码,而无需针对MongoDB错误代码进行编码。Spring的所有数据访问异常都是从根DataAccessException类继承的,因此你可以确保在单个try-catch块中捕获所有与数据库相关的异常。请注意,并不是所有由MongoDB driver抛出的异常都继承自MongoException类。内部异常和消息将被保留,因此不会丢失任何信息。
MongoExceptionTranslator执行的一些映射是“com.mongodb.Network”到DataAccessResourceFailureException,以及MongoException错误代码1003、12001、12010、12011和12012到InvalidDataAccessApiUsageException。查看实现以获取有关映射的更多详细信息。
五、域类型映射
MongoDB documents和域类之间的映射是通过委托给MongoConverter接口的实现来完成的。Spring提供了MappingMongoConverter,但是你也可以编写自己的转换器。虽然MappingMongoConverter可以使用额外的元数据来指定对象到documents的映射,但它也可以通过使用一些用于IDs和集合名称映射的约定来转换不包含额外元数据的对象。这些约定以及映射注解的使用将在对象映射一文中进行解释。
六、配置
你可以使用以下配置来创建和注册MongoTemplate的实例,如下例所示:
基于Java的注册MongoClient对象并启用Spring的异常转换支持
@Configuration
class ApplicationConfiguration {@BeanMongoClient mongoClient() {return MongoClients.create("mongodb://localhost:27017");}@BeanMongoOperations mongoTemplate(MongoClient mongoClient) {return new MongoTemplate(mongoClient, "geospatial");}
}
基于XML的注册MongoClient对象
<mongo:mongo-client host="localhost" port="27017" /><bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"><constructor-arg ref="mongoClient" /><constructor-arg name="databaseName" value="geospatial" />
</bean>
MongoTemplate和ReactiveMongoTemplate有几个重载构造函数:
- MongoTemplate(MongoClient mongo, String databaseName):使用MongoClient对象和默认的数据库名称进行操作。
- MongoTemplate(MongoDatabaseFactory mongoDbFactory):采用一个mongoDbFactory对象,该对象封装了MongoClient对象、数据库名称以及用户名和密码。
- MongoTemplate(MongoDatabaseFactory mongoDbFactory, MongoConverter mongoConverter):添加一个MongoConverter用于映射。
在创建MongoTemplate/ReactiveMongoTemplate时,你可能希望设置的其他可选属性包括默认的WriteResultCheckingPolicy、WriteConcern、ReadPreference和下面列出的其他属性。
6.1 默认读取首选项Read Preference
如果没有通过查询定义其他首选项(9.3.4 读取首选项Read Preference),则将使用默认读取首选项用于读取操作。
6.2 WriteResultChecking策略
6.3 默认写安全WriteConcern
6.4 WriteConcernResolver
6.5 发布实体生命周期事件
6.6 配置EntityCallbacks
6.7 Document count配置
七、索引及集合管理
八、保存、更新和删除Documents
九、查询Documents
9.1 查询集合中的Documents
9.2 选择字段
9.3 其他查询选项
9.3.1 Hints
9.3.2 游标批大小Cursor Batch Size
9.3.3 Collations
9.3.4 读取首选项Read Preference
9.3.5 Comments
十、Counting Documents
十一、聚合(Aggregation)框架支持
相关文章:
【Spring连载】使用Spring Data访问 MongoDB(二)----Template API
【Spring连载】使用Spring Data访问 MongoDB(二)----Template API 一、方便的方法二、执行回调函数Execute Callbacks三、Fluent API四、异常转换五、域类型映射六、配置6.1 默认读取首选项Read Preference6.2 WriteResultChecking策略6.3 默认写安全Wri…...
手写table表格(一表头多数据)
手写table表格(一表头多数据) <template><div class"table-info"><div class"info-list"><div class"header-wrapper"><div class"columns-title" v-for"(i, k) in columns&q…...

python3 flask 实现对config.yaml文件的内容的增删改查,并重启服务
config.yaml配置文件内容 功能就是userpass下的用户名和密码做增删改查,并重启hy2服务 auth:type: userpassuserpass:csdn: csdnlisten: :443 masquerade:proxy:rewriteHost: trueurl: https://www.bing.com/type: proxy tls:cert: /root/hyst*****马赛克******er…...
ADO世界之“对象”
目录 一、Command 对象 1.Command 对象 2.语法 3.属性 4.方法 5.集合 二、Connection 对象 1.Connection 对象 2.语法 3.属性 4.方法 5.事件 6.集合 三、Error 对象 1.Error 对象 2.语法 3.属性 四、Parameter 对象 1.Field 对象 2.语法 3.属性 4.方法 …...
LeetCode59-螺旋矩阵II
参考链接:代码随想录->螺旋矩阵II 关键是学视频链接里面的编码思想,然后背下来 class Solution { public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> resvector(n,vector<int>(n,0));int sx0,s…...

MySQL 索引原理以及 SQL 优化
索引 索引:一种有序的存储结构,按照单个或者多个列的值进行排序。索引的目的:提升搜索效率。索引分类: 数据结构 B 树索引(映射的是磁盘数据)hash 索引(快速锁定内存数据)全文索引 …...

C++学习Day08之函数模板和普通函数的区别以及调用规则
目录 一、程序及输出1.1 区别1.1.1 自动类型推导,不可以发生隐式类型转换的1.1.2 普通函数 可以发生隐式类型转换 1.2 调用规则 二、分析与总结 一、程序及输出 1.1 区别 1.1.1 自动类型推导,不可以发生隐式类型转换的 1.1.2 普通函数 可以发生隐式类型…...

Kaggle实践之《Home Credit Default Risk》的逐步优化
记录下每一次的改进及其score。 1、只用训练集的特征简单处理 特征只用训练集的特征,把string型的特征全部进行one-hot转化,然后随机1:4分成测试集训练集,模型也调参直接出结果。 最终的score是训练集80.13%、验证集76.33%、线上74.28%。 …...

django rest framework 学习笔记-实战商城2
01收货地址模型类和视图定义_哔哩哔哩_bilibili 本博客借鉴至大佬的视频学习笔记 地址信息的管理:增删改查的实现 # 序列化器配置 class AddrSerializer(serializers.ModelSerializer):"""收货地址的模型序列化器"""class Meta:mo…...

WEB 3D技术 three.js 3D贺卡(4) 添加鼠标滚轮移动屏幕 改变贺卡文字功能
好,上文 WEB 3D技术 three.js 3D贺卡(3) 点光源灯光动画效果 那么 我们来做一下 鼠标滚动相机和滚动时不同文字的切换 首先 我们要设置多个场景 其实也不能完全叫场景 也可以说多个位置 反正简单说就是多个位置 展现多个场景 我们先在代码的最下面 加上一个对象数…...

爬虫在网页抓取的过程中可能会遇到哪些问题?
在网页抓取(爬虫)过程中,开发者可能会遇到多种问题,以下是一些常见问题及其解决方案: 1. IP封锁: 问题:封IP是最常见的问题,抓取的目标网站会识别并封锁频繁请求的IP地址。 解决方案…...
Eclipse中Run As On Server和Run As Java Application
一、名词释义 run java application (作为Java应用程序运行)是运行 java main方法。 run on server是启动一个web 应用服务器。 二、两者的区别 Eclipse中可以创建java project 也可以创建java web poject 。java project是可以直接在命令行运行,或者…...

【MySQL】库的操作——MySQL数据库 、库的操作、表的操作、字符集和校验规则、备份和恢复
文章目录 MySQL1. 库的操作2. 表的操作3. 字符集和校验规则3.1 查看系统默认字符集以及校验规则3.2 查看数据库支持的字符集3.3 查看数据库支持的字符集校验规则 4. 备份和恢复4.1 备份4.2 还原 MySQL 1. 库的操作 连接服务器 mysql -h 127.0.0.1 -P 3306 -u root -pmysql -u…...

pytorch 用F.normalization的逆归一化如何操作
逆归一化的时候再把这个数乘回去就行了 magnitude a.norm(p2, dim1, keepdimTrue) # NEW atorch.nn.functional.normalize(a, p2, dim1) a_or a* magnitude # NEW print(a_or) Outputs: tensor([]1,2,3)...

LabVIEW多通道压力传感器实时动态检测
LabVIEW多通道压力传感器实时动态检测 介绍了一种基于LabVIEW的多通道压力传感器实时动态检测系统,解决压阻式压力传感器温度补偿过程的复杂度,提高测量的准确性。通过自动轮询检测方法,结合硬件检测模型和多通道检测系统设计,本…...

Jenkins解决Host key verification failed (2)
Jenkins解决Host key verification failed 分析原因情况 一、用OpenSSH的人都知ssh会把你每个你访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告,避免…...

C#,数值计算,矩阵的乔莱斯基分解(Cholesky decomposition)算法与源代码
一、安德烈路易斯乔尔斯基 安德烈路易斯乔尔斯基出生于法国波尔多以北的查伦特斯海域的蒙古扬。他在波尔多参加了Lyce e,并于1892年11月14日获得学士学位的第一部分,于1893年7月24日获得第二部分。1895年10月15日,乔尔斯基进入莱科尔理工学院…...
docker 备份 mysql
使用 Docker 执行 MySQL 备份是一个实用的操作,可以帮助你确保数据的安全性和可恢复性。这里有一步步的指导帮你完成: 1. 确定 MySQL 容器名称或 ID 首先,你需要知道运行 MySQL 数据库的容器的名称或 ID。可以通过下面的命令查看所有正在运…...

使用C# Net6连接国产达梦数据库记录
达梦官网:http://www.dameng.com/ 1 下载达梦并进行安装 下载地址:官网首页——服务与合作——下载中心(https://www.dameng.com/list_103.html) 根据需要自行下载需要的版本,测试版本为:x86 win64 DM8版…...

docker (八)-dockerfile制作镜像
一 dockerfile dockerfile通常包含以下几个常用命令: FROM ubuntu:18.04 WORKDIR /app COPY . . RUN make . CMD python app.py EXPOSE 80 FROM 打包使用的基础镜像WORKDIR 相当于cd命令,进入工作目录COPY 将宿主机的文件复制到容器内RUN 打包时执…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...

mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...

Linux基础开发工具——vim工具
文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...

李沐--动手学深度学习--GRU
1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...