1. 前言

1.1 sqltoy-orm是什么

sqltoy-orm是比hibernate+myBatis更加贴合项目的orm框架,具有hibernate增删改的便捷性同时也具有比myBatis更加灵活优雅的自定义sql查询功能。 支持以下数据库:

  • oracle 从oracle11g到19c
  • db2 9.5+,建议从10.5 开始
  • mysql 支持5.6、5.7、8.0 版本
  • postgresql 支持9.5 以及以上版本
  • sqlserver 支持2008到2019版本,建议使用2012或以上版本
  • sqlite
  • sybase_iq 支持15.4以上版本,建议使用16版本
  • elasticsearch 只支持查询,版本支持5.7+版本,建议使用7.3以上版本
  • clickhouse
  • mongodb (只支持查询)

基于java语言比mybatis更实用的orm框架——sagacity-sqltoy

 

1.2 是否重复造轮子,我只想首先说五个特性:

  • 根本上杜绝了sql注入问题,sql支持写注释、sql文件动态更新检测,开发时sql变更会自动重载
  • 最直观的sql编写模式,当查询条件稍微复杂一点的时候就会体现价值,后期变更维护的时候尤为凸显
  • 极为强大的缓存翻译查询:巧妙的结合缓存减少查询语句表关联,极大简化sql和提升性能。
  • 最强大的分页查询:很多人第一次了解到何为快速分页、分页优化这种极为巧妙的处理,还有在count语句上的极度优化。
  • 跨数据库函数方言替换,如:isnull/ifnull/nvl、substr/substring 等不同数据库

当然这只是sqltoy其中的五个特点,还有行列转换(俗称数据旋转)、多级分组汇总、统一树结构表(如机构)查询、分库分表sharding、取随机记录、取top记录、修改并返回记录、慢sql提醒等这些贴合项目应用的功能, 当你真正了解上述特点带来的巨大优势之后,您就会对中国人创造的sqltoy-orm有了信心!

sqltoy-orm 来源于个人亲身经历的无数个项目的总结和思考,尤其是性能优化上不断的挖掘,至于是不是重复的轮子并不重要,希望能够帮到大家!

2. 快速特点说明

2.1 最优雅直观的sql编写模式

  • sqltoy 的写法(一眼就看明白sql的本意,后面变更调整也非常便捷,copy到数据库客户端里稍做出来即可执行)
  • sqltoy条件组织原理很简单: 如 #[order_id=:orderId] 等于if(:orderId<>null) sql.append(order_id=:orderId);#[]内只要有一个参数为null即剔除
  • 支持多层嵌套:如 #[and t.order_id=:orderId #[and t.order_type=:orderType]]
  • 条件判断保留#[@if(:param>=xx ||:param<=xx1) sql语句] 这种@if()高度灵活模式,为特殊复杂场景下提供万能钥匙
select 	*
from sqltoy_device_order_info t 
where #[t.ORDER_ID=:orderId]#[and t.ORGAN_ID in (:authedOrganIds)]#[and t.STAFF_ID in (:staffIds)]#[and t.TRANS_DATE>=:beginDate]#[and t.TRANS_DATE<:endDate]  
  • mybatis的写法(一板一眼很工程化)
 select *from sqltoy_device_order_info t <where><if test="orderId!=null">and t.ORDER_ID=#{orderId}</if><if test="authedOrganIds!=null">and t.ORGAN_ID in<foreach collection="authedOrganIds" item="order_id" separator="," open="(" close=")">  #{order_id}  </foreach>  </if><if test="staffIds!=null">and t.STAFF_ID in<foreach collection="staffIds" item="staff_id" separator="," open="(" close=")">  #{staff_id}  </foreach>  </if><if test="beginDate!=null">and t.TRANS_DATE>=#{beginDate}</if><if test="endDate!=null">and t.TRANS_DATE<#{endDate}</if>
</where>

2.2 天然防止sql注入,执行过程:

  • 假设sql语句如下
select 	*
from sqltoy_device_order_info t 
where #[t.ORGAN_ID in (:authedOrganIds)]#[and t.TRANS_DATE>=:beginDate]#[and t.TRANS_DATE<:endDate] 
  • java调用过程
sqlToyLazyDao.findBySql(sql, new String[] { "authedOrganIds","beginDate", "endDate"},new Object[] { authedOrganIdAry,beginDate,null}, DeviceOrderInfoVO.class);
  • 最终执行的sql是这样的:
select 	*
from sqltoy_device_order_info t 
where t.ORDER_ID=?and t.ORGAN_ID in (?,?,?)and t.TRANS_DATE>=?	
  • 然后通过: pst.set(index,value) 设置条件值,不存在将条件直接作为字符串拼接为sql的一部分

2.3 最强大的分页查询

2.3.1 分页特点说明

  • 1、快速分页:@fast() 实现先取单页数据然后再关联查询,极大提升速度。
  • 2、分页优化器:page-optimize 让分页查询由两次变成1.3~1.5次(用缓存实现相同查询条件的总记录数量在一定周期内无需重复查询)
  • 3、sqltoy的分页取总记录的过程不是简单的select count(1) from (原始sql);而是智能判断是否变成:select count(1) from 'from后语句', 并自动剔除最外层的order by
  • 4、在极特殊情况下sqltoy分页考虑是最优化的,如:with t1 as (),t2 as @fast(select * from table1) select * from xxx 这种复杂查询的分页的处理,sqltoy的count查询会是:with t1 as () select count(1) from table1, 如果是:with t1 as @fast(select * from table1) select * from t1 ,count sql 就是:select count(1) from table1

2.3.1 分页sql示例

<!-- 快速分页和分页优化演示 -->
<sql id="sqltoy_fastPage"><!-- 分页优化器,通过缓存实现查询条件一致的情况下在一定时间周期内缓存总记录数量,从而无需每次查询总记录数量 --><!-- alive-max:最大存放多少个不同查询条件的总记录量; alive-seconds:查询条件记录量存活时长(比如120秒,超过阀值则重新查询) --><page-optimize alive-max="100" alive-seconds="120" /><value><![CDATA[select t1.*,t2.ORGAN_NAME -- @fast() 实现先分页取10条(具体数量由pageSize确定),然后再关联from @fast(select t.*from sqltoy_staff_info twhere t.STATUS=1 #[and t.STAFF_NAME like :staffName] order by t.ENTRY_DATE desc) t1 left join sqltoy_organ_info t2 on  t1.organ_id=t2.ORGAN_ID]]></value><!-- 这里为极特殊情况下提供了自定义count-sql来实现极致性能优化 --><!-- <count-sql></count-sql> -->
</sql>

2.3.3 分页java代码调用

/***  基于对象传参数模式*/
public void findPageByEntity() {PaginationModel pageModel = new PaginationModel();StaffInfoVO staffVO = new StaffInfoVO();// 作为查询条件传参数staffVO.setStaffName("陈");// 使用了分页优化器// 第一次调用:执行count 和 取记录两次查询PaginationModel result = sqlToyLazyDao.findPageBySql(pageModel, "sqltoy_fastPage", staffVO);System.err.println(JSON.toJSONString(result));// 第二次调用:过滤条件一致,则不会再次执行count查询//设置为第二页pageModel.setPageNo(2);result = sqlToyLazyDao.findPageBySql(pageModel, "sqltoy_fastPage", staffVO);System.err.println(JSON.toJSONString(result));
}/***  基于参数数组传参数*/
public void findPageByParams() {//默认pageSize 为10,pageNo 为1PaginationModel pageModel = new PaginationModel();String[] paramNames=new String[]{"staffName"};Object[] paramValues=new  Object[]{"陈"};PaginationModel result = sqlToyLazyDao.findPageBySql(pageModel, "sqltoy_fastPage",paramNames,paramValues,StaffInfoVO.class);System.err.println(JSON.toJSONString(result));
}

2.4 最巧妙的缓存应用,将多表关联查询尽量变成单表(看下面的sql,如果不用缓存翻译需要关联多少张表?sql要有多长?多难以维护?)

  • 1、 通过缓存翻译: 将代码转化为名称,避免关联查询,极大简化sql并提升查询效率
  • 2、 通过缓存名称模糊匹配: 获取精准的编码作为条件,避免关联like 模糊查询
<sql id="sqltoy_order_search"><!-- 缓存翻译设备类型cache:具体的缓存定义的名称,cache-type:一般针对数据字典,提供一个分类条件过滤columns:sql中的查询字段名称,可以逗号分隔对多个字段进行翻译cache-indexs:缓存数据名称对应的列,不填则默认为第二列(从0开始,1则表示第二列),例如缓存的数据结构是:key、name、fullName,则第三列表示全称--><translate cache="dictKeyName" cache-type="DEVICE_TYPE" columns="deviceTypeName" cache-indexs="1"/><!-- 员工名称翻译,如果同一个缓存则可以同时对几个字段进行翻译 --><translate cache="staffIdName" columns="staffName,createName" /><filters><!-- 反向利用缓存通过名称匹配出id用于精确查询 --><cache-arg cache-name="staffIdNameCache" param="staffName" alias-name="staffIds"/></filters><value><![CDATA[select 	ORDER_ID,DEVICE_TYPE,DEVICE_TYPE deviceTypeName,-- 设备分类名称STAFF_ID,STAFF_ID staffName, -- 员工姓名ORGAN_ID,CREATE_BY,CREATE_BY createName -- 创建人名称from sqltoy_device_order_info t where #[t.ORDER_ID=:orderId]#[and t.STAFF_ID in (:staffIds)]]]></value>
</sql>

2.4 最跨数据库

  • 1、提供类似hibernate性质的对象操作,自动生成相应数据库的方言。
  • 2、提供了最常用的:分页、取top、取随机记录等查询,避免了各自不同数据库不同的写法。
  • 3、提供了树形结构表的标准钻取查询方式,代替以往的递归查询,一种方式适配所有数据库。
  • 4、sqltoy提供了大量基于算法的辅助实现,最大程度上用算法代替了以往的sql,实现了跨数据库
  • 5、sqltoy提供了函数替换功能,比如可以让oracle的语句在mysql或sqlserver上执行(sql加载时将函数替换成了mysql的函数),最大程度上实现了代码的产品化。 default:SubStr\Trim\Instr\Concat\Nvl 函数;可以参见org.sagacity.sqltoy.plugins.function.Nvl 代码实现
       <!-- 跨数据库函数自动替换(非必须项),适用于跨数据库软件产品,如mysql开发,oracle部署 --><property name="functionConverts" value="default"><!-- 也可以这样自行根据需要进行定义和扩展<property name="functionConverts"><list><value>org.sagacity.sqltoy.plugins.function.Nvl</value><value>org.sagacity.sqltoy.plugins.function.SubStr</value><value>org.sagacity.sqltoy.plugins.function.Now</value><value>org.sagacity.sqltoy.plugins.function.Length</value></list></property> -->
</bean>

2.5 提供行列转换(数据旋转),避免写复杂的sql或存储过程,用算法来化解对sql的高要求,同时实现数据库无关(不管是mysql还是sqlserver)

        <!-- 列转行测试 --><sql id="sys_unpvoitSearch"><value><![CDATA[SELECT TRANS_DATE, sum(TOTAL_AMOUNT) TOTAL_AMOUNT,sum(PERSON_AMOUNT) PERSON_AMOUNT,sum(COMPANY_AMOUNT) COMPANY_AMOUNTFROM sys_unpivot_datagroup by TRANS_DATE]]></value><!-- 将指定的列变成行(这里3列变成了3行) --><unpivot columns="TOTAL_AMOUNT:总金额,PERSON_AMOUNT:个人金额,COMPANY_AMOUNT:企业金额"values-as-column="TRANS_AMOUNT" labels-as-column="AMOUNT_TYPE" /></sql><!-- 行转列测试 --><sql id="sys_pvoitSearch"><value><![CDATA[select t.TRANS_DATE,t.TRANS_CHANNEL,TRANS_CODE,sum(t.TRANS_AMT) TRANS_AMT from sys_summary_case tgroup by t.TRANS_DATE,t.TRANS_CHANNEL,TRANS_CODEorder by t.TRANS_DATE,t.TRANS_CHANNEL,TRANS_CODE]]></value><pivot category-columns="TRANS_CHANNEL,TRANS_CODE" start-column="TRANS_AMT"default-value="0" default-type="decimal" end-column="TRANS_AMT"group-columns="TRANS_DATE" /></sql>

2.6 提供分组汇总求平均算法(用算法代替sql避免跨数据库语法不一致)

	<!-- 汇总计算 (场景是sql先汇总,页面上还需要对已有汇总再汇总的情况,如果用sql实现在跨数据库的时候就存在问题)--><sql id="sys_summarySearch"><!-- 数据源sharding,多库将请求压力分摊到多个数据库节点上,支撑更多并发请求 -->	<sharding-datasource strategy="multiDataSource" /><value><![CDATA[select	t.TRANS_CHANNEL,t.TRANS_CODE,sum( t.TRANS_AMT )from sys_summary_case tgroup by t.TRANS_CHANNEL,t.TRANS_CODE]]></value><!-- reverse 表示将汇总信息在上面显示(如第1行是汇总值,第2、3、4行为明细,反之,1、2、3行未明细,第4行为汇总)  --><summary columns="2" reverse="true" sum-site="left" radix-size="2"><global sum-label="总计" label-column="0" /><!-- 可以无限层级的分组下去--><group sum-label="小计/平均" label-column="0" group-column="0" average-label="平均" /></summary></sql>

2.7 分库分表

2.7.1 查询分库分表(分库和分表策略可以同时使用)

        sql参见showcase项目:com/sagframe/sqltoy/showcase/sqltoy-showcase.sql.xml 文件sharding策略配置参见:src/main/resources/spring/spring-sqltoy-sharding.xml 配置<!-- 演示分库 --><sql id="sqltoy_db_sharding_case"><sharding-datasourcestrategy="hashBalanceDBSharding" params="userId" /><value><![CDATA[select * from sqltoy_user_log t -- userId 作为分库关键字段属于必备条件where t.user_id=:userId #[and t.log_date>=:beginDate]#[and t.log_date<=:endDate]]]></value></sql><!-- 演示分表 --><sql id="sqltoy_15d_table_sharding_case"><sharding-table tables="sqltoy_trans_info_15d"strategy="historyTableStrategy" params="beginDate" /><value><![CDATA[select * from sqltoy_trans_info_15d t where t.trans_date>=:beginDate#[and t.trans_date<=:endDate]]]></value></sql>

2.7.2 操作分库分表(vo对象由quickvo工具自动根据数据库生成,且自定义的注解不会被覆盖)

@Sharding 在对象上通过注解来实现分库分表的策略配置

参见:com.sagframe.sqltoy.showcase.ShardingCaseServiceTest 进行演示

package com.sagframe.sqltoy.showcase.vo;import java.time.LocalDate;
import java.time.LocalDateTime;import org.sagacity.sqltoy.config.annotation.Sharding;
import org.sagacity.sqltoy.config.annotation.SqlToyEntity;
import org.sagacity.sqltoy.config.annotation.Strategy;import com.sagframe.sqltoy.showcase.vo.base.AbstractUserLogVO;/*** @project sqltoy-showcase* @author zhongxuchen* @version 1.0.0 Table: sqltoy_user_log,Remark:用户日志表*/
/** db则是分库策略配置,table 则是分表策略配置,可以同时配置也可以独立配置* 策略name要跟spring中的bean定义name一致,fields表示要以对象的哪几个字段值作为判断依据,可以一个或多个字段* maxConcurrents:可选配置,表示最大并行数 maxWaitSeconds:可选配置,表示最大等待秒数*/
@Sharding(db = @Strategy(name = "hashBalanceDBSharding", fields = { "userId" }),// table = @Strategy(name = "hashBalanceSharding", fields = {"userId" }),maxConcurrents = 10, maxWaitSeconds = 1800)
@SqlToyEntity
public class UserLogVO extends AbstractUserLogVO {/*** */private static final long serialVersionUID = 1296922598783858512L;/** default constructor */public UserLogVO() {super();}
}

2.8 五种非数据库相关主键生成策略

主键策略除了数据库自带的 sequence\identity 外包含以下数据库无关的主键策略。通过quickvo配置,自动生成在VO对象中。

2.8.1 shortNanoTime 22位有序安全ID,格式: 13位当前毫秒+6位纳秒+3位主机ID

2.8.2 nanoTimeId 26位有序安全ID,格式:15位:yyMMddHHmmssSSS+6位纳秒+2位(线程Id+随机数)+3位主机ID

2.8.3 uuid:32 位uuid

2.8.4 SnowflakeId 雪花算法ID

2.8.5 redisId 基于redis 来产生规则的ID主键

根据对象属性值,产生规则有序的ID,比如:订单类型为采购:P 销售:S,贸易类型:I内贸;O 外贸; 订单号生成规则为:1位订单类型+1位贸易类型+yyMMdd+3位流水(超过3位自动扩展) 最终会生成单号为:SI191120001

2.9 elastic原生查询支持

2.10 elasticsearch-sql 插件模式sql模式支持

3.集成说明

  • 参见trunk 下面的sqltoy-showcase 和 sqltoy-starter-showcase
  • sqltoy-showcase 是演示springboot 和sqltoy基于xml配置模式的集成,大多数功能演示在此项目中,其中tools/quickvo 目录是利用数据库生成POJO的配置示例(具体是VO还是其它可根据实际情况修改配置)
  • sqltoy-starter-showcase:演示无xml配置形式的基于boot-starter模式的集成
package com.sagframe.sqltoy;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.transaction.annotation.EnableTransactionManagement;/**
* @author zhongxuchen
*/
@SpringBootApplication
@ComponentScan(basePackages = { "com.sagframe.sqltoy" })
@EnableTransactionManagement
public class SqlToyApplication {/*** @param args*/public static void main(String[] args) {SpringApplication.run(SqlToyApplication.class, args);}
}

application.properties sqltoy部分配置

##  sqltoy 配置 
# sql.xml 文件的路径,多个路径用;符合分割(原则上也是可选配置,如果只用对象操作的话,但不建议)
spring.sqltoy.sqlResourcesDir=/com/sagframe/sqltoy/showcase
# 缓存翻译的配置(可选配置)
spring.sqltoy.translateConfig=classpath:sqltoy-translate.xml
# 是否debug模式,debug 模式会打印执行的sql和参数信息(可选配置)
spring.sqltoy.debug=true
# 设置默认使用的datasource(可选配置,不配置会自动注入)
spring.sqltoy.defaultDataSource=dataSource
# 提供统一字段:createBy createTime updateBy updateTime 等字段补漏性(为空时)赋值(可选配置)
spring.sqltoy.unifyFieldsHandler=com.sagframe.sqltoy.plugins.SqlToyUnifyFieldsHandler
# sql执行超过多长时间则进行日志输出(可选配置:默认30秒),用于监控哪些慢sql
spring.sqltoy.printSqlTimeoutMillis=30000

缓存翻译的配置文件sqltoy-translate.xml

<?xml version="1.0" encoding="UTF-8"?>
<sagacityxmlns="http://www.sagframe.com/schema/sqltoy-translate"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.sagframe.com/schema/sqltoy-translate http://www.sagframe.com/schema/sqltoy/sqltoy-translate.xsd"><!-- 缓存有默认失效时间,默认为1小时,因此只有较为频繁的缓存才需要及时检测 --><cache-translatesdisk-store-path="./sqltoy-showcase/translateCaches"><!-- 基于sql直接查询的方式获取缓存 --><sql-translate cache="dictKeyName"datasource="dataSource"><sql><![CDATA[select t.DICT_KEY,t.DICT_NAME,t.STATUSfrom SQLTOY_DICT_DETAIL twhere t.DICT_TYPE=:dictTypeorder by t.SHOW_INDEX]]></sql></sql-translate><!-- 员工ID和姓名的缓存 --><sql-translate cache="staffIdName"datasource="dataSource"><sql><![CDATA[select STAFF_ID,STAFF_NAME,STATUSfrom SQLTOY_STAFF_INFO]]></sql></sql-translate></cache-translates><!-- 缓存刷新检测,可以提供多个基于sql、service、rest服务检测 --><cache-update-checkers><!-- 基于sql的缓存更新检测,间隔为秒,可以分段设置,也可以直接设置一个数组如60,表示一分钟检测一次--><sql-checkercheck-frequency="30"datasource="dataSource"><sql><![CDATA[--#not_debug#--select distinct 'staffIdName' cacheName,null cache_typefrom SQLTOY_STAFF_INFO t1where t1.UPDATE_TIME >=:lastUpdateTime-- 数据字典key和name缓存检测union all select distinct 'dictKeyName' cacheName,t2.DICT_TYPE cache_typefrom SQLTOY_DICT_DETAIL t2where t2.UPDATE_TIME >=:lastUpdateTime]]></sql></sql-checker></cache-update-checkers>
</sagacity>
  • 实际业务开发使用,直接利用SqlToyCRUDService 就可以进行常规的操作,避免简单的对象操作自己写service, 另外针对复杂逻辑则自己写service直接通过调用sqltoy提供的:SqlToyLazyDao 完成数据库交互操作!
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SqlToyApplication.class)
public class CrudCaseServiceTest {@Autowiredprivate SqlToyCRUDService sqlToyCRUDService;/*** 创建一条员工记录*/@Testpublic void saveStaffInfo() {StaffInfoVO staffInfo = new StaffInfoVO();staffInfo.setStaffId("S190715005");staffInfo.setStaffCode("S190715005");staffInfo.setStaffName("测试员工4");staffInfo.setSexType("M");staffInfo.setEmail("test3@aliyun.com");staffInfo.setEntryDate(LocalDate.now());staffInfo.setStatus(1);staffInfo.setOrganId("C0001");staffInfo.setPhoto(ShowCaseUtils.getBytes(ShowCaseUtils.getFileInputStream("classpath:/mock/staff_photo.jpg")));staffInfo.setCountry("86");sqlToyCRUDService.save(staffInfo);}}

4. sqltoy sql关键说明

4.1 sqltoy sql最简单规则#[] 对称符号

  • #[] 等于if(中间语句参数是否有null)? true: 剔除#[] 整块代码,false:拿掉#[ 和 ] ,将中间的sql作为执行的一部分。
  • #[] 支持嵌套,如#[t.status=:status #[and t.createDate>=:createDate]] 会先从内而外执行if(null)逻辑
  • 利用filters条件值预处理实现判断null的统一,下面是sqltoy完整提供的条件过滤器和其他函数 不要被大段的说明吓一跳,99%都用不上,正常filters里面只会用到eq 和 to-date
<sql id="show_case"><!-- 通过filters里面的逻辑将查询条件转为null,部分逻辑则对参数进行二次转换默认条件参数为空白、空集合、空数组都转为nullparmas 表示可以用逗号写多个参数,param 表示只支持单个参数-->	<filters><!-- 等于,如机构类别前端传负一就转为null不参与条件过滤 --><eq params="organType" value="-1" /><!-- 条件值在某个区间则转为null --><between params="" start-value="0" end-value="9999" /><!-- 将参数条件值转换为日期格式,format可以是yyyy-MM-dd这种自定义格式也可以是:first_day:月的第一天;last_day:月的最后一天,first_year_day:年的第一天,last_year_day年的最后一天 --><to-date params="" format="yyyyMMdd" increment-days="1" /><!-- 将参数转为数字 --> <to-number params="" data-type="decimal" /><!-- 将前端传过来的字符串切割成数组 --><split data-type="string" params="staffAuthOrgs" split-sign=","/><!-- 小于等于 --><lte params="" value=""  /><!-- 小于 --><lt  params=""  value="" /><!-- 大于等于 --><gte params="" value=""  /><!-- 大于 --><gt params="" value=""  /><!-- 字符替换,默认根据正则表达进行全部替换,is-first为true时只替换首个 --><replace params="" regex="" value="" is-first="false" /><!-- 首要参数,即当某个参数不为null时,excludes是指被排除之外的参数全部为null --><primary param="orderId" excludes="organIds" /><!-- 排他性参数,当某个参数是xxx值时,将其他参数设置为特定值  --><exclusive param="" compare-type="eq" compare-values=""set-params="" set-value="" /><!-- 通过缓存进行文字模糊匹配获取精确的代码值参与精确查询 -->	<cache-arg cache-name="" cache-type="" param="" cache-mapping-indexes="" alias-name=""/><!-- 将数组转化成in 的参数条件并增加单引号 --><to-in-arg params=""/></filters><!-- 缓存翻译,可以多个,uncached-template 是针对未能匹配时显示的补充,${value} 表示显示key值,可以key=[${value}未定义 这种写法 --><translate cache="dictKeyName" cache-type="POST_TYPE" columns="POST_TYPE"cache-indexs="1" uncached-template=""/><!-- 安全掩码:tel\姓名\地址\卡号 --><!--最简单用法: <secure-mask columns="" type="tel"/> --><secure-mask columns="" type="name" head-size="3" tail-size="4"mask-code="*****" mask-rate="50" /><!-- 分库策略 --><sharding-datasource strategy="" /><!-- 分表策略 --><sharding-table tables="" strategy="" params="" /><!-- 分页优化,缓存相同查询条件的分页总记录数量, alive-max:表示相同的一个sql保留100个不同条件查询 alive-seconds:相同的查询条件分页总记录数保留时长(单位秒) --><page-optimize alive-max="100" alive-seconds="600" /><!-- 日期格式化 --><date-format columns="" format="yyyy-MM-dd HH:mm:ss"/><!-- 数字格式 --><number-format columns="" format=""/><value><![CDATA[select t1.*,t2.ORGAN_NAME from @fast(select * from sys_staff_info twhere #[t.sexType=:sexType]#[and t.JOIN_DATE>:beginDate]#[and t.STAFF_NAME like :staffName]-- 是否虚拟员工@if()做逻辑判断#[@if(:isVirtual==true||:isVirtual==0) and t.IS_VIRTUAL=1]) t1,sys_organ_info t2where t1.ORGAN_ID=t2.ORGAN_ID]]>	</value><!-- 为极致分页提供自定义写sql --><count-sql><![CDATA[]]></count-sql><!-- 汇总和求平均,通过算法实现复杂的sql,同时可以变成数据库无关 --><summary columns="" radix-size="2" reverse="false" sum-site="left"><global sum-label="" label-column="" /><group sum-label="" label-column="" group-column="" /></summary><!-- 拼接某列,mysql中等同于group_concat\oracle 中的WMSYS.WM_CONCAT功能 --><link sign="," column="" /><!-- 行转列 (跟unpivot互斥),算法实现数据库无关 --><pivot category-columns="" group-columns="" start-column="" end-column=""default-value="0" /><!-- 列转行 --><unpivot columns="" values-as-column="" />
</sql>

5. sqltoy关键代码说明

  • sqltoy-orm 主要分以下几个部分:BaseDaoSupport:提供给开发者Dao继承的基本Dao,集成了所有对数据库操作的方法。SqlToyLazyDao:提供给开发者快捷使用的Dao,等同于开发者自己写的Dao,用于在简单场景下开发者可以不用写Dao,而直接写Service。SqltoyCRUDService:简单Service的封装,一些简单的对象增删改开发者写Service也是简单的调用Dao,针对这种场景提供一个简单功能的Service调用,开发者自己的Service用于封装相对复杂的业务逻辑。DialectFactory:数据库方言工厂类,sqltoy根据当前连接的方言调用不同数据库的实现封装。SqlToyContext:sqltoy上下文配置,是整个框架的核心配置和交换区,spring配置主要是配置sqltoyContext。EntityManager:封装于SqlToyContext,用于托管POJO对象,建立对象跟数据库表的关系。sqltoy通过SqlToyEntity注解扫描加载对象。ScriptLoader:sql配置文件加载解析器,封装于SqlToyContext中。sql文件严格按照*.sql.xml规则命名。TranslateManager:缓存翻译管理器,用于加载缓存翻译的xml配置文件和缓存实现类,sqltoy提供了接口并提供了默认基于ehcache的实现,缓存翻译最好是使用ehcache本地缓存(或ehcache rmi模式的分布式缓存),这样效率是最高的,而redis这种分布式缓存IO开销太大,缓存翻译是一个高频度的调用,一般会缓存注入员工、机构、数据字典、产品品类、地区等相对变化不频繁的稳定数据。ShardingStragety:分库分表策略管理器,4.x版本之后策略管理器并不需要显式定义,只有通过spring定义,sqltoy会在使用时动态管理。
  • 快速阅读理解sqltoy:从BaseDaoSupport(或SqlToyDaoSupport)作为入口,你会看到sqltoy的所有提供的功能,通过LinkDaoSupport则可以按照不同分类视角看到sqltoy的功能组织形式。从DialectFactory会进入不同数据库方言的实现入口。可以跟踪看到具体数据库的实现逻辑。你会看到oracle、mysql等分页、取随机记录、快速分页的封装等。EntityManager:你会找到如何扫描POJO并构造成模型,知道通过POJO操作数据库实质会变成相应的sql进行交互。ParallelUtils:对象分库分表并行执行器,通过这个类你会看到分库分表批量操作时如何将集合分组到不同的库不同的表并进行并行调度的。SqlToyContext:sqltoy配置的上下文,通过这个类可以看到sqltoy全貌。PageOptimizeCacheImpl:可以看到分页优化默认实现原理。
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. Neo4j图数据库安装和简单介绍

    全文以“农业知识图谱”为例进行介绍下载地址https://neo4j.com/download/other-releases/安装教程:https://blog.csdn.net/lihuaqinqwe/article/details/80314895csv数据存储格式目录:/work/apps/neo4j-community-3.4.1/import总共6个csv表,其中三个表存储节点信息,三个表…...

    2024/4/11 19:34:25
  2. Error:Duplicate class org.intellij.lang.annotations.Flow found in modules annotations-13.0.jar

    问题1 意思是重复导入了jar包,解决办法: 在build.gradle(module app) 里面加入几行代码即可:configurations {cleanedAnnotationscompile.exclude group: org.jetbrains , module:annotations}问题2 Unable to start activity ComponentInfo{com.example.zsbf/com.example.z…...

    2024/5/7 13:20:33
  3. 扇形导航

    CSS代码如下:<!doctype html> <html lang="en"><head><meta charset="UTF-8" /><title>Document</title><style type="text/css">* {margin: 0;padding: 0;}html,body {height: 100%;overflow: hidd…...

    2024/4/11 0:50:43
  4. 怎么获取用户输入的argv[]中的数字的int类型

    记一下,免得忘了!(linux下C语言) 在主函数中定义好后其中argc是用户总共输入参数的个数,argv是一个数组来存储这些内容。数组从0开始,所以除去运行时候的命令外,参数从1开始计数。但是argv直接获取的时候不是int类型,而是char *类型,没办法带到后面的函数里面去用。可…...

    2024/4/30 10:08:04
  5. 信息收集之cdn绕过查找网站真实ip

    1、查找子域名目标站点的所有二级域名不会全放在cdn上,查找子域名真实ip,看目标站与子域名是否在同一服务器上,不在则扫描同C段,扫描同C段的开放80端口的ip,可以使用谷歌语法、子域名挖掘机等工具收集子域名。2、多地点ping法ping 命令这样写 ping xxxx.com 而不是 ping w…...

    2024/5/6 0:48:23
  6. 滚动监听div显示在窗口可视区域内触发指定事件

    场景:客户要求当用户Y轴方向滚动网页,一旦看到视频图片就开始播放视频 大概布局: <div class="main"><div class="menu"></div><div class="banner"></div><div class="news"></div><…...

    2024/4/23 17:36:04
  7. 写作

    在线latex工具: overleafoverleaf的参考资料:https://zhuanlan.zhihu.com/p/83496692latex符号参考: https://blog.csdn.net/yen_csdn/article/details/79966985...

    2024/4/11 6:00:00
  8. 单例模式----设计模式

    单例,顾名思义,整个系统其实就只有一个实例存在,不能再多,否则就不叫单例。那我们把整个宇宙看做是一个庞大的系统,这宇宙里有各种对象存在,人啊,动物啊,植物啊不胜枚举,这些都是实例,丰富多彩的世界是美好的。然而,持续几千年的战争给世界带来了巨大灾难,尤其是宗…...

    2024/4/28 22:41:08
  9. golang解压zip包(linux和windows都可以)可以包含子目录

    不多BB,直接上代码了 package main import ("os""io""archive/zip""path/filepath""fmt" )func DeCompress(zipFile, dest string) error {reader, err := zip.OpenReader(zipFile)if err != nil {return err}defer reader…...

    2024/4/27 18:28:16
  10. Python计算机视觉编程第八章 图像内容分类

    图像内容分类1 K邻近分类器(KNN)1.1 一个简单的二维示例1.2 用稠密SIFT作为图像特征1.3 图像分类:手势识别2 贝叶斯分类器2.1 用PCA降维3 支持向量机scikit-learn中的SVM 本章介绍图像分类和图像内容分类算法。首先,我们介绍一些简单而有效的方法和目前一些性能最好的分类器…...

    2024/4/11 10:58:32
  11. 博客文章计划

    Matlab日期处理及绘图示例...

    2024/5/4 20:08:48
  12. python从字符串中提取数字_filter

    my_str = 123and456number = filter(str.isdigit, my_str )# number = 123456使用正则表达式:遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!>>> import re >&g…...

    2024/4/11 12:26:59
  13. 刚接触平面设计应该怎么学好?学平面设计有什么方法技巧?

    对于初学者而言,平面设计应该怎么学习好呢?学习平面设计有什么方法技巧?零基础能不能学会呢?这些都是刚接触学平面设计时经常会遇到的问题,新手小白们应该怎么面对学习呢?正确学习平面设计的方法是什么?没有什么基础学平面设计真的这么难吗?要怎么学好呢?今天小编就跟…...

    2024/4/10 12:04:09
  14. 个人微信小程序注册及开发者工具下载指引

    个人微信小程序注册及工具下载指引个人小程序注册小程序开发者工具下载 个人小程序注册 1.点击https://mp.weixin.qq.com/cgi-bin/wx?token=&lang=zh_CN,点击“前往注册“按钮,如下图2.填写邮箱及密码,如下图3.进入注册小程序的邮箱,点击链接激活小程序,以139邮箱为例…...

    2024/4/10 12:04:08
  15. eclipse配置Spring

    1、从eclipse下载Spring工具 进入 help – install new software… ,如下图:点击 add ,按以下方式输入:Name : Spring Location : http://dist.springsource.com/release/TOOLS/update/e4.10/之后点击 add ,等待一会儿会出现安装列表,我们选择带有 IDE 的四个组件进行安装…...

    2024/4/16 3:59:19
  16. Node&Vue安装记录(2020)

    Node安装教程: 菜鸟node安装过程地址 注意检查版本,cmd命令行:node -v 查看path是否包含node,cmd命令行:path 若未出现安装版本,请检查path配置。需自行添加到path变量安装Vue-cli: 安装完 node 后,最好设置下淘宝的镜像源,不建议使用 cnpm(可能会出现奇怪的问题) n…...

    2024/4/27 16:53:34
  17. 找到数组和为目标值的两个正数并且返回其下标

    1、方法一:方法2;将查找过的记录在缓存内,比如数组中1,记录key=1 ,value=0(坐标)...

    2024/4/26 0:38:10
  18. 论文解读:Improving Multi-hop Question Answering over Knowledge Graphs using Knowledge Base Embeddings

    论文解读:Improving Multi-hop Question Answering over Knowledge Graphs using Knowledge Base Embeddings知识库问答(KBQA/KGQA)是指给定一个自然语言问句和对应的知识库,试图从知识库中返回对应正确的答案。现如今一些方法是通过对问句中的候选实体在知识库中对齐,并获…...

    2024/4/26 2:28:35
  19. C++从入门到放弃之:this指针 和 常成员函数

    C++从入门到放弃this指针 和 常成员函数1. this指针需要使用`this`指针的场景2. 常成员函数(cosntstruction) this指针 和 常成员函数 1. this指针类中的成员函数(包括构造函数,析构函数)中包含有一个隐藏的当前类类型的指针参数(类* this),名为this在成员函数中访问类中其他成…...

    2024/4/11 13:16:02
  20. P2622 关灯问题II(状态压缩优化)

    关灯问题II 题目传送门 解题思路 它的起点是一定的,终点也一定,求最小步数,满足边权都为1,很明显是一道状压BFS 将它的状态存到队列里,一开始全部为1 转移 我们设a[i][j]表示第i个开关可以改变第j个灯 当a[i][j]为1,并且当前状态的第j位为1时,则当前状态为当前状态异或2…...

    2024/4/11 10:40:55

最新文章

  1. Spring Base64Utils:编码解码小助手

    1. 概述 Spring框架中的Base64Utils是一个实用的工具类&#xff0c;主要用于处理Base64编码和解码的操作。Base64编码是一种常见的编码方式&#xff0c;用于将二进制数据转换为ASCII字符串&#xff0c;以便在网络传输或存储时不会因数据中的特殊字符而引发问题。Base64Utils简…...

    2024/5/7 19:08:06
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/5/7 10:36:02
  3. 【Android】【root remount】【2】如何判断设备是否remount

    前言 高版本的android设备&#xff0c;在remount之后&#xff0c;如果再进行ota升级&#xff0c;会产生异常&#xff0c;从而无法升级成功。 如何判断设备是否remount 当前已android 10 平台为例 当我们执行 adb remount 时&#xff0c;系统调用会调用到system/core/adb/dae…...

    2024/5/3 23:26:47
  4. C++ 【原型模式】

    简单介绍 原型模式是一种创建型设计模式 | 它使你能够复制已有对象&#xff0c;客户端不需要知道要复制的对象是哪个类的实例&#xff0c;只需通过原型工厂获取该对象的副本。 以后需要更改具体的类或添加新的原型类&#xff0c;客户端代码无需改变&#xff0c;只需修改原型工…...

    2024/5/7 14:08:47
  5. 【自学记录5】【Pytorch2.0深度学习从零开始学 王晓华】第五章 基于Pytorch卷积层的MNIST分类实战

    5.1.2 PyTorch2.0中卷积函数实现详解 1、torch.nn.Conv2d in_channels3: 输入的通道数&#xff0c;对应图像的3个颜色通道。 out_channels10: 输出的通道数&#xff0c;即卷积后我们想要得到的特征图的数量。 kernel_size3: 卷积核的大小&#xff0c;这里使用的是3x3的卷积核…...

    2024/5/7 10:16:25
  6. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/5/7 19:05:20
  7. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/5/6 18:40:38
  8. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/5/6 23:37:19
  9. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/5/7 14:19:30
  10. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/5/7 0:32:52
  11. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/5/7 16:57:02
  12. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/5/7 14:58:59
  13. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/5/7 1:54:46
  14. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/5/6 20:04:22
  15. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/5/7 0:32:51
  16. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/5/7 16:05:05
  17. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/5/7 16:04:58
  18. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/5/6 19:38:16
  19. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/5/7 16:05:05
  20. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/5/7 0:32:49
  21. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/5/6 21:25:34
  22. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/5/7 11:08:22
  23. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/5/7 7:26:29
  24. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/5/7 0:32:47
  25. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/5/7 17:09:45
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

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

    2022/11/19 21:17:18
  27. 错误使用 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
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

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

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

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

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

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

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

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

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

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

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

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

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,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
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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