手写源码之路(六):Mybatis框架篇(5)执行篇
手写源码之路(六):Mybatis框架篇(5)执行篇
- Executor
- DataSourceFactory
- TransactionFactory
终于来到最后的重头戏了,执行方法返回结果,首先在执行之前,mybatis需要构建执行环境,包括执行器,数据源工厂,事务工厂等对象,执行器负责执行数据库的增删改查,数据源工厂负责获取与关闭数据库连接,事务负责SQL语句的提交与回滚。
Executor
/*** @author Mr.Wang* @Description: 执行器类型枚举类* @date 2019/10/10 18:13*/
public enum MyExecutorType {SIMPLE, REUSE, BATCH
}
执行器类型:1.简单执行器;2.重用执行器;3.批量执行器。
先看看它们的接口类Executor:
/*** @author Mr.Wang* @Description: 执行器* @date 2019/5/11 20:08*/
public interface MyExecutor {/*** 查询操作** @param mapperStatement* @param parameters* @param <E>* @return* @throws SQLException*/<E> List<E> query(MyMappedStatement mapperStatement, Object[] parameters) throws SQLException;/*** 查询操作(带CacheKey)** @param mapperStatement* @param parameters* @param key* @param <E>* @return* @throws SQLException*/<E> List<E> query(MyMappedStatement mapperStatement, Object[] parameters, MyCacheKey key) throws SQLException;/*** 更新操作** @param mapperStatement* @param parameters* @return* @throws SQLException*/int update(MyMappedStatement mapperStatement, Object[] parameters) throws SQLException;/*** 提交事务** @param required* @throws SQLException*/void commit(boolean required) throws SQLException;/*** 事务回滚** @param required* @throws SQLException*/void rollback(boolean required) throws SQLException;/*** 获取事务对象** @return*/MyTransaction getTransaction();/*** 创建CacheKey** @param ms* @param parameters* @return*/MyCacheKey createCacheKey(MyMappedStatement ms, Object[] parameters);/*** 是否缓存** @param ms* @param key* @return*/boolean isCached(MyMappedStatement ms, MyCacheKey key);/*** 清空缓存*/void clearLocalCache();/*** 关闭Executor对象** @param forceRollback*/void close(boolean forceRollback);/*** 检测Executor对象是否关闭** @return*/boolean isClosed();void setExecutorWrapper(MyExecutor executor);
}
DataSourceFactory
数据源工厂有三种类型:1.托管型;2.非池型;3.池型。
先看看它们的接口类DataSourceFactory:
/*** @author Mr.Wang* @Description: 数据源工厂* @date 2019/10/11 22:38*/
public interface MyDataSourceFactory {void setProperties(Properties props);DataSource getDataSource();
}
TransactionFactory
事务工厂有两种类型:1.JDBC;2.MANAGED。
先看看它们的接口类TransactionFactory:
/*** @author Mr.Wang* @Description: 事务工厂接口类* @date 2019/10/10 15:11*/
public interface MyTransactionFactory {default void setProperties(Properties props) {}MyTransaction newTransaction(Connection conn);MyTransaction newTransaction(DataSource dataSource, MyTransactionIsolationLevel level, boolean autoCommit);
}
由于数据源和事务这块相对简单,我们将着重介绍执行器的内容。首先是实现Executor接口的抽象类BaseExecutor:
/*** @author Mr.Wang* @Description: 基础执行器* @date 2019/10/10 14:57*/
public abstract class MyBaseExecutor implements MyExecutor {protected MyTransaction transaction;protected MyConfiguration configuration;protected MyExecutor wrapper;protected MyPerpetualCache localCache;private boolean closed;protected MyBaseExecutor(MyConfiguration configuration, MyTransaction transaction) {this.transaction = transaction;this.closed = false;this.configuration = configuration;this.wrapper = this;this.localCache = new MyPerpetualCache("LocalCache");}@Overridepublic <E> List<E> query(MyMappedStatement mapperStatement, Object[] parameters) throws SQLException {//创建CacheKeyMyCacheKey key = createCacheKey(mapperStatement, parameters);return query(mapperStatement, parameters, key);}@Overridepublic <E> List<E> query(MyMappedStatement mapperStatement, Object[] parameters, MyCacheKey key) throws SQLException {if (closed) {throw new RuntimeException("Executor was closed.");}//先从缓存中获取数据结果集List<E> list = (List<E>) localCache.getObject(key);if (list == null) {//缓存未命中,则查询数据库list = queryFromDatabase(mapperStatement, parameters, key);}return list;}@Overridepublic int update(MyMappedStatement mapperStatement, Object[] parameters) throws SQLException {if (closed) {throw new RuntimeException("Executor was closed.");}//执行修改操作,清空所有缓存clearLocalCache();return doUpdate(mapperStatement, parameters);}@Overridepublic void commit(boolean required) throws SQLException {if (closed) {throw new RuntimeException("Cannot commit, transaction is already closed");}if (required) {clearLocalCache();transaction.commit();}}@Overridepublic void rollback(boolean required) throws SQLException {if (!closed) {clearLocalCache();if (required) {transaction.rollback();}}}@Overridepublic MyTransaction getTransaction() {if (closed) {throw new RuntimeException("Executor was closed.");}return transaction;}@Overridepublic MyCacheKey createCacheKey(MyMappedStatement ms, Object[] parameters) {if (closed) {throw new RuntimeException("Executor was closed.");}MyCacheKey cacheKey = new MyCacheKey();cacheKey.update(ms.getNamespace());cacheKey.update(ms.getId());cacheKey.update(ms.getSql());if (parameters != null && parameters.length > 0) {for (Object value : parameters) {cacheKey.update(value);}}if (configuration.getEnvironment() != null) {cacheKey.update(configuration.getEnvironment().getId());}return cacheKey;}@Overridepublic boolean isCached(MyMappedStatement ms, MyCacheKey key) {return localCache.getObject(key) != null;}@Overridepublic void clearLocalCache() {if (!closed) {localCache.clear();}}@Overridepublic void close(boolean forceRollback) {try {try {rollback(forceRollback);} finally {if (transaction != null) {transaction.close();}}} catch (SQLException e) {throw new RuntimeException("Unexpected exception on closing transaction. Cause: " + e);} finally {transaction = null;localCache = null;closed = true;}}@Overridepublic boolean isClosed() {return closed;}@Overridepublic void setExecutorWrapper(MyExecutor wrapper) {this.wrapper = wrapper;}private <E> List<E> queryFromDatabase(MyMappedStatement ms, Object[] parameters, MyCacheKey key) throws SQLException {List<E> list;try {list = doQuery(ms, parameters);} finally {//删除缓存localCache.removeObject(key);}//将结果放入缓存localCache.putObject(key, list);return list;}protected abstract int doUpdate(MyMappedStatement ms, Object parameter)throws SQLException;protected abstract <E> List<E> doQuery(MyMappedStatement ms, Object[] parameters)throws SQLException;protected Connection getConnection() throws SQLException {Connection connection = transaction.getConnection();return connection;}protected void closeConnect(ResultSet resultSet, PreparedStatement preparedStatement, Connection connection) {if (resultSet != null) {try {resultSet.close();} catch (SQLException e) {e.printStackTrace();}}if (preparedStatement != null) {try {preparedStatement.close();} catch (SQLException e) {e.printStackTrace();}}if (connection != null) {try {transaction.close();} catch (SQLException e) {e.printStackTrace();}}}
}
可以看到,在BaseExecutor类中留有两个抽象方法,具体的实现需要子类去完成,再看看SimpleExecutor的代码:
/*** @author Mr.Wang* @Description: 简单执行器* @date 2019/8/26 19:59*/
public class MySimpleExecutor extends MyBaseExecutor {public MySimpleExecutor(MyConfiguration configuration, MyTransaction transaction) {super(configuration, transaction);}@Overrideprotected int doUpdate(MyMappedStatement mappedStatement, Object parameters) throws SQLException {Connection connection = null;PreparedStatement preparedStatement = null;int resultCount = 0;try {//获取数据库连接connection = getConnection();//实例化StatementHandler对象MyStatementHandler statementHandler = new MySimpleStatementHandler(mappedStatement);//通过StatementHandler和connection获取PreparedStatementpreparedStatement = statementHandler.prepare(connection);//实例化ParameterHandler,将SQL语句中?参数化MyParameterHandler parameterHandler = new MyDefaultParameterHandler(configuration, parameters);parameterHandler.setParameters(preparedStatement);//执行SQLresultCount = statementHandler.update(preparedStatement);} catch (SQLException e) {e.printStackTrace();} finally {closeConnect(null, preparedStatement, connection);}return resultCount;}@Overrideprotected <E> List<E> doQuery(MyMappedStatement mappedStatement, Object[] parameters) throws SQLException {List<E> resultList = new ArrayList<>();Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {//获取数据库连接connection = getConnection();//实例化StatementHandler对象MyStatementHandler statementHandler = new MySimpleStatementHandler(mappedStatement);//通过StatementHandler和connection获取PreparedStatementpreparedStatement = statementHandler.prepare(connection);//实例化ParameterHandler,将SQL语句中?参数化MyParameterHandler parameterHandler = new MyDefaultParameterHandler(configuration, parameters);parameterHandler.setParameters(preparedStatement);//执行SQL,得到结果集ResultSetresultSet = statementHandler.query(preparedStatement);//实例化ResultSetHandler,通过反射将ResultSet中结果设置到目标resultType对象中MyResultSetHandler resultSetHandler = new MyDefaultResultSetHandler(configuration, mappedStatement);//将结果集转换为返回类型resultList = resultSetHandler.handleResultSets(resultSet);} catch (Exception e) {e.printStackTrace();} finally {closeConnect(resultSet, preparedStatement, connection);}return resultList;}
}
可以看到,在做真正的数据库操作之前,还需要进行SQL语句的预处理,用到了接口类StatementHandler:
/*** @author Mr.Wang* @Description:* @date 2019/8/26 20:57*/
public interface MyStatementHandler {/*** SQL预处理** @param paramConnection* @return* @throws SQLException* @see*/PreparedStatement prepare(Connection paramConnection) throws SQLException;/*** 查询数据库** @param preparedStatement* @return* @throws SQLException* @see*/ResultSet query(PreparedStatement preparedStatement) throws SQLException;/*** update** @param preparedStatement* @throws SQLException*/int update(PreparedStatement preparedStatement) throws SQLException;
}
以及对参数的处理,用到了接口类ParameterHandler:
/*** @author Mr.Wang* @Description:* @date 2019/8/26 20:54*/
public interface MyParameterHandler {/*** 设置参数** @param paramPreparedStatement* @see*/void setParameters(PreparedStatement paramPreparedStatement);
}
StatementHandler的实现类SimpleStatementHandler:
/*** @author Mr.Wang* @Description:* @date 2019/8/26 20:58*/
public class MySimpleStatementHandler implements MyStatementHandler {private MyMappedStatement mappedStatement;public MySimpleStatementHandler(MyMappedStatement mappedStatement) {this.mappedStatement = mappedStatement;}@Overridepublic PreparedStatement prepare(Connection paramConnection) throws SQLException {String originalSql = mappedStatement.getSql();if (originalSql != null && !"".equals(originalSql)) {// 替换#{},预处理,防止SQL注入return paramConnection.prepareStatement(SqlParser.parse(originalSql));} else {throw new SQLException("original sql is null.");}}@Overridepublic ResultSet query(PreparedStatement preparedStatement) throws SQLException {return preparedStatement.executeQuery();}@Overridepublic int update(PreparedStatement preparedStatement) throws SQLException {return preparedStatement.executeUpdate();}
}
ParameterHandler的实现类DefaultParameterHandler:
/*** @author Mr.Wang* @Description:* @date 2019/8/26 20:55*/
public class MyDefaultParameterHandler implements MyParameterHandler {private MyTypeHandlerRegistry typeHandlerRegistry;private Object parameterObject;public MyDefaultParameterHandler(MyConfiguration configuration, Object parameterObject) {this.typeHandlerRegistry = configuration.getTypeHandlerRegistry();this.parameterObject = parameterObject;}/*** 将SQL参数设置到PreparedStatement中** @param paramPreparedStatement*/@Overridepublic void setParameters(PreparedStatement paramPreparedStatement) {if (parameterObject != null) {if (parameterObject.getClass().isArray()) {Object[] params = (Object[]) parameterObject;Class<?> javaType = null;MyJdbcType jdbcType = null;for (int i = 0; i < params.length; i++) {if (params[i] instanceof Integer) {javaType = Integer.class;jdbcType = MyJdbcType.INTEGER;} else if (params[i] instanceof String) {javaType = String.class;jdbcType = MyJdbcType.VARCHAR;} else {javaType = Object.class;jdbcType = MyJdbcType.OTHER;}//根据JavaType获取对应的类型转换器MyTypeHandler typeHandler = typeHandlerRegistry.getTypeHandler(javaType);try {typeHandler.setParameter(paramPreparedStatement, i + 1, params[i], jdbcType);} catch (SQLException e) {throw new RuntimeException("Could not set parameters for mapping: " + parameterObject + ". Cause: " + e, e);}}}}}
}
在数据库操作完成之后,针对查询方法返回的结果需要用到结果集转换器进行处理,ResultSetHandler接口类:
/*** @author Mr.Wang* @Description: 结果集转换器* @date 2019/8/26 20:45*/
public interface MyResultSetHandler {/*** 处理查询结果** @param resultSet* @return* @see*/<E> List<E> handleResultSets(ResultSet resultSet);
}
DefaultResultSetHandler类是ResultSetHandler类的默认实现:
/*** @author Mr.Wang* @Description:* @date 2019/8/26 20:46*/
public class MyDefaultResultSetHandler implements MyResultSetHandler {private final MyMappedStatement mappedStatement;private MyTypeHandlerRegistry typeHandlerRegistry;public MyDefaultResultSetHandler(MyConfiguration configuration, MyMappedStatement mappedStatement) {this.mappedStatement = mappedStatement;this.typeHandlerRegistry = configuration.getTypeHandlerRegistry();}@Overridepublic <E> List<E> handleResultSets(ResultSet resultSet) {List<E> resultList = new ArrayList<>();if (resultSet == null) {return null;}try {Class<E> tClass = (Class<E>) Class.forName(mappedStatement.getResultType());while (resultSet.next()) {Object entity = tClass.newInstance();setProToBeanFromResult(entity, resultSet);resultList.add((E) entity);}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}return resultList;}private void setProToBeanFromResult(Object entity, ResultSet resultSet) throws SQLException {ResultSetMetaData resultSetMetaData = resultSet.getMetaData();int count = resultSetMetaData.getColumnCount();Field[] declaredFields = entity.getClass().getDeclaredFields();Class<?> javaType = null;for (int i = 0; i < count; i++) {String columnName = resultSetMetaData.getColumnName(i + 1).replace("_", "").toUpperCase();for (int j = 0; j < declaredFields.length; j++) {String fieldName = declaredFields[j].getName().toUpperCase();if (columnName.equalsIgnoreCase(fieldName)) {javaType = null;if ("Integer".equals(declaredFields[j].getType().getSimpleName())) {javaType = Integer.class;} else if ("String".equals(declaredFields[j].getType().getSimpleName())) {javaType = String.class;} else {javaType = Object.class;}//根据JavaType获取对应的类型转换器MyTypeHandler typeHandler = typeHandlerRegistry.getTypeHandler(javaType);Object value = typeHandler.getResult(resultSet, resultSetMetaData.getColumnName(i + 1));ReflectionUtil.setProToBean(entity, declaredFields[j].getName(), value);break;}}}}
}
使用反射原理将ResultSet转换成bean对象,到这里,mybatis的执行流程就大致介绍完了,还有些内容没有介绍到,比如类型转换器和缓存的内容,会放在最后一篇介绍。
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 分布式电商项目二十九:商品服务的后台页面分组
renren-fast-vue前端代码.zip之后对该页面功能的实现,只编写后端部分,按照给出的接口文档进行编写。前端资源直接下载放入renren-fast-vue中即可立即下载商品服务的后台页面分组 之后对该页面功能的实现,只编写后端部分,按照给出的接口文档进行编写。前端资源直接下载放入r…...
2024/5/3 2:50:03 - AN OPTIMIZATION VIEW ON DYNAMIC ROUTING BETWEEN CAPSULES 翻译
说实话,这篇文章没有怎么看懂,不过知道这篇文章对2017年所提出的胶囊网络的路由协议进行了细致的讲解,同时该作者提出了一种改进的路由协议。具体的看论文。摘要尽管最近在(Sabour et al。,2017)中提出了动态路由程序的有效性,但我们仍然缺乏启发式方法及其含义的标准形…...
2024/4/27 23:47:28 - ps快速抠头发-庞姿姿
今天分享的是ps快速抠头发。ps操作过程中抠图必不可少,而且抠图对象不同使用的方法也不同,相比较头发丝算是比较难操作的一种了,有粉丝私信问我ps快速抠头发,下面就来分享一下方法。跟着我操作一遍吧~首先现在需要去除的区域。在工具栏「快速选择工具」快捷键(W) 在主菜单…...
2024/4/16 5:59:56 - Two Sum(C++两数之和)
解题思路:(1)使用组合,可惜耗时比较久,笑哭class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> v={0,0};combination(v, nums, target, 0, 0, 2);return v;}int combination(vector<int> &v, vect…...
2024/5/7 7:41:22 - C#.水仙花数
static void Main(string[] args){//水仙花数,百位的立方+十位的立方+个位的立方=原数//判断100-999之间的水仙花数for (int i = 100; i <= 999; i++){int iHundred = i / 100;int iTen = i / 10 % 10;int iUnit = i % 10;if (iHundred * iHundred * iHundred + iTen * iTe…...
2024/4/24 10:43:24 - php策略模式
<?php //策略模式interface Love{function love_me();}class Tiger implements Love{function love_me(){echo 给老娘过来;}}class Cuter implements Love{function love_me(){echo 讨厌死了,不理你了;}}class GirlFrend{private $nature;function __construct($nature){$…...
2024/4/24 10:43:23 - Pandas工具包实战(8)pivot数据透视表:series, dataframe
数据透视表 import pandas as pdexample = pd.DataFrame({Month: ["January", "January", "January", "January", "February", "February",...
2024/5/5 1:51:47 - 侵入对方系统的N种姿势
文章目录一、Web漏洞二、反序列化漏洞三、未授权访问漏洞本文章是对获取网站控制权,操控对方电脑的所有方式的总结、仅供参考学习研究,未授权攻击别人的计算机系统都是违法行为!望君自重!!! 由于工作和精力问题,操作方法会定期持续更新,还望各位读者理解 😉一、Web漏…...
2024/5/6 6:33:48 - 阿里云服务器 ECS通用型规格族g6特点
阿里云服务器 ECS通用型实例规格族g6特点阿里云服务器 ECS通用型实例规格族g6的特点如下:依托神龙架构,将大量虚拟化功能卸载到专用硬件,降低虚拟化开销,提供稳定可预期的超高性能I/O优化实例支持ESSD云盘、SSD云盘和高效云盘说明 不同实例规格族的云盘性能上限不同,单台g…...
2024/4/24 10:43:20 - 算法工程师的数学基础|线性代数中的向量内积和外积概念及几何意义
线性代数主要包含向量、向量空间(或称线性空间)以及向量的线性变换和有限维的线性方程组。本篇文章主要介绍线性代数部分中的向量和向量空间。本篇内容主要是对线性代数中向量点积和外积补充,同时说明一下向量的四则运算,如果对向量和向量空间相关含义有所遗忘的话可以回顾:…...
2024/4/24 10:43:17 - 物品服装道具租赁微信小程序
最近给客户开发了一款服装道具租赁小程序相信不少喜欢打扮自己的男生女生都有经常网购的习惯,但是,不知不觉中,我们也感觉这种方式缺乏新奇感,相信很大一部分人都有这个心理,那么,我们何不尝试一下租赁呢?以下是小编为您整理的服装租赁的市场前景分析的相关内容。人群量…...
2024/4/24 10:43:18 - Re 库的match对象
match的类型 import re match = re.search(r[1-9]\d{5},BIT126095) if match:print(match.group(0)) type(match)#返回match的类型import re m = re.search(r[1-9]\d{5},BIT126095) m.string #待匹配的字符串 m.re#所使用的正则表达式 m.pos #搜索位置的开始位置 m.endpos#搜索…...
2024/4/24 10:43:21 - spring cloud feign 使用
一、什么是FeignFeign是一个声明式的web service客户端,它的出现使开发web service客户端变得简单、方便。使用Feign开发只需要在对应的接口加上注解即可,比如:FeignClient注解。Feign支持编码器与解码器,spring cloud open Feign 对Feign进行增强支持spring MVC注解,可以…...
2024/5/6 2:14:37 - 交叉编译Python-3.8.3
1. 源码下载wget https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tar.xzxz-d Python-3.8.3.tar.xzcd Python-3.8.3.tar.xz2. 如果PC上预先没有python3.8的版本,则需要编译3.8的PC版本。执行:mkdir build.pc; cd build.pc; ../configure --enable-optimizations; make…...
2024/4/24 10:43:15 - Error:Internal error: (java.lang.IllegalArgumentException) Argument for
@[TOC](记一次强制关机之后idea导致项目不能启动(Error:Internal error: (java.lang.IllegalArgumentException) Argument for ) 我的错误发生的原因是因为今天我的电脑太卡了,所以强制重启,话不多说直接上错误信息 Error:Internal error: (java.lang.IllegalArgumentExcept…...
2024/4/27 12:19:05 - EduSoho 升级8.7.0 出错错误无法访问情况二 数据库错误
EduSoho 升级8.7.0 出错错误无法访问情况二 数据库错误 错误如图 执行升级/安装脚本时发生了错误:An exception occurred while executing ’ INSERT INTO biz_answer_question_report (id, identify, answer_record_id, assessment_id, section_id, item_id, question_id, sc…...
2024/4/24 10:43:10 - No HttpMessageConverter for com.ysd.entity.Users
在实体类加一个Data注解...
2024/4/27 5:41:21 - windows 下配置 apache2.4+tomcat8.0
打开conf/httpd.conf文件,加载以下模块。#---------------------start---------------------- LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_ajp_module modules/mod_proxy_ajp.so LoadModule rewrite_module modules/mod_rewrite.so LoadModule proxy_bal…...
2024/5/8 6:12:12 - verilog 音乐演奏
verilog 音乐演奏.zip下载直接可用,还有大量乐谱在其中,可自行选择。 立即下载直接上代码,最后 的0开始为乐谱module beep_music (clk, rst_n, beep);input clk;input rst_n;output beep;reg beep;//------------时钟分频计数值--…...
2024/5/8 0:31:04 - supermap 超图 vue webpack npm leaflet.markercluster
supermap 超图 vue webpack npm leaflet.markercluster安装使用引入使用 超图图层聚合使用的是第三方插件leaflet.markercluster,使用时需要先安装 安装 leaflet.markercluster安装说明 npm i leaflet.markercluster 安装后的目录结构:使用 引入 在对应的vue文件中引入leafle…...
2024/5/8 7:04:56
最新文章
- 【busybox记录】【shell指令】ptx
目录 内容来源: 【GUN】【ptx】指令介绍 【busybox】【ptx】指令介绍 【linux】【ptx】指令介绍 使用示例: 常用组合指令: 指令不常用/组合用法还需继续挖掘: 内容来源: GUN : Coreutils - GNU core…...
2024/5/8 11:49:35 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/5/7 10:36:02 - Stable Diffusion 本地部署教程
Stable Diffusion 是一个开源的本地部署的软件,用于在本地网络中进行消息传递和同步。下面是 Stable Diffusion 的本地部署教程: 安装稳定扩散软件:首先,您需要从 Stable Diffusion 的官方网站或 GitHub 页面上下载并安装 Stable …...
2024/5/2 9:10:34 - 数据结构——二叉树——二叉搜索树(Binary Search Tree, BST)
目录 一、98. 验证二叉搜索树 二、96. 不同的二叉搜索树 三、538. 把二叉搜索树转换为累加树 二叉搜索树:对于二叉搜索树中的每个结点,其左子结点的值小于该结点的值,而右子结点的值大于该结点的值 一、98. 验证二叉搜索树 给你一个二叉树的…...
2024/5/7 2:59:11 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/8 6:01:22 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/7 9:45:25 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/5/4 23:54:56 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/7 14:25:14 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/5/4 23:54:56 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/5/4 23:55:05 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/5/4 23:54:56 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/5/7 11:36:39 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/5/4 23:54:56 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/6 1:40:42 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/5/4 23:54:56 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/5/4 23:55:17 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/5/7 9:26:26 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/5/4 23:54:56 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/4 23:55:06 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/5/5 8:13:33 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/5/4 23:55:16 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/5/4 23:54:58 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/6 21:42:42 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/5/4 23:54:56 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下: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