概述

结果值的处理相当于参数的处理会复杂一些,负责结果值转换的类是 ResultSetHandler

public interface ResultSetHandler {/*** 处理数据集并返回* @param stmt* @param <E>* @return* @throws SQLException*/<E> List<E> handleResultSets(Statement stmt) throws SQLException;<E> Cursor<E> handleCursorResultSets(Statement stmt) throws SQLException;void handleOutputParameters(CallableStatement cs) throws SQLException;}

这里将存储过程、游标相关的忽略,我们只看普通的处理就行。

相当于就一个方法handleResultSets,处理ResultSet转换结果值。

ResultSetHandler只有一个实现类,即DefaultResultSetHandler。

但在解析结果值的时候还依赖一些其他的类。

在这里插入图片描述

ResultSetWrapper:ResultSet包装器,丰富ResultSet方法,包含了ResultSet相关元数据

ResultContext:结果值上下文,存储值结果值、总数等。

ResultHandler:结果处理器。做处理完的类型转换的结果,进行后置处理。

ResultSetWrapper

public class ResultSetWrapper {/*** 数据集*/private final ResultSet resultSet;private final TypeHandlerRegistry typeHandlerRegistry;/*** 字段名集合*/private final List<String> columnNames = new ArrayList<>();/*** 字段对应的javaType类型名*/private final List<String> classNames = new ArrayList<>();/*** jdbcType*/private final List<JdbcType> jdbcTypes = new ArrayList<>();// 类型处理器private final Map<String, Map<Class<?>, TypeHandler<?>>> typeHandlerMap = new HashMap<>();/*** 针对当前ResultSet中,resultMap中映射的字段名* key: resultMapId* value:resultMap映射字段*/private final Map<String, List<String>> mappedColumnNamesMap = new HashMap<>();/*** 针对当前ResultSet中,resultMap中未映射的字段名* key: resultMapId* value:resultMap未映射字段*/private final Map<String, List<String>> unMappedColumnNamesMap = new HashMap<>();public ResultSetWrapper(ResultSet rs, Configuration configuration) throws SQLException {super();this.typeHandlerRegistry = configuration.getTypeHandlerRegistry();this.resultSet = rs;// 从ResultSet中获取元数据final ResultSetMetaData metaData = rs.getMetaData();// 总列数final int columnCount = metaData.getColumnCount();for (int i = 1; i <= columnCount; i++) {// columnLabel代表as的值,columnName代表原名// 默认取columnLabel的值columnNames.add(configuration.isUseColumnLabel() ? metaData.getColumnLabel(i) : metaData.getColumnName(i));// 每个字段对应的jdbc类型jdbcTypes.add(JdbcType.forCode(metaData.getColumnType(i)));// 每个字段对应的java类型classNames.add(metaData.getColumnClassName(i));}}
}

ResultSetWrapper包装了ResultSet,通过ResultSetMetaData(JDBC)获取列信息。结合ResultMap进行列相关方法的提供。

看下ResultSetWrapper提供的所有方法:

在这里插入图片描述

基本是针对自身属性提供的get方法,了解了各个属性的意义之后,方法的作用也就比较清楚了。

ResultContext

public interface ResultContext<T> {T getResultObject();int getResultCount();boolean isStopped();void stop();}

结果的载体,实现类 DefaultResultContext

DefaultResultContext

public class DefaultResultContext<T> implements ResultContext<T> {/*** 结果值*/private T resultObject;/*** 累计的结果数量*/private int resultCount;/*** 是否停止*/private boolean stopped;public DefaultResultContext() {resultObject = null;resultCount = 0;stopped = false;}@Overridepublic T getResultObject() {return resultObject;}@Overridepublic int getResultCount() {return resultCount;}@Overridepublic boolean isStopped() {return stopped;}public void nextResultObject(T resultObject) {resultCount++;this.resultObject = resultObject;}@Overridepublic void stop() {this.stopped = true;}}

so easy。

ResultHandler

public interface ResultHandler<T> {void handleResult(ResultContext<? extends T> resultContext);}

传入ResultContext,进行结果后置处理

DefaultResultHandler

public class DefaultResultHandler implements ResultHandler<Object> {private final List<Object> list;public DefaultResultHandler() {list = new ArrayList<>();}@SuppressWarnings("unchecked")public DefaultResultHandler(ObjectFactory objectFactory) {list = objectFactory.create(List.class);}@Overridepublic void handleResult(ResultContext<?> context) {// 就仅当结果存储list.add(context.getResultObject());}public List<Object> getResultList() {return list;}}

主要就是将结果存储到list中。

DefaultMapResultHandler

主要是MapKey注解的实现。这里科普下@MapKey的作用,就是将mapper的返回值转换成Map类型。@MapKey 就是指定返回map的key。

public class DefaultMapResultHandler<K, V> implements ResultHandler<V> {/*** 对应的map结果* key:mapKey对应的值* value:原结果*/private final Map<K, V> mappedResults;private final String mapKey;private final ObjectFactory objectFactory;private final ObjectWrapperFactory objectWrapperFactory;private final ReflectorFactory reflectorFactory;@SuppressWarnings("unchecked")public DefaultMapResultHandler(String mapKey, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) {this.objectFactory = objectFactory;this.objectWrapperFactory = objectWrapperFactory;this.reflectorFactory = reflectorFactory;this.mappedResults = objectFactory.create(Map.class);this.mapKey = mapKey;}@Overridepublic void handleResult(ResultContext<? extends V> context) {final V value = context.getResultObject();// 创建MetaObject实例final MetaObject mo = MetaObject.forObject(value, objectFactory, objectWrapperFactory, reflectorFactory);// 取出key值final K key = (K) mo.getValue(mapKey);// 构造map值mappedResults.put(key, value);}public Map<K, V> getMappedResults() {return mappedResults;}

ResultSetHandler

主人公出现,铺垫了相关类之后,开始分析ResultSetHandler。

public interface ResultSetHandler {/*** 处理数据集并返回* @param stmt* @param <E>* @return* @throws SQLException*/<E> List<E> handleResultSets(Statement stmt) throws SQLException;// 游标忽略<E> Cursor<E> handleCursorResultSets(Statement stmt) throws SQLException;// 存储过程忽略void handleOutputParameters(CallableStatement cs) throws SQLException;}

ResultSetHandler就只有一个实现类 DefaultResultSetHandler

DefaultResultSetHandler

先看下DefaultResultSetHandler的属性和构造方法

public class DefaultResultSetHandler implements ResultSetHandler {private static final Object DEFERRED = new Object();// 执行器private final Executor executor;// 配置private final Configuration configuration;// 映射Statementprivate final MappedStatement mappedStatement;// 分页参数private final RowBounds rowBounds;// 参数处理器private final ParameterHandler parameterHandler;// 结果处理器private final ResultHandler<?> resultHandler;// 动态sql载体private final BoundSql boundSql;// 类型处理器容器private final TypeHandlerRegistry typeHandlerRegistry;// 对象工厂private final ObjectFactory objectFactory;// 反射器工厂private final ReflectorFactory reflectorFactory;// 嵌套结果private final Map<CacheKey, Object> nestedResultObjects = new HashMap<>();// 未知,忽略private final Map<String, Object> ancestorObjects = new HashMap<>();// 上一条行值private Object previousRowValue;// multiple resultsetsprivate final Map<String, ResultMapping> nextResultMaps = new HashMap<>();private final Map<CacheKey, List<PendingRelation>> pendingRelations = new HashMap<>();// Cached Automappingsprivate final Map<String, List<UnMappedColumnAutoMapping>> autoMappingsCache = new HashMap<>();// temporary marking flag that indicate using constructor mapping (use field to reduce memory usage)private boolean useConstructorMappings;// 构造函数public DefaultResultSetHandler(Executor executor, MappedStatement mappedStatement, ParameterHandler parameterHandler, ResultHandler<?> resultHandler, BoundSql boundSql,RowBounds rowBounds) {this.executor = executor;this.configuration = mappedStatement.getConfiguration();this.mappedStatement = mappedStatement;this.rowBounds = rowBounds;this.parameterHandler = parameterHandler;this.boundSql = boundSql;this.typeHandlerRegistry = configuration.getTypeHandlerRegistry();this.objectFactory = configuration.getObjectFactory();this.reflectorFactory = configuration.getReflectorFactory();this.resultHandler = resultHandler;}

这里实例化的入口是BaseStatementHandler的构造函数

protected BaseStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {...this.parameterHandler = configuration.newParameterHandler(mappedStatement, parameterObject, boundSql);this.resultSetHandler = configuration.newResultSetHandler(executor, mappedStatement, rowBounds, parameterHandler, resultHandler, boundSql);
}

虽然参数比较多,但还算清楚。

DefaultResultSetHandler也就仅需要实现 handleResultSets这么一个方法。

我觉得分析源码比较好的方式是,先设想它的实现原理,然后再通过代码求证,这样提前有了自己的思考,在看源码时就可以挑重点的看,不至于被庞大的分支绕晕了。

那我们这里先想想结果值的处理会是怎么样的过程,

给到你一个ResultSet,怎么转换成目标类型?

  1. 遍历ResultSet行(一行一行处理,保存到List中一起返回)。
  2. 创建目标类型实例(构造函数反射)。
  3. 遍历ResultSet中的列,根据列的jdbc类型找到TypeHandler
  4. 通过TypeHandler和列的值转换成javaType。
  5. 将转换后的列值反射设置值到目标的属性中。

构思下大概流程,接着通过代码佐证。

handleResultSets

@Override
public List<Object> handleResultSets(Statement stmt) throws SQLException {ErrorContext.instance().activity("handling results").object(mappedStatement.getId());final List<Object> multipleResults = new ArrayList<>();int resultSetCount = 0;/** 获取第一个结果集,包装了一下* 基本上只有一个结果集,存储过程才可能有多个*/ResultSetWrapper rsw = getFirstResultSet(stmt);/**  获取结果映射map,这里虽然是list,但是我们日常几乎都是单ResultMap*/List<ResultMap> resultMaps = mappedStatement.getResultMaps();int resultMapCount = resultMaps.size();validateResultMapsCount(rsw, resultMapCount);/** 遍历resultMaps,从0开始,也就是按照resultMap中定义的字段顺序来处理**/while (rsw != null && resultMapCount > resultSetCount) {//每个数据集一个ResultMapResultMap resultMap = resultMaps.get(resultSetCount);// 真正开始处理转换handleResultSet(rsw, resultMap, multipleResults, null);// 获取下一个数据集rsw = getNextResultSet(stmt);cleanUpAfterHandlingResultSet();//索引累加resultSetCount++;}// 存储过程相关代码忽略.../** 如果是单数据集,就将其展开返回* multipleResults的结构是List<List<Object>>* 这种结构是为了支持多数据集,存储过程可能返回多个数据集。*/return collapseSingleResultList(multipleResults);
}

这里mybatis对存储过程和普通sql进行了通用的处理,体现在存储过程有多ResultSet、ResultMap,我们在分析的时候只关注与List的第一个元素即可。

handleResultSet

处理单个ResultSet。

private void handleResultSet(ResultSetWrapper rsw, ResultMap resultMap, List<Object> multipleResults, ResultMapping parentMapping) throws SQLException {try {// 普通sql无父Mappingif (parentMapping != null) {handleRowValues(rsw, resultMap, null, RowBounds.DEFAULT, parentMapping);} else {// 一般使用时 不会主动指定ResultHandlerif (resultHandler == null) {/** 处理数据,并将结果存储在ResultHandler上* 最终转嫁到multipleResults上,向上透出*/DefaultResultHandler defaultResultHandler = new DefaultResultHandler(objectFactory);// 处理行值handleRowValues(rsw, resultMap, defaultResultHandler, rowBounds, null);// 将处理好的结果设置到multipleResultsmultipleResults.add(defaultResultHandler.getResultList());} else {handleRowValues(rsw, resultMap, resultHandler, rowBounds, null);}}} finally {// issue #228 (close resultsets)closeResultSet(rsw.getResultSet());}
}

如果mapper方法中没有直接执行ResultHandler,那么创建默认的ResultHandler做结果收集。

handleRowValues

public void handleRowValues(ResultSetWrapper rsw, ResultMap resultMap, ResultHandler<?> resultHandler, RowBounds rowBounds, ResultMapping parentMapping) throws SQLException {//判断是否有嵌套ResultMapif (resultMap.hasNestedResultMaps()) {ensureNoRowBounds();checkResultHandler();handleRowValuesForNestedResultMap(rsw, resultMap, resultHandler, rowBounds, parentMapping);}// 普通ResultMap解析else {handleRowValuesForSimpleResultMap(rsw, resultMap, resultHandler, rowBounds, parentMapping);}
}

进入到简单ResultMap解析

handleRowValuesForSimpleResultMap

private void handleRowValuesForSimpleResultMap(ResultSetWrapper rsw, ResultMap resultMap, ResultHandler<?> resultHandler, RowBounds rowBounds, ResultMapping parentMapping)throws SQLException {DefaultResultContext<Object> resultContext = new DefaultResultContext<>();ResultSet resultSet = rsw.getResultSet();/** 根据分页参数的offset 跳过指定的行,ROwBounds是伪分页*/skipRows(resultSet, rowBounds);/** 遍历每一行数据*/while (shouldProcessMoreRows(resultContext, rowBounds) && !resultSet.isClosed() && resultSet.next()) {//获取鉴别器ResultMap? 鉴别器使用很少,忽略ResultMap discriminatedResultMap = resolveDiscriminatedResultMap(resultSet, resultMap, null);//获取一行的记录Object rowValue = getRowValue(rsw, discriminatedResultMap, null);//将结果(rowValue)存储在resultHandler上storeObject(resultHandler, resultContext, rowValue, parentMapping, resultSet);}
}

这里 getRowValue 返回解析好的单行值,已经将单行转换成javaBean的实例了。

storeObject方法针对返回的行值进行ResultHandler处理。(默认ResultHandler就是存储起来)

继续跟进行值解析

getRowValue

private Object getRowValue(ResultSetWrapper rsw, ResultMap resultMap, String columnPrefix) throws SQLException {final ResultLoaderMap lazyLoader = new ResultLoaderMap();// 创建javaBean对应的实例,就是ResultMap上对应的javaType类型Object rowValue = createResultObject(rsw, resultMap, lazyLoader, columnPrefix);// 如果结果无直接的类型处理器,则进行字段映射if (rowValue != null && !hasTypeHandlerForResultObject(rsw, resultMap.getType())) {final MetaObject metaObject = configuration.newMetaObject(rowValue);// 自动映射默认不开启,官方也不推荐使用,忽略boolean foundValues = this.useConstructorMappings;if (shouldApplyAutomaticMappings(resultMap, false)) {foundValues = applyAutomaticMappings(rsw, resultMap, metaObject, columnPrefix) || foundValues;}// 通过MetaObject,进行属性值反射设置foundValues = applyPropertyMappings(rsw, resultMap, metaObject, lazyLoader, columnPrefix) || foundValues;foundValues = lazyLoader.size() > 0 || foundValues;rowValue = foundValues || configuration.isReturnInstanceForEmptyRow() ? rowValue : null;}return rowValue;
}

createResultObject方法,创建对应javaBean实例,如果用户指定了其类型处理器,那么会交由其处理,如果未指定则需要进行属性映射。

这里createResultObject的实现就不跟了,我们清楚只是创建一个空属性的实例即可。

看下属性映射,MetaObject之前反射包解析过,可以像操作map一样操作普通类。

applyPropertyMappings

private boolean applyPropertyMappings(ResultSetWrapper rsw, ResultMap resultMap, MetaObject metaObject, ResultLoaderMap lazyLoader, String columnPrefix)throws SQLException {//获取所有映射的字段名(即resultMap中主动写了映射的字段)final List<String> mappedColumnNames = rsw.getMappedColumnNames(resultMap, columnPrefix);boolean foundValues = false;//获得所有属性映射final List<ResultMapping> propertyMappings = resultMap.getPropertyResultMappings();//遍历属性映射,挨个字段映射for (ResultMapping propertyMapping : propertyMappings) {String column = prependPrefix(propertyMapping.getColumn(), columnPrefix);if (propertyMapping.getNestedResultMapId() != null) {// the user added a column attribute to a nested result map, ignore itcolumn = null;}if (propertyMapping.isCompositeResult()|| (column != null && mappedColumnNames.contains(column.toUpperCase(Locale.ENGLISH)))|| propertyMapping.getResultSet() != null) {/** 属性值* 根据字段名从ResultSet中获取值,由typeHandler进行转换*/Object value = getPropertyMappingValue(rsw.getResultSet(), metaObject, propertyMapping, lazyLoader, columnPrefix);// issue #541 make property optional// 属性名final String property = propertyMapping.getProperty();if (property == null) {continue;} else if (value == DEFERRED) {foundValues = true;continue;}if (value != null) {foundValues = true;}if (value != null || (configuration.isCallSettersOnNulls() && !metaObject.getSetterType(property).isPrimitive())) {// gcode issue #377, call setter on nulls (value is not 'found')// 使用反射工具类,给属性赋值metaObject.setValue(property, value);}}}return foundValues;
}
  1. 遍历ResultMapping。
  2. 属性值获取
  3. 反射设置

中间一些嵌套查询、延迟加载的可以忽略。

getPropertyMappingValue

private Object getPropertyMappingValue(ResultSet rs, MetaObject metaResultObject, ResultMapping propertyMapping, ResultLoaderMap lazyLoader, String columnPrefix)throws SQLException {// 嵌套,忽略if (propertyMapping.getNestedQueryId() != null) {return getNestedQueryMappingValue(rs, metaResultObject, propertyMapping, lazyLoader, columnPrefix);} // 多数据集,忽略else if (propertyMapping.getResultSet() != null) {addPendingChildRelation(rs, metaResultObject, propertyMapping);   // TODO is that OK?return DEFERRED;}// 正常情况else {final TypeHandler<?> typeHandler = propertyMapping.getTypeHandler();final String column = prependPrefix(propertyMapping.getColumn(), columnPrefix);// 由类型处理器进行值获取、转换return typeHandler.getResult(rs, column);}
}

到这里结果值的处理已经结束,和之前设想的流程一对,几乎是一致的。

只是在分支上增加了对嵌套查询、存储过程等进行了处理。

总结

在对结果值的处理时,其实大体流程不复杂,但是mybatis考虑的点比较多,做了一个通用处理,我们抓住核心,就会发现和我们想的一样简单。


That’s All

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 116.(124)二叉树中的最大路径和

    题目描述:给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。示例 1:输入: [1,2,3]1/ \2 3输出: 6示例 2:输入: [-10,9,20,null,null,15,7]-10/ \9 20/ \15 7输出:…...

    2024/5/1 21:26:16
  2. Thinkphp6搭建的基础RABC权限系统,适用所有场景

    JrkAdmin(TP6.0.3版本) —— 你值得信赖的后端开发框架 如果对您有帮助,您可以点右上角 "Star" 支持一下 谢谢!项目介绍 JrkAdmin_Tp6(基础版)是ThinkPHP6.0和layui的快速开发的后台管理系统。 后台采用RABC权限验证,不懂的同学可以查看相关文档 实现管理员管…...

    2024/4/27 6:54:40
  3. Okhttp在4.x手机上报java.lang.ExceptionInInitializerError错

    今天收到运营部提的一个bug 用户下载完app打开就闪退了,用户的手机设备机型【红米 HM NOTE 1S】【系统版本Android 4.4.4】。 错误详细日志如下:根据错误信息看应该是版本问题,查看okhttp文档我项目里面用的是 implementation com.squareup.okhttp3:okhttp:3.13.1根据上面可…...

    2024/4/17 20:55:51
  4. c++继承(八)——虚拟菱形继承(详解)

    上一篇我们提到菱形继承有数据冗余和二义性的问题。我们看下面的代码 class fruit { public:string _name; };class apple :public fruit { protected:int _appleMoney; };class banana :public fruit { protected:int _bananaMoney; };class store :public apple, public bana…...

    2024/4/16 5:34:52
  5. 【文件管理系统】选择与部署

    1.功能1.可以上传和下载文件,并且记录上传的记录、下载记录、修改记录。 2.支持在线预览文件。 3.支持在线编译文件。 4.支持文件/文件夹的复制、删除、重命名、移动、创建等操作。2.方案 通过这个链接看到几个开源方案选择 链接 2.1 onlyoffice 线上实例1.开源的在线文档编辑…...

    2024/4/22 9:46:29
  6. C语言 数组指针,指针数组

    目录作业作业1 不同维数数组和指针数组的传参作业2 单链表复习课堂笔记1.位运算 & | ^ >> << ~2.编译预处理3. 编码规范4.指针5.数组 作业 作业1 不同维数数组和指针数组的传参1 #include <stdio.h>2 3 void print1(char *ptr)4 {5 prin…...

    2024/4/19 13:44:41
  7. Java集合框架-概述

    Java 集合框架 学习目标会使用集合存储数据 遍历集合,取出数据 掌握每种集合的特性学习方法学习顶层!通过顶层接口/抽象类的共性方法,所有子类都可以使用 使用底层!顶层无法创建对象,需要使用具体的实现类创建对象框架图第一章 Collction集合 一种工具,放在java.util包中…...

    2024/4/21 5:44:35
  8. EL&JSTL学习笔记

    主要内容JSP:指令 注释 内置对象MVC开发模式 EL表达式 JSTL标签 三层架构附录:思维导图 JSP指令作用:用于配置JSP页面,导入资源文件 格式: <%@ 指令名称 属性名1=属性值1 属性名2=属性值2 … %><%@ page language="java" contentType="text/html; …...

    2024/4/20 8:40:02
  9. 蓝桥杯单片机——独立按键、矩阵按键

    蓝桥杯单片机硬件基础独立按键 跳线帽需要短接J5口的3和2引脚,按键能使用的仅有第一列(即上图中S4、S5、S6、S7)。当按键按下时,相应的P30-33口输入为低电平,由此编写独立按键扫描函数。 矩阵按键 跳线帽需要短接J5口的1和2引脚,按键能使用16个(即上图中S4-S19)。矩阵按…...

    2024/4/16 5:33:51
  10. Java编码规范总结

    Java编码规范一、编码规范概述二、文件体系结构规则1、文件体系规则(1)java文件目录结构<模块分类目录>action:存放action(控制层\controller)、dao:存放dao(数据层)、form:存放展示层文件、service:存放业务逻辑文件、vo:存放数据对象文件Model:model是数据模…...

    2024/4/16 5:36:08
  11. Vue通信、传值的多种方式

    一、通过路由带参数进行传值①两个组件 A和B,A组件通过query把orderId传递给B组件(触发事件可以是点击事件、钩子函数等)this.$router.push({ path: /conponentsB, query: { orderId: 123 } }) // 跳转到B②在B组件中获取A组件传递过来的参数this.$route.query.orderId 二、通…...

    2024/4/30 21:35:27
  12. 模拟简单的哈希表

    import java.util.Scanner;public class Demo {public static void main(String[] args) {HashTab hashTab = new HashTab(7);Scanner scanner = new Scanner(System.in);String key="";while (true){System.out.println("add 添加");System.out.println(&…...

    2024/4/17 23:23:41
  13. spark 使用

    安装 anaconda 虚拟环境比如:py37 source activate sudo conda install package进入spark的安装目录下,有一个spark-env.sh文件,例如:/opt/spark/spark-2.1.1-bin-hadoop2.7/conf/spark-env.sh,在环境变量中增加PYSPARK_PYTHON,例如添加:export PYSPARK_PYTHON=/home/q/…...

    2024/4/16 5:36:54
  14. 三、JUC提升——java的CAS原理解析含ABA问题解决

    CAS--Compare And SwapCompare And Swap(比较并替换)一、作用二、定义:1、什么是CAS机制2、CAS图解3、ABA问题 Compare And Swap(比较并替换) 一、作用 我们的CAS是什么,用来干嘛的呢?? 首先CAS就是一个值替换的操作,可以类比于java中的“=”号赋值操作,相当于修改变量…...

    2024/4/16 5:35:53
  15. Chapter 9 基于水色图像的水质评价

    一、样本数据采集从采集到的原始水样图像中进行选择性抽取和实时的抽取,形成建模数据和增量数据。二、数据预处理2.1 图像切割用其他编程软件进行编程,切割水样图像中央101*101像素的图像。若原始图像大小为M*N,则截取宽从宽从(M/2-50)到(M/2+50),长度从 (M/2-50) 到 (M/2+…...

    2024/4/19 19:42:48
  16. insert select 主键ID 不连续的问题

    晚上完成 insert select语句对于自增列会预分配 如果不够就...

    2024/4/16 5:35:33
  17. 计算摄氏温度 (5分)

    #include<stdio.h> int main() {int C;int F=100;C=5*(F-32)/9; printf("fahr = 100, celsius = %d\n",C);return 0; }...

    2024/4/16 5:35:02
  18. The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml

    项目在eclipse运行正常,idea运行报错 运行显示的异常:原因:这个问题是taglib指定的uri找不到导致的(仅供参考)解决办法: 下载JSTL1.2,直接将解压出来的tld文件放到WEB-INF下,或者放到WEB-INF下的新建文件夹中即可...

    2024/4/19 18:28:52
  19. Java之mySQL数据库查询数据

    单表查询 首先创建数据库内容: create table student(id char(36) primary key,name varchar(8) not null,age int(3) default 0,mobile char(11),address varchar(150) ) insert into student values (9b4435ec-372c-456a-b287-e3c5aa23dff4,张三,24,12345678901,北京海淀);…...

    2024/4/25 6:55:21
  20. Updating cluster description to 日志关闭 MongoDB

    链接mongodb之后,在调试时发现如下信息:7:54:56.179 DEBUG com.mongodb.diagnostics.logging.SLF4JLogger 56 debug - Checking status of xxx.xxx.xxx.xxx:27017 17:54:56.180 DEBUG com.mongodb.diagnostics.logging.SLF4JLogger 56 debug - Updating cluster description …...

    2024/4/16 5:35:53

最新文章

  1. word启动缓慢之Baidu Netdisk Word Addin

    word启动足足花了7秒钟&#xff0c;你知道我这7秒是怎么过来的吗&#xff1f; 原因就是我们可爱的百度网盘等APP&#xff0c;在我们安装客户端时&#xff0c;默认安装了Office加载项&#xff0c;不仅在菜单栏上加上了一个丑陋的字眼&#xff0c;也拖慢了word启动速度........ 解…...

    2024/5/1 22:03:50
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 腾讯云容器与Serverless的融合:探索《2023技术实践精选集》中的创新实践

    腾讯云容器与Serverless的融合&#xff1a;探索《2023技术实践精选集》中的创新实践 文章目录 腾讯云容器与Serverless的融合&#xff1a;探索《2023技术实践精选集》中的创新实践引言《2023腾讯云容器和函数计算技术实践精选集》整体评价特色亮点分析Serverless与Kubernetes的…...

    2024/4/30 17:11:00
  4. 【JavaScript】如何在npm中切换源以及使用指定源安装依赖

    忘不掉的是什么我也不知道 想不起当年模样 看也看不到 去也去不了的地方 也许那老街的腔调是属于我的忧伤 嘴角那点微笑越来越勉强 忘不掉的是什么我也不知道 放不下熟悉片段 回头望一眼 已经很多年的时间 透过手指间看着天 我又回到那老街 靠在你们身边渐行渐远 …...

    2024/4/29 11:15:47
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/30 18:14:14
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/30 18:21:48
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/30 9:43:22
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; 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
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在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