Mybatis中SQL的执行过程
文章目录
- Mybatis 框架
- SQL执行过程
- 数据库操作映射方式
- SQL的执行过程
- - SQL解析
- - SQL参数映射
- - SQL预编译
- - SQL执行
- - 结果映射
- - 事务处理
- - 缓存处理
- - 日志记录与监控
- 扩展
- #与$的区别
- - $ 符号
- - # 符号
- 总结示例
- Mybatis SQL分类
- - 动态 SQL
- - 静态 SQL
- 静态SQL和动态SQL选择
- ${}、#{}与SQL是否静态SQL、动态SQL无直接关系
Mybatis 框架
SQL执行过程
数据库操作映射方式
MyBatis支持两种方式进行数据库操作映射:
- 映射文件:通过XML文件来定义SQL语句和映射关系
- 注解方式:通过在Java代码中使用注解来定义SQL语句和映射关系
这两种方式都可以实现数据库操作的映射,具体使用哪种方式取决于个人的喜好和项目需求。本文都以映射文件的方式进行分析。
SQL的执行过程
-
SQL解析
MyBatis 会将SQL 语句解析为内部的数据结构。这一过程中,MyBatis 会根据 SQL 中的参数类型、数量等信息,生成一个 MappedStatement 对象,表示当前的 SQL 语句及其相关的执行元数据。
-
参数绑定
在 SQL 解析完成后,MyBatis 会在 SQL 参数映射阶段,将 SQL 语句中的参数与 Java 对象进行映射,并将参数值处理成符合数据库预编译要求的形式。这样,在 SQL 预编译和执行阶段,就可以正确地传递参数并执行 SQL 语句。
-
SQL预编译
MyBatis 利用 JDBC 的 PreparedStatement 接口进行 SQL 语句的预编译。预编译过程会将 SQL 中的占位符(?)替换为实际参数,并将其转化为数据库可以优化执行的形式,从而提高 SQL 执行效率。
-
执SQL行
完成预编译后,MyBatis 会通过 JDBC API 将 SQL 语句提交给数据库执行,并获取查询结果或执行结果。数据库执行完成后,结果会返回给 MyBatis 进行进一步处理。
-
结果映射
MyBatis 会将数据库返回的结果集转换为相应的 Java 对象。这一过程包括类型转换、字段匹配等,通常通过 TypeHandler 来完成。TypeHandler 负责将数据库中的列值与 Java 对象的属性进行映射。
-
事务处理
如果启用了手动事务管理,MyBatis 会在 SQL 执行完成后,根据配置的事务管理策略,提交或回滚事务,确保数据一致性和事务的完整性。
-
缓存处理
若启用了缓存,MyBatis 会将查询结果存储到缓存中,以便下次执行相同的 SQL 语句时能够直接从缓存中获取结果,从而减少数据库的访问频率,提高性能。MyBatis 支持一级缓存(SqlSession 范围内)和二级缓存(跨 SqlSession 的共享缓存)。
-
日志记录与监控
MyBatis 会通过集成日志框架(如 Log4j、SLF4J)记录 SQL 执行的详细日志。这些日志信息可以帮助开发人员分析 SQL 执行的性能,发现潜在的问题,优化查询效率。
最后,将查询结果返回给调用方,自此,完成整个 SQL 执行过程。
下面详细介绍每一个过程:
- SQL解析
当 MyBatis 执行一个查询时,首先会对传入的 SQL 语句进行解析,解析 SQL 语句的结构和参数信息,为后续的参数绑定和执行做准备。
- 解析过程会进行语法分析和语义分析,以确保SQL语句的正确性
- 分析 SQL 语句中的参数占位符并提取出需要传入的参数类型和数量。
- 将 SQL 语句转化为 MyBatis 内部可识别的数据结构
MyBatis 使用 XML 或注解中的 SQL 语句,结合映射文件中的 MappedStatement 对象来表示 SQL 信息。MappedStatement 是 MyBatis 核心的配置对象,包含了 SQL 的元数据、类型处理器、缓存策略等。
解析过程涉及到标签的解析、参数的解析和动态SQL的处理
- 标签解析:
- 首先会解析映射文件的根节点(<select>、<insert>、<update>、<delete>等),然后逐个解析其中的标签。
- 解析标签时,MyBatis会根据标签的不同类型(如查询、插入、更新、删除)执行相应的解析逻辑。
- 动态SQL处理:
- MyBatis支持动态SQL,即根据不同的条件在运行时动态生成SQL语句。\
- 动态SQL使用一系列XML标签(如<if>、<choose>、<when>、<otherwise>等)进行条件判断和 SQL片段的组装。
- 在解析映射文件时,MyBatis会对动态SQL片段进行解析,并根据条件判断生成最终的SQL语句。
- 动态SQL的处理涉及到条件判断、循环、字符串拼接等操作,以根据运行时的条件生成最终的SQL语句。
参考:
<select id="findUserById" resultType="User">SELECT * FROM users WHERE id = #{id}
</select>
- 在上述例子中,findUserById 是一个 MappedStatement 对象,#{id} 是一个占位符。
- SQL参数映射
MyBatis 在 SQL 参数映射阶段,会将用户提供的参数绑定到 SQL 语句中的占位符。根据映射文件或注解中的 SQL 语句,MyBatis 会分析哪些占位符需要绑定哪些参数。这样,在 SQL 预编译和执行阶段,就可以正确地传递参数并执行 SQL 语句。
在 MappedStatement 中,有一个 BoundSql 对象,它包含了实际的 SQL 语句以及绑定的参数。BoundSql 会根据 SQL 的占位符(如 ? 或 #{})将传入的参数与 SQL 语句进行绑定。
- MyBatis 首先会解析 SQL 语句,识别其中的占位符(#{})或者字符串替换(${})形式的参数。
- 对于 ${} 形式的参数,MyBatis 会直接将参数值替换到 SQL 语句中(需要谨防SQL注入问题)。
参考:
Map<String, Object> params = new HashMap<>();
params.put("id", 1);
userMapper.findUserById(params);
- params 中的 id 将会绑定到 SQL 语句中的 #{id} 占位符。
- SQL预编译
MyBatis使用JDBC的PreparedStatement接口创建预编译的SQL语句,预编译的SQL语句中使用占位符(如?)代替参数。通过 SQL 预编译提升执行效率,并确保参数的安全性。
- 预编译有助于提高执行效率,因为 SQL 语句只需要解析一次,数据库会优化执行计划,避免每次都解析 SQL。
- PreparedStatement 允许 MyBatis 在数据库执行时才将参数值填充到预编译的 SQL 中,从而提高执行效率并避免 SQL 注入攻击。
参考:
PreparedStatement ps = connection.prepareStatement("SELECT * FROM users WHERE id = ?");
ps.setInt(1, 1);
- 将第一个参数(id)设置为 1
- SQL执行
MyBatis 会通过 JDBC API 将编译后的 SQL 语句提交到数据库执行。执行过程会获取执行结果,例如查询结果或更新、删除操作的影响行数。
- 执行时,MyBatis 会通过 Statement 或 PreparedStatement 接口执行 SQL。查询操作会返回一个 ResultSet,更新、删除等操作会返回受影响的行数。
- 如果执行的是查询操作,MyBatis 会进一步处理返回的 ResultSet,并将其转换为 Java 对象。
参考:
ResultSet rs = ps.executeQuery();
- 结果映射
执行 SQL 后,MyBatis 会将数据库返回的 ResultSet 映射为相应的 Java 对象。这个映射过程会根据 SQL 查询的字段与 Java 对象的属性进行转换。
- MyBatis 使用 ResultMap 来定义如何将查询结果映射到 Java 对象。ResultMap 可以指定每个字段与对象属性之间的映射关系。
- 例如,使用 TypeHandler 进行类型转换(比如将数据库中的 VARCHAR 类型转换为 String 类型)。
- 对于复杂的结果映射,MyBatis 允许嵌套的映射以及集合类型的处理。
参考:
<resultMap id="userResultMap" type="User"><result property="id" column="id"/><result property="name" column="name"/>
</resultMap>
- 事务处理
MyBatis 支持手动和自动事务管理。默认情况下,MyBatis 使用 JDBC 提供的事务控制。在执行数据库操作后,MyBatis 会根据配置决定是否提交或回滚事务。
- 如果使用自动提交(autocommit=true),事务会在每个操作后立即提交。
- 如果使用手动事务管理,开发者需要显式地调用 commit() 或 rollback() 来提交或回滚事务。
- 事务处理保证了操作的一致性,即在一个事务中的多个操作要么全部成功,要么全部失败。
参考:
sqlSession.commit(); // 提交事务
sqlSession.rollback(); // 回滚事务
- 缓存处理
MyBatis 提供了一级缓存和二级缓存机制来提高查询效率。一级缓存是 SqlSession 级别的缓存,而二级缓存是跨 SqlSession 的共享缓存。
- 一级缓存:在同一个 SqlSession 中,查询的结果会被缓存。只要没有关闭 SqlSession,再次查询相同的 SQL 会直接从缓存中获取结果,而不是重新查询数据库。
- 二级缓存:不同 SqlSession 之间可以共享缓存。二级缓存的使用需要在 MyBatis 配置文件中显式启用,并且每个映射器可以配置自己的缓存策略。
- 缓存机制有助于提高性能,尤其是在查询频繁但数据变化较少的场景中。
- 日志记录与监控
MyBatis 可以集成各种日志框架(如 Log4j、SLF4J 等)来记录 SQL 执行过程中的信息。开发人员可以通过日志输出 SQL 执行的详细信息,包括查询语句、执行时间等。
- MyBatis 的日志记录对于开发人员调试 SQL 和优化性能非常有帮助。
- 日志框架可以配置为不同的日志级别,例如 DEBUG、INFO、ERROR 等,方便查看不同详细度的信息。
参考:
<settings><setting name="logImpl" value="SLF4J"/>
</settings>
扩展
#与$的区别
- $ 符号
- $符号占位符是简单的字符串替换,不进行预编译和参数类型处理,也不会进行转义。
- $符号占位符直接将参数的值替换到SQL语句中,可以用于动态拼接SQL语句的部分内容。
- $符号占位符存在SQL注入的风险,因为参数值直接替换到SQL语句中,可能导致恶意注入攻击。
- 最终SQL的动态参数值一定不会有引号包裹
- # 符号
- #符号占位符是预编译的占位符,会对参数进行类型处理和安全处理。
- #符号占位符将参数值作为预编译参数传递给数据库,可以防止SQL注入攻击。
- #符号占位符可以用于动态生成SQL语句的条件部分,例如WHERE子句、ORDER BY子句等。
- 最终SQL的动态参数值可能会有引号包裹(不是一定都会有引号包裹)
- 字符串类型:会自动将其包裹在单引号中。
- 数字类型:不会自动加单引号。
- 日期类型:会格式化日期并加上单引号。
总结示例
示例:
username的值为haha(String)
1. 使用$占位符
SELECT id, username, email FROM users WHERE username = ${username}
# 最终实际执行的sql
SELECT id, username, email FROM users WHERE username = haha
2. 使用#占位符
SELECT id, username, email FROM users WHERE username = #{username}
# 最终实际执行的sql
SELECT id, username, email FROM users WHERE username = 'haha'
Mybatis SQL分类
根据 SQL 查询的特性来区分的,可以将SQL分为动态 SQL 和静态 SQL。
- 动态 SQL
使用动态SQL,可以根据不同的条件生成不同的SQL语句,从而实现灵活的查询和更新操作。动态SQL可以使用if、choose、when、otherwise等标签来实现条件判断和循环操作,同时还可以使用foreach标签来实现对集合类型参数的遍历操作。这样可以避免在代码中使用大量的字符串拼接,提高代码的可读性和维护性。
动态 SQL 的特点:
- 可以根据不同的条件生成不同的 SQL 查询。
- 可以在查询语句中动态地添加、删除或修改部分 SQL 逻辑。
- 提供了更大的灵活性和动态性,可以根据运行时的条件来动态生成查询语句。
常见的动态 SQL 的示例:
- 使用条件语句(如 IF、CASE)来动态选择不同的查询分支。
- 使用循环语句(如 FOR、WHILE)来生成重复或动态数量的查询条件。
- 使用动态连接条件来构建动态查询条件。
- 使用动态排序来指定不同的排序方式。
- 静态 SQL
静态 SQL 的特点:
- 查询语句的结构和逻辑是固定的,在执行查询时不会发生变化。
- SQL 查询不受外部参数的影响,参数值在查询中直接拼接。
常见的静态 SQL 的示例:
- 简单的选择查询语句,不需要根据条件改变查询逻辑。
- 固定的更新语句,不受外部参数影响。
- 预定义的查询模板,参数值直接拼接在查询语句中。
- 创建表格、索引等静态结构定义。
静态SQL和动态SQL选择
由于静态sql是在应用启动的时候就解析,而动态sql是在执行该sql相关操作的时候才根据传入的参数进行解析的,所以静态sql效率会比动态sql好。
${}、#{}与SQL是否静态SQL、动态SQL无直接关系
- ${} 和 #{} 只是占位符,用来插入参数,它们本身并不决定 SQL 是静态还是动态。
- 动态 SQL 是通过 条件判断(如 、)来决定 SQL 的结构是否变化。
- 即使 SQL 中使用了 ${} 或 #{},如果没有动态条件,它仍然是静态 SQL。
示例1:
使用了${} 、#{},不是动态SQL
<select id="getUserById" resultType="User">SELECT id, username, emailFROM usersWHERE id = #{id}
</select>
- 这里的 #{id} 用来传递参数,但 SQL 本身 是固定的,没有根据任何条件变化。
- 这个查询并不是动态 SQL,因为它没有任何动态部分(比如没有使用 标签)。
示例2:
使用 ${} 来动态拼接表名,不是动态SQL
<select id="getUsersByTableName" resultType="User">SELECT id, username, emailFROM ${tableName}WHERE id = #{id}
</select>
- 这里的 ${tableName} 是动态的,会根据传入的 tableName 参数拼接成不同的表名。
- 但 SQL 结构本身依然是 固定的,只是表名不同。
示例3:
使用了${} 、#{},是动态SQL
<select id="selectUsers" resultType="User">SELECT id, username, emailFROM users<where><if test="username != null">AND username = #{username}</if><if test="email != null">AND email = #{email}</if></where>
</select>
- 使用了 标签来动态地添加 SQL 条件,因此整个 SQL 是动态的。
- 如果 username 和 email 参数存在,SQL 语句就会加入对应的 AND 条件;如果不存在,这些条件会被忽略。
- 这个查询才是真正的动态 SQL,因为它的结构根据输入的参数变化。但 #{} 只是用来传递参数,它和是否动态没有直接关系
相关文章:
Mybatis中SQL的执行过程
文章目录 Mybatis 框架SQL执行过程数据库操作映射方式SQL的执行过程- SQL解析- SQL参数映射- SQL预编译- SQL执行- 结果映射- 事务处理- 缓存处理- 日志记录与监控 扩展#与$的区别- $ 符号- # 符号总结示例 Mybatis SQL分类- 动态 SQL- 静态 SQL静态SQL和动态SQL选择${}、#{}与…...
【数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:编写一个程序实现顺序栈的基本运算。 相关知识 为了完成本关任务,你需要掌握: 初始化栈、销毁栈、判断栈是否为空、进栈、出栈、取…...
【论文阅读】PRIS: Practical robust invertible network for image steganography
内容简介 论文标题:PRIS: Practical robust invertible network for image steganography 作者:Hang Yang, Yitian Xu∗, Xuhua Liu∗, Xiaodong Ma∗ 发表时间:2024年4月11日 Engineering Applications of Artificial Intelligence 关键…...
在Linux桌面系统普及化方面的一些建议
在推动Linux桌面系统普及化的过程中,可以考虑以下几个方案和策略: 用户友好性改进: 界面设计:提升用户界面的美观性和易用性,使其更接近或超越主流操作系统的用户体验。软件兼容性:确保常用软件(…...
LLM - 多模态大模型的开源评估工具 VLMEvalKit 部署与测试 教程
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/144353087 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 VLMEva…...
数据结构(Queue队列)
前言: 在计算机科学中,数据结构是构建高效算法和程序的基础,而队列(Queue)作为一种经典的线性数据结构,具有重要的地位。与栈(Stack)不同,队列遵循“先进先出”…...
Qt 图形框架下图形拖动后位置跳动问题
在使用Qt 的图形框架QGraphicsScene,QGraphicsView实现图形显示时。遇到一个很棘手的BUG。 使用的图形是自定义的QGraphicsObject的子类。 现象是将图形添加到画布上之后,用鼠标拖动图形,图形能正常改变位置,当再次用鼠标点击图…...
【Linux篇】走进Linux — 开启开源操作系统之旅
文章目录 初识Linux一.Linux的起源与发展二.Linux的特点三.Linux的应用四.Linux的发行版本 Linux环境搭建一.Linux环境的搭建方式二.购买云服务器三.使用XShell远程登陆到Linux 初识Linux 一.Linux的起源与发展 1.初始动机: Linux是一个功能强大的开源操作系统&am…...
如何利用DBeaver配置连接MongoDB和人大金仓数据库
最近根据国产化要求,需要使用国产数据库,但习惯使用DBeaver连接各种成熟的商业或开源数据库。因此,就想着如何继续基于该工具,连接MongoDB和人大金仓数据库,查了半天很多地方说法不统一,所以自己就简单整理…...
Android 车载虚拟化底层技术-Kernel 5.10 -Android12(multi-cards)技术实现
详细代码实现见 Android Display Graphics系列文章-汇总Android Display Graphics系列文章-汇总 Android Display Graphics系列文章-汇总 Android Display Graphics系列文章-汇总 本文主要包括部分: 一、Android12的Kernel 5.10版本 1.1 Kernel 5…...
Qt之点击鼠标右键创建菜单栏使用(六)
Qt开发 系列文章 - menu(六) 目录 前言 一、示例演示 二、菜单栏 1.MenuBar 2.Menu 总结 前言 QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menubar)、多个工具栏(toolbars)、一个状态栏(status…...
开发一套SDK 第一弹
自动安装依赖包 添加条件使能 #ex: filetypesh bash_ls 识别 达到预期,多个硬件环境 等待文件文件系统挂在完成 或者创建 /sys/class/ 属性文件灌入配置操作 AI 提供的 netlink 调试方法,也是目前主流调用方法,socket yyds #include <linux/module.h> #include <linux…...
sftp+sshpass
实现场景,要求客户端定时将本地的日志文件传输到服务器。 工作环境ubuntu,注意不通操作系统的版本不通,依赖的工具的版本也有所不同 实现目标需要客户端满足安装工具: 1、下载安装sshpass ---安装命令:sudo apt-ge…...
【机器学习与数据挖掘实战】案例01:基于支持向量回归的市财政收入分析
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈机器学习与数据挖掘实战 ⌋ ⌋ ⌋ 机器学习是人工智能的一个分支,专注于让计算机系统通过数据学习和改进。它利用统计和计算方法,使模型能够从数据中自动提取特征并做出预测或决策。数据挖掘则是从大型数…...
Idea实现定时任务
定时任务 什么是定时任务? 可以自动在项目中根据设定的时长定期执行对应的操作 实现方式 Spring 3.0 版本之后自带定时任务,提供了EnableScheduling注解和Scheduled注解来实现定时任务功能。 使用SpringBoot创建定时任务非常简单,目前主要…...
Linux 安装NFS共享文件夹
程序默认使用2049端口,如果被占用需要修改端口104设置为服务端 122设置为客户端 一、在线安装(服务端和客户端执行) yum install nfs-utils rpcbind -y二、配置启动参数(服务端执行) 104服务器/mnt路径下创建shareda…...
bash 判断内存利用率是否高于60%
在 Bash 脚本中,可以通过 free 命令获取内存利用率,然后结合 awk 和条件判断语句实现监控内存利用率是否高于 60%。以下是一个示例脚本: 1. 示例脚本 #!/bin/bash# 获取总内存和已使用内存 total_mem$(free | awk /Mem:/ {print $2}) used_…...
推送(push)项目到gitlab
文章目录 1、git init1.1、在当前目录中显示隐藏文件:1.2、查看已有的远程仓库1.3、确保你的本地机器已经生成了 SSH 密钥:1.4、将生成的公钥文件(通常位于 ~/.ssh/id_rsa.pub)复制到 GitLab 的 SSH 设置中:1.5、测试 …...
centos9升级OpenSSH
需求 Centos9系统升级OpenSSH和OpenSSL OpenSSH升级为openssh-9.8p1 OpenSSL默认为OpenSSL-3.2.2(根据需求进行升级) 将源码包编译为rpm包 查看OpenSSH和OpenSSL版本 ssh -V下载源码包并上传到服务器 openssh最新版本下载地址 wget https://cdn.openb…...
硬件成本5元-USB串口采集电表数据完整方案-ThingsPanel快速入门
ThingsPanel开源物联网平台支持广泛的协议,灵活自由,本文介绍ThingsPanel通过串口来采集电表数据,简单易行,成本低廉,适合入门者学习试验,也适合一些特定的应用场景做数据采集。 适用场景: 降低…...
在AWS EMR上用Hive、Spark、Airflow构建一个高效的ETL程序
在AWS EMR(Elastic MapReduce)上构建一个高效的ETL程序,使用Hive作为数据仓库,Spark作为计算引擎,Airflow作为调度工具时,有几个关键的设计与实施方面需要注意。 在AWS EMR上构建高效的ETL程序,…...
前端(四)css选择器、css的三大特性
css选择器、css的三大特性 文章目录 css选择器、css的三大特性一、css介绍二、css选择器2.1 基本选择器2.2 组合选择器2.3 交集并集选择器2.4序列选择器2.5属性选择器2.6伪类选择器2.7伪元素选择器 三、css三大特性3.1 继承性3.2 层叠性3.3 优先级 一、css介绍 CSS全称为Casca…...
vscode 打开 setting.json
按下Ctrl Shift P(Windows/Linux)或Cmd Shift P(Mac)来打开命令面板。输入open settings,然后选择 Open User Settings(JSON)。打开settings.json文件 ------修改设置-----: 1、 html代码的行长度&am…...
关于网络安全攻防演化博弈的研究小议
1. 拉高视角,从宏观看网络安全攻防 伴随着信息化的发展,网络安全的问题就一直日益突出,与此同时,网络安全技术也成为研究热点,直到今日也没有停止。 从微观来看,网络安全技术研究指的是针对某项或某几项…...
【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(7)
1.问题描述: 推送通知到手机,怎么配置拉起应用指定的页面? 解决方案: 1、如果点击通知栏打开默认Ability的话, actionType可以设置为0, 同时可以在.clickAction.data中,指定待跳转的page页面…...
远程桌面防护的几种方式及优缺点分析
远程桌面登录是管理服务器最主要的方式,于是很多不法分子打起了远程桌面的歪心思。他们采用暴力破解或撞库的方式破解系统密码,悄悄潜入服务器而管理员不自知。 同时远程桌面服务中的远程代码执行漏洞也严重威胁着服务器的安全,攻击者可以利…...
ASP.NET|日常开发中连接Sqlite数据库详解
ASP.NET|日常开发中连接Sqlite数据库详解 前言一、安装和引用相关库1.1 安装 SQLite 驱动1.2 引用命名空间 二、配置连接字符串2.1 连接字符串的基本格式 三、建立数据库连接3.1 创建连接对象并打开连接 四、执行数据库操作4.1 创建表(以简单的用户表为例…...
python的自动化seleium安装配置(包含谷歌的chromedriver)
目录 前言介绍 一、下载谷歌浏览器chromedriver (一)查看谷歌浏览器版本 (二)去官网下载谷歌驱动(chromdriver) (三)谷歌浏览器安装位置解压 (四)配置环境变量 二、pychram里下载安装selenium 三、测试selenium是否成功 前言介绍 Selenium是一个开源的自动化测试工具&…...
QT requested database does not belong to the calling thread.线程中查询数据报错
QT requested database does not belong to the calling thread.线程中查询数据报错 QString name "ttx"; QSqlQueryModel* sql_model; QString sql_comm QString("select * from dssb_moddve_loddt_tab where name%1").arg(name); sql_model->set…...
服务器一般装什么系统?
在服务器管理中,操作系统的选择是一个关键因素,它直接影响到服务器的稳定性、性能和可维护性。那么为什么有些服务器选择Linux,而不是Windows?选择合适的操作系统对服务器的性能和安全性有多么重要? 在众多操作系统中…...
b2c网站多少钱/检测网站是否安全
Infoq已经发表了文章(http://www.infoq.com/cn/articles/whole-software-testing-practice-requirements-to-operational),这里把原文公布下: 之前一篇文章《软件测试转型之路》 (http://www.infoq.com/cn/articles/transformatio…...
做动态网站必学/广告推广网站
💥 项目专栏:【Pandas数据处理100例目录】Python数据分析玩转Excel表格数据 前言 大家好,我是阿光。 本专栏整理了《Pandas数据分析处理》,内包含了各种常见的数据处理,以及Pandas内置函数的使用方法,帮助我们快速便捷的处理表格数据。 正在更新中~ ✨ 🚨 我的项目…...
建设英文商城网站/网络营销的含义的理解
九章算法官网-原文网址 http://www.jiuzhang.com/problem/55/ 题目 给一个字符串和一个旋转的偏移量offset,将字符串循环右移offset位。 如:"abcdefg" 循环右移 4位之后变为了:"defgabc" 要求做到O(1)的额外空间耗费…...
soho外贸网站建设/优化seo是什么意思
文章目录题目题目解析解题代码我的个人小站: acking-you.github.io题目 OJ平台 题目解析 实际上就是一个前缀和二分的处理,我一旦爆出前缀和二分,应该就都有思路了! 解题代码 这里偷懒使用了STL,当然也可自己去写二…...
如何设计自己的网站/淘宝关键词优化
请按照如下步骤进行: (1) 打开IE --> Internet Options -- > Advanced ; 去掉”Disable Script Debugging” 上的选项 (2) 打开需要调试的页面 (3) 启动VS.Net IDE, 选择 TOOLS-Debug Process (Ctrl Alt P). 选择需要调试的IE进程。 (4) 点击Atta…...
云存储wordpress/google搜索
CSS背景属性 属性描述值IEFNW3Cbackground简写属性,作用是将背景属性设置在一个声明中。 background-color background-image background-repeat background-attachment background-position 4161background-attachment设置是否背景图像是固定的或随页面其余部分滚动…...