探究mybatis中的映射器(mappers)
一个异常引发的思考
开发者在使用mybatis时,经常会遇到 “org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): xxxxx”和"org.apache.ibatis.binding.BindingException: Type interface xxxMapper is not known to the MapperRegistry"两种异常,先说明下两种异常产生的原因:第一种,在做增删改查时,根据statementId找不到相应的MappedStatement。第二中是,mapper接口没有注册到mybatis中。
作者先从mybatis映射器的配置讲起,来分析产生该异常的原因。
映射器(mappers)的四种配置方式
在mybatis的配置文件中,通常会配置<mappers>项,该配置项告诉MyBatis到哪里去找映射文件或者映射接口类,以便获得并解析其对应的sql语句。
【方式一】使用相对于类路径的资源引用
<mappers><mapper resource="../../../XxxMapper.xml"/>
</mappers>
【方式二】使用完全限定资源定位符(URL)
<mappers><mapper url="file:///../../XxxMapper.xml"/>
</mappers>
【方式三】使用映射器接口实现类的完全限定类名
<mappers><mapper class="xx.xxx.xxx.XxxMapper"/>
</mappers>
【方式四】将包内的映射器接口实现全部注册为映射器
<mappers><package name="xx.xxx.xxx"/>
</mappers>
当然在使用ssm框架或者springboot时,我们一般不会这么配置,但是"万变不离其宗",不管怎么配置,mybatis的底层代码是不会变得,所以我们通过分析上述四种映射器的处理方式,获得映射器解析原理。
上述的四种方式可以分为两类:一类是配置映射mapper.xml文件,另一类是配置映射mapper接口。其中【方式一】和【方式二】属于第一类,当只用这种配置方式时,要求映射文件中配置的'"namespace"的值为对应的映射接口的完全限定类名,不然在调用mapper接口中的方法时会产生异常:org.apache.ibatis.binding.BindingException: Type interface xxxMapper is not known to the MapperRegistry;【方式三】和【方式四】属于第二类,当只用这种方式配置时,用注解配置SQL是没问题的,但是在不用注解而使用mapper映射文件时,要求mapper映射文件需要和mapper接口在同一路径下且文件名称相同,否则调用mapper接口时会产生异常:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):xxx。当然这四种配置方式,可以同时混用。
接下来我们看下mybatis中解析配置<mappers>这块的源码:
/// 源码来自<XMLConfigBuilder>类,方法mapperElement(XNode)
private void mapperElement(XNode parent) throws Exception {if (parent != null) {// 循环遍历<mappers>中配置的映射器for (XNode child : parent.getChildren()) {// 判读是否是<package>节点,即【方式四】配置的解析if ("package".equals(child.getName())) {// 获得包名String mapperPackage = child.getStringAttribute("name");// 调用Configuration#addMappers(String)方法【1】configuration.addMappers(mapperPackage);// 不是<package>就是<mapper>,否则直接抛出异常} else {String resource = child.getStringAttribute("resource");String url = child.getStringAttribute("url");String mapperClass = child.getStringAttribute("class"); /* 通过下面这块"if...else..."代码,我们可知<mapper>中这三个属性一次只能配置一个!*/// 【方式一】配置的解析 if (resource != null && url == null && mapperClass == null) {ErrorContext.instance().resource(resource);// 通过配置的路径获得mapper映射文件的输入流InputStream inputStream = Resources.getResourceAsStream(resource);// 创建XMLMapperBuilder对象XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, resource, configuration.getSqlFragments());// 调用XMLMapperBuilder#parse()方法【2】mapperParser.parse();// 【方式二】配置的解析,与【方式一】相似,只是获取映射文件的路径不同} else if (resource == null && url != null && mapperClass == null) {ErrorContext.instance().resource(url);InputStream inputStream = Resources.getUrlAsStream(url);XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, url, configuration.getSqlFragments());mapperParser.parse();// 【方式三】配置的解析} else if (resource == null && url == null && mapperClass != null) {// 这里先将该接口加载到jvmClass<?> mapperInterface = Resources.classForName(mapperClass);// 调用Configuration#addMapper(Class<T>)方法【3】configuration.addMapper(mapperInterface);} else {throw new BuilderException("A mapper element may only specify a url, resource or class, but not more than one.");}}}}
}
<mappers>的解析源码中并没有暴露过多的细节,我们还需要研究上述源码中标记的【1】【2】【3】方法:
其中【1】【3】方法在一个类中,且属于第二类映射器配置方式,不妨先看下这两个方法的源码及方法调用栈
/// 源码摘自<Configuration>类
public void addMappers(String packageName) {// 调用了MapperRegistry#addMappers(String)mapperRegistry.addMappers(packageName);
}public <T> void addMapper(Class<T> type) {// 调用了MapperRegistry#addMapper(Class<T>)mapperRegistry.addMapper(type);
}
/////////////////////////////////////////////////////////////////////////////////////
/// 源码摘自<MapperRegistry>类
public void addMappers(String packageName) {addMappers(packageName, Object.class);
}
// 简单讲解该方法
public void addMappers(String packageName, Class<?> superType) {ResolverUtil<Class<?>> resolverUtil = new ResolverUtil<Class<?>>();resolverUtil.find(new ResolverUtil.IsA(superType), packageName);Set<Class<? extends Class<?>>> mapperSet = resolverUtil.getClasses();// 上面三句代码目的就是获得packageName代表的包下的所有接口和类// 循环遍历这些接口和类,然后调用和【方式三】一样的方法,可以认为映射文件配置的【方式四】// 是【方式三】的批量操作,将整个包下的接口一次性配置。 for (Class<?> mapperClass : mapperSet) {addMapper(mapperClass);}
}
// 着重分析该方法!
public <T> void addMapper(Class<T> type) {// 首先排除非接口的类if (type.isInterface()) {// 判断该接口是否已经解析,避免重复解析,此处保证映射即使配置重复,也会正常执行if (hasMapper(type)) {throw new BindingException("Type " + type + " is already known to the MapperRegistry.");}// 标识是加载成功boolean loadCompleted = false;try {// konowMappers是一个Map集合,用于存储接口和接口的代理类// 标识的用途在这里,作者默认会执行成功,先把接口和接口代理放入// Map集合中,如果下文出现异常,则loadCompleted 不会被赋值成true// 就会在finally{...}中删除该接口knownMappers.put(type, new MapperProxyFactory<T>(type));// It's important that the type is added before the parser is run// otherwise the binding may automatically be attempted by the// mapper parser. If the type is already known, it won't try.// 此处有引出一个类<MapperAnnotationBuilder>,该类的作用是// 解析注解配置sql的。MapperAnnotationBuilder parser = new MapperAnnotationBuilder(config, type);// 下面继续分析MapperAnnotationBuilder#parse()方法parser.parse();loadCompleted = true;} finally {// try{...}中如果有异常需要,删除放入knownMappersif (!loadCompleted) {knownMappers.remove(type);}}}
}
接下来继续分析MapperAnnotationBuilder#parse()方法
/// 源码来自<MapperAnnotationBuilder>类
// MapperAnnotationBuilder#parse()
public void parse() {// 此处的type即mapper接口String resource = type.toString();// 先判断是否已经解析过该接口,避免重复解析if (!configuration.isResourceLoaded(resource)) {// 见下文方法源码loadXmlResource();// 解析完成保存一下,也是为了避免重复解析configuration.addLoadedResource(resource);assistant.setCurrentNamespace(type.getName());parseCache();parseCacheRef();Method[] methods = type.getMethods();// 解析接口中的方法,暂时不做深入讲解for (Method method : methods) {try {// issue #237if (!method.isBridge()) {// 这里是封装成MappedStatement对象的过程,此处源码不做深入分析// 我们只需知道,这里的操作才是真正的映射绑定过程parseStatement(method);}} catch (IncompleteElementException e) {configuration.addIncompleteMethod(new MethodResolver(this, method));}}}parsePendingMethods();
}
// MapperAnnotationBuilder#loadXmlResource()方法
private void loadXmlResource() {// Spring may not know the real resource name so we check a flag// to prevent loading again a resource twice// this flag is set at XMLMapperBuilder#bindMapperForNamespace// 避免重复解析的判断if (!configuration.isResourceLoaded("namespace:" + type.getName())) {// 这句代码非常重要!!!!因为这句代码解释了我们上文所说的:在只用第二类方式配置映射器时// "在不用注解而使用mapper映射文件时,要求mapper映射文件需要和mapper接口在同一路径下且文件名称相同"// 这句代码含义是,根据接口的全限定类名拼装了一个mapper.xml的路径String xmlResource = type.getName().replace('.', '/') + ".xml";InputStream inputStream = null;try {// 根据路径获得mapper.xml的输入流inputStream = Resources.getResourceAsStream(type.getClassLoader(), xmlResource);} catch (IOException e) {// 无法根据路径获得文件时,则忽略,此处不抛出异常// 是因为接口支持注解方式的配置sql// ignore, resource is not required}if (inputStream != null) {// 构建XMLMapperBuilder,并调用parse()方法,到这里我们发现// 此处的操作和解析映射器配置【方式一】、【方式二】一样了,调用了方法【2】XMLMapperBuilder xmlParser = new XMLMapperBuilder(inputStream, assistant.getConfiguration(), xmlResource, configuration.getSqlFragments(), type.getName());xmlParser.parse();}}
}
讲解至此我们发现映射器配置的【方式三】和【方式四】的解析过程,最终走向了【方式一】和【方式二】的解析流程:XMLMapperBuilder#parse()(方法【2】),看下源码:
/// 源码来自<XMLMapperBuilder>类
// XMLMapperBuilder#parse()方法
public void parse() {// 此处的resource是mapper.xml的相对路径,同理避免重复解析的检测if (!configuration.isResourceLoaded(resource)) {// 解析mappe.xml中的mapper节点configurationElement(parser.evalNode("/mapper"));// 保存用于区分是否已经解析过configuration.addLoadedResource(resource);// 这句代码比较重要,将mapper接口和namespace绑定!下文分析源码bindMapperForNamespace();}parsePendingResultMaps();parsePendingCacheRefs();parsePendingStatements();
}
// XMLMapperBuilder#bindMapperForNamespace()方法
private void bindMapperForNamespace() {// 获得mapper.xml中配置的namespaceString namespace = builderAssistant.getCurrentNamespace();// 判读是否为空if (namespace != null) {Class<?> boundType = null;try {// 尝试将namespace作为类全限定名来加载类到jvmboundType = Resources.classForName(namespace);} catch (ClassNotFoundException e) {//ignore, bound type is not required}// 类加载成功if (boundType != null) {if (!configuration.hasMapper(boundType)) {// Spring may not know the real resource name so we set a flag// to prevent loading again this resource from the mapper interface// look at MapperAnnotationBuilder#loadXmlResourceconfiguration.addLoadedResource("namespace:" + namespace);// 调用Configuration#addMapper(Class<T>),到此我们发现这不是方法【3】么,// 同时也是映射器配置【方式三】和【方式四】的解析过程// 这就不奇怪了,代码中为什么会存在这么多关于是否已解析的判断了,因为存在// 递归解析,避免重复无限的解析!configuration.addMapper(boundType);}}}}
我们梳理下流程:
解释下该流程:该流程中比较重要的是mapper接口和mapper.xml的对应关系,不难发现mapper接口的工作模式需要注解或者mapper.xml,同时会将自己注册到mapperRegistry中,在非注解情况下,mybatis默认获取与mapper接口同目录下同名称的mapper.xml,如果存在该mapper.xml则解析并封装MappedStatement对象;否则,流程结束,此时若使用该mapper调用方法时则会产生第一中异常。而mapper.xml方式是可以脱离mapper接口工作的,mapper.xml中的"namespace"属性无论是否为接口的全限定名称,都会封装MappedStatement对象的,只是当"namespace"不为接口的全限定名称时,与之对应的mapper接口无法工作,因为mapper接口没有注册到mapperRegistry中,此时使用mapper接口调用方法时会产生第二种异常。
本文只讲解映射器的解析流程,很多底层的其他操作不属于本文讲解范畴,如封装MappedStatement的过程。我们只需从上述流程中获得一下几个问题的答案就可以:
- 在仅使用<mapper class="">和<package name="">配置的方式下,为什么需要mapper接口和mapper映射文件位于同一路径下,当然不考虑使用注解的情况
- 在mybatis使用mapper接口的方式时,为什么mapper映射文件中的"namespace"必须为相应接口的全限定名称
- 在仅使用<mapper resource="">和<mapper url="">时,为什么没有要求mapper接口和mapper映射文件必须位于同一路径
- 当mapper接口和mapper映射文件不在同一路径下时,可以如何配置映射器,保证mybatis的正常使用
问题1,通过上述流程图我们知道,在mybatis的中会根据类的全限定名称拼装Mapper.xml的路径,显然当两者不在同一包下时,是无法解析mapper映射文件的,从而无法正确封装MappedStatement,在使用的mapper接口方法调用时,会找不到对应的MappedStatement,会抛出异常:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):xxx
问题2,通过上述流程,在mybatis中会将mapper.xml中的namespace属性对应的字符串作为mapper接口的全限定名称。如果不这么做,该mapper.xml就不能和与之对应的mapper接口绑定,这样就无法通过mapper接口调用,调用时会抛出异常:org.apache.ibatis.binding.BindingException: Type interface xxxMapper is not known to the MapperRegistry;
问题3,因为在这两种情况下,mybatis根据mapper.xml中配置的namespace属性加载mapper接口,只要namespace对应的值是一个正确的mapper接口的全限定名称,都可以正常加载到JVM,然后执行封装MappedStatement等步骤
问题4,第一种方式:依次配置全部的mapper映射文件即可,使用<mapper resource>
第二中方式:分别配置mapper接口和mapper.xml,配置<mapper class="">或<package name="">的同时,还要配置<mapper resource="">,这样能保证在解析mapper接口时,即使通过拼装mapper.xml路径找不到相应的mapper也没问题,因为在解析mapper.xml时,会重新去绑定mapper接口与mapper.xml。是不是感觉这样配置比较多余,其实不然,在整合spring时,这种配置很有必要的。
总结
mybatis中映射器(mappers)的四种配置方式讲解完成,通过追踪源码分析了解析过程。本文主要是希望读者能了解mybatis映射器的解析流程,在遇到BindingException异常时,能够分析出问题出在哪里。
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 14.企业应用架构模式 --- Web表现模式
1.2....
2024/2/28 10:12:05 - 2. Add Two Numbers
我的解法: 第一次: /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/ class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {ListNode l3 = new ListNod…...
2024/2/28 10:12:03 - Linux服务器上使用nginx部署
Linux服务器上使用nginx部署 第一步 yum install nginx在服务器上安装nginx 第二步 随便创建一个文件夹,里面放置自己的静态页面,然后将路径复制在nginx里面的配置文件nginx.conf中root下,这样就可以了。...
2024/2/28 10:12:02 - python虚拟环境 virtualenv
简介 隔离不同的python环境,如有点项目用Django1.11而有的项目用Django2.0,为了防止不断地重新在全局环境中反复安装不同版本的Django,可以采用两个虚拟环境。 这样既保证了两个环境之间的隔离,也不会污染全局环境,保证全局环境的干净 安装virtualenv模块 $ pip3 install …...
2024/2/28 10:12:01 - Spring : SpringBootConfiguration 注解
大数据-flinkflink源码专栏九师兄9.90去订阅1.美图 # 2.概述 3.源码 @Target(ElementType.TYPE) // 添加在类上的注解 @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration {}...
2024/3/28 9:21:51 - Scala中的数据类型
摘选自Spark SQL and DataFrame Guide: Data type | Value type in Scala ByteType | Byte ShortType | Short IntegerType | Int LongType | Long FloatType | Float DoubleType | Double DecimalType | …...
2024/2/28 10:11:59 - 《知识图谱》-王昊奋-读书笔记1续-OWLViz可视化显示堆叠在左上角的问题
这是第二篇读书笔记,是为了解决上一次笔记中,用protege构建本体之后的显示问题,写了本帖。如果你还没用过protege,那么请查看上一个帖子:《知识图谱》-王昊奋-读书笔记1-本体建模工具protege的使用上一次的结果:发现OWLViz显示不正常,这不是中英文的问题,我用的全部是英…...
2024/2/28 10:11:58 - C++学习笔记2——封装篇(上)
学习教程:https://www.imooc.com/learn/382 类外定义类内定义的成员函数,编译器会将其优先编译为类内函数。不会将“inline”写出来,但会以“inline”的方式优先编译,对复杂的成员函数,无法编译成内联函数的,再编译成普通的函数 类外定义:指成员函数的函数体写在类的外面…...
2024/2/28 0:49:36 - c语言求阶乘与求阶乘之和循环条件区别
刚开始学习循环结构,求阶乘是很经典的题型了,其中阶乘与阶乘之和貌似循环条件是相同的,但其实并不是如此。看以下代码: 阶乘 #include<stdio.h> int main() {int i,n,m=1;scanf("%d",&n);for(i=n;i>0;i--){m*=i;}printf("%d",m);return 0…...
2024/2/28 0:49:35 - java 三种批量插入效率比较
批量插入传统循环插入 Mybatis foreach插入 jdbc批量插入1、传统循环插入,代码如下long time = System.currentTimeMillis();for (int i = 0; i < 200000; i++) {studentMapper.batchInsert("ORDER_NO:" + i);}System.out.println("批量插入20万数据,耗费了…...
2024/2/28 0:49:35 - Mybatis基于XML基础CRUD操作
Mybatis基于XML基础CRUD操作 UserDao.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namesp…...
2024/2/27 2:07:25 - I love you
题目描述 此时相望不相闻,愿逐月华流照君。 一纸情书,到底蕴含了多少倍的爱情呢? I love you, not only for what you are, but for what I am when I am with you. 输入描述: 共一行:一封若干个字符的情书(大小写不敏感)。 情书不会超过684594个字符(大写、小写字母)。…...
2024/2/28 10:11:58 - 20200119区块链热点新闻
今日热点新闻 比特币巨鲸的交易所充提真的能影响价格吗? 用区块链实现地铁二维码跨城通行 技术分享 | 破解有关DAG的三大误解 今日推荐 | 从早期互联网的泡沫看区块链的希望 法制日报:全国首个区块链公证存证平台正式上线 总投资额激增超过前6年总和 中美竞争升级,美国欲推出…...
2024/2/28 10:11:56 - 裁人篇-西游记团队中如果需要裁掉一个人,会先裁掉谁?
2019年互联网寒冬,大批企业开始裁员,裁员不可避免,那如何才能做到不管大环境如何变化,自身不受影响呢? 我们先来看一个有意思的故事,如果西游记取经团队需要裁员一名,会裁掉谁呢,为什么?西游记团队组成: 1.唐僧 作为团队teamleader,有很坚韧的品性和极高的原则性,不…...
2024/2/28 10:11:55 - C语言刷题33:用结构体数组存储学生学号,成绩,姓名,按照分数大小顺序排序,并输出所有成绩
小憨总结:结构体按照某一项数据的大小进行排序时,需要交换的是结构体,而不是某一项 #include <stdio.h> struct Student {int num;char name[20];float score; }; int main() {struct Student stu[5] = {{101,"Mike",89.23},{102,"lucy",98.23},{…...
2024/2/28 10:11:54 - 【[kuangbin带你飞]专题1-23】-acm专题清单
...
2024/2/28 10:11:53 - 史上最强的YUV转换RenderScript,支持转换成RGBA,BGRA,并且同时支持旋转,翻转,YUV数据格式支持NV21, YV12, YUV420_888, 分别对应Android Camer
史上最强的YUV转换RenderScript,支持转换成RGBA,BGRA,并且同时支持旋转,翻转,YUV数据格式支持NV21, YV12, YUV420_888, 分别对应Android Camera1API 以及Camera2 API 的YUV处理 这段时间在做一些Android Camera数据处理的相关工作,涉及到YUV转RGBA的事情,由于对性能要求…...
2024/2/28 10:11:53 - C语言刷题33:用结构体数组存储学生学号,成绩,姓名,按照风分数顺序排序,并输出所有成绩
小憨总结:结构体按照某一项数据的大小进行排序时,需要交换的是结构体,而不是某一项 #include <stdio.h> struct Student {int num;char name[20];float score; }; int main() {struct Student stu[5] = {{101,"Mike",89.23},{102,"lucy",98.23},{…...
2024/3/7 15:47:54 - Unity2d代码翻转人物左右方向的两种方法及其适用情况
Unity2d代码翻转人物左右方向的两种方法 一 通过代码改Flip翻转(此种方法不会改变碰撞体)选择x是在x轴左右翻转(关于y轴对称翻转) SpriteRenderer spriteRenderer; spriteRenderer.flipX = true; 二通过改scale的值达到翻转的效果transform.localScale = new Vector3(-1, 1…...
2024/2/28 10:11:50 - 05-002 【Linux】目录结构介绍及远程操作工具:Xshell、Xftp、WinSCP等
1.目录结构 1.1 基本介绍 Linux的文件系统是采用级层式的树状目录结构,最上层根目录“/”然后再此目录下再创建其他目录。 在Linux的世界里,一切皆文件。1.2 具体结构(加粗的为重点)/bin(/usr/bin、/usr/local/bin)是binary的缩写,这个目录存放着最常使用的命令; /sbin…...
2024/2/28 10:11:50
最新文章
- 敏捷开发——Axios
一创建一个项目,首先要解决的是跨域问题 解决跨域问题: 1. 服务端解决 2. 设置代理 配置完 config 文件一定要重启,否则不生效 1.设置代理服务器 vue.config.js 1)用"/api" 代替目标地址"https://www.pku.edu.cn" 2…...
2024/3/28 20:28:58 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 151 shell编程,正则表达式,在C语言中如何使用正则表达式
零,坑点记录:bash 和 dash 的区别,导致的坑点 查看当前用的shell 是啥,用的是/bin/bash hunandedehunandede-virtual-machine:~$ echo $SHELL /bin/bash 当shell 脚本运行的时候(后面会学到方法,这里是最…...
2024/3/28 1:28:51 - 亚远景科技-ASPICE如何适配汽车电子电气产品特征与行业发展
随着当今汽车工业的蜕变,我们正迎来一个被誉为“软件定义汽车”的新时代。在这个时代,软件不仅是汽车的灵魂,更是其主导力量,它通过无形的代码赋予汽车各种突破性的特性与功能。昔日以硬件为重心的汽车行业,如今正在加…...
2024/3/27 15:58:17 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/3/27 10:21:24 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/3/24 20:11:25 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/3/18 12:12:47 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/3/24 20:11:23 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/3/26 20:58:42 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/3/28 17:01:12 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/3/24 5:55:47 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/3/27 10:28:22 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/3/26 23:04:51 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/3/26 11:20:25 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/3/24 20:11:18 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/3/28 9:10:53 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/3/24 20:11:16 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/3/24 20:11:15 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/3/27 7:12:50 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/3/24 20:11:13 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/3/26 11:21:23 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/3/28 18:26:34 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/3/28 12:42:28 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/3/28 20:09:10 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57