Mybatis 框架 ( 一 ) 基本步骤
1.概念
1.1.什么是Mybatis框架
(1)Mybatis是一个半ORM(Object Relation Mapping 对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql,可以严格控制sql执行性能,灵活度高。
(2)MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
(3)通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)
1.2.Mybatis框架与JDBC区别
两者都是持久化的技术
连接数据库时 : mybatis 使用了 连接池技术 , 而jdbc需要自己写
持久化操作时 : mybatis 在映射文件中集中管理SQL语句 , 并且支持动态SQL
通常使用Mapper接口封装成面向对象的语法
而JDBC中的SQL是以参数的形式传入
结果集封装 : mybatis 封装了过程 , 只要指明对应结构就可以 , 而JDBC全手动
1.3.Mybatis框架与Hibernate框架区别
Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。
而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。
2.步骤

相较于JDBC来说, Mybatis完成持久化操作也分4个步骤, 需要七个参数
4个步骤 : 连接数据库, 持久化操作, 结果集封装, 释放资源
7个参数 : 驱动类路径, 连库信息, 用户名, 密码, SQL语句, SQL参数, 结果集封装结构
2.0.在idea中创建 Maven项目
2.1.依赖包
通过Maven 导入依赖, 同时导入 MySQL数据库的驱动依赖
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.21</version></dependency>
2.2.增加配置文件( 4/7参数 )
在 resources 文件夹中增加Mybatis的配置文件 mybatis-config.xml
在文件中 指明连接数据库的 4 个信息 驱动类路径, url, 用户名, 密码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/metamooc" /><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments></configuration>
2.3.连接数据库( 1/4 操作)
建立一个操作类, 增加连接数据库代码
// 读取myBatis的配置文件Reader reader = Resources.getResourceAsReader("mybatis-config.xml");// 创建SessionFactory工厂 与数据库建立 连接 connSqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
2.4.Mapper映射 ( 3/7 参数 , 1/4 操作)
2.4.1.实体类Entity
实体类Entity 用于封装数据, 通常与数据库的表对应 , 这里以 Teacher为例
import java.io.Serializable;
import java.util.Date;/*** 教师 teacher* @TableName teacher*/public class Teacher implements Serializable {/*** 讲师主键*/private Integer tchId;/*** 讲师姓名*/private String tchName;/*** 讲师介绍*/private String tchInfo;/*** 讲师性别*/private Integer tchSex;/*** 讲师注册时间*/private Date tchRegTime;/*** 讲师头像*/private String tchPic;/*** 登录账号*/private String tchUser;/*** 登录密码*/private String tchPass;@Overridepublic String toString() {return "Teacher{" +"tchId=" + tchId +", tchName='" + tchName + '\'' +", tchInfo='" + tchInfo + '\'' +", tchSex=" + tchSex +", tchRegTime=" + tchRegTime +", tchPic='" + tchPic + '\'' +", tchUser='" + tchUser + '\'' +", tchPass='" + tchPass + '\'' +'}';}public Integer getTchId() {return tchId;}public void setTchId(Integer tchId) {this.tchId = tchId;}public String getTchName() {return tchName;}public void setTchName(String tchName) {this.tchName = tchName;}public String getTchInfo() {return tchInfo;}public void setTchInfo(String tchInfo) {this.tchInfo = tchInfo;}public Integer getTchSex() {return tchSex;}public void setTchSex(Integer tchSex) {this.tchSex = tchSex;}public Date getTchRegTime() {return tchRegTime;}public void setTchRegTime(Date tchRegTime) {this.tchRegTime = tchRegTime;}public String getTchPic() {return tchPic;}public void setTchPic(String tchPic) {this.tchPic = tchPic;}public String getTchUser() {return tchUser;}public void setTchUser(String tchUser) {this.tchUser = tchUser;}public String getTchPass() {return tchPass;}public void setTchPass(String tchPass) {this.tchPass = tchPass;}
}
2.4.2.Mapper接口
对 要执行的SQL 进行抽象声明
import com.yuan.mybatis.entity.Teacher;import java.util.List;/**
* @description 针对表【teacher(教师 teacher)】的数据库操作Mapper
* @Entity com.yuan.mybatis.entity.Teacher
*/
public interface TeacherMapper {/*** 全查*/List<Teacher> selectList();/*** 添加*/int insert(Teacher teacher);/*** 修改*/int updateById(Teacher teacher);/*** 根据id 删除记录*/int removeById(Integer id);/*** 根据id 查询一条记录*/Teacher selectOneById(Integer tchId);/*** 查询指定表的记录数*/int selectCount(String tabName);/*** 根据tch_user, tch_pass 查询一条记录*/Teacher selectOneByUserNameAndPassword(@Param("userName") String name, @Param("password") String pass);}
2.4.3. ***映射文件
在 resources 文件夹下 mapper 文件夹中 增加 Mapper接口对应的映射文件 TeacherMapper.xml
其中(重点) :
2.4.3.1. namespace
根结点 mapper 的 namespace 属性 指向 Mapper 接口
<mapper namespace="com.yuan.mybatis.mapper.TeacherMapper">
2.4.3.2.resultMap
<resultMap> 结点 与 Entity 实体类 对应 , 通过 type 属性 对应类的路径
<id> 对应 主键 字段, <result> 为普通字段
property 对应 实体类的属性名 , column 对应 字段名 , jdbcType 对应类型(这个可以不写)
<resultMap id="BaseResultMap" type="com.yuan.mybatis.entity.Teacher"><id property="tchId" column="tch_id" jdbcType="INTEGER"/><result property="tchName" column="tch_name" jdbcType="VARCHAR"/><result property="tchInfo" column="tch_info" jdbcType="VARCHAR"/><result property="tchSex" column="tch_sex" jdbcType="BOOLEAN"/><result property="tchRegTime" column="tch_reg_time" jdbcType="TIMESTAMP"/><result property="tchPic" column="tch_pic" jdbcType="VARCHAR"/><result property="tchUser" column="tch_user" jdbcType="VARCHAR"/><result property="tchPass" column="tch_pass" jdbcType="VARCHAR"/></resultMap>
2.4.3.3.SQL语句
<insert> , <delete> , <update> , <select> 是用来编写 对应SQL 语句
id 与 Mapper接口 中声明的 方法名 对应
#{属性} 在SQL语句中作属性占位符, 执行时替换成对应值, 值是从Mapper接口传入的参数对应
如果传入是实体类, 属性取类的属性
<update id="updateById" parameterType="com.yuan.mybatis.entity.Teacher">update teacherset tch_name = #{tchName},tch_info = #{tchInfo},tch_sex = #{tchSex},tch_reg_time = #{tchRegTime},tch_pic = #{tchPic},tch_user = #{tchUser},tch_pass = #{tchPass}where tch_id = #{tchId}</update>
如果传入是单个值, 可以用类型如: list , array , id 等, 或者与参数名相同
<delete id="removeById" parameterType="java.lang.Integer">delete from teacherwhere tch_id = #{id}</delete>
如果传入多个参数 , 对应的方法有多种, 推荐在传参时使用@Param("别名") 进行标注(这个可以不写)
<select id="selectOneByUserNameAndPassword" resultMap="BaseResultMap">select<include refid="Base_Column_List" />from teacherwhere tch_user = #{userName} and tch_pass = #{password}limit 1</select>
${值} 也是属性占位符, 直接替换为实际的参数值, 没有预编译效果,
只用于与参数无关的字符类型数据, 所以代表字符串时要用 单引号包围起来 '${}'
#{} 只能以预编译的形式为属性赋值 , 而 ${} 可以替代SQL语句中的表名, 字段名等结构信息
<select id="selectCount" resultType="java.lang.Integer" >select count(*)from ${tabName}</select>
2.4.3.4.delete, update
<delete> , <update> 这两个结点是用来编写 删除, 更新 对应SQL语句的
parameterType 属性 指明传入参数类型(这个可以不写)
<update id="updateById" parameterType="com.yuan.mybatis.entity.Teacher">update teacherset tch_name = #{tchName},tch_info = #{tchInfo},tch_sex = #{tchSex},tch_reg_time = #{tchRegTime},tch_pic = #{tchPic},tch_user = #{tchUser},tch_pass = #{tchPass}where tch_id = #{tchId}</update>
2.4.3.5.insert
<insert> 用于编写插入SQL语句
通常MySQL数据库主键设置成 自增长, 在添加之前不知道具体值, 通过下面的三个属性, 在添加完成后立刻可以通过实体类得到值
keyColumn=“主键字段” keyProperty=“对应实体类属性” useGeneratedKeys=“使用生成的主键, 选 : true”
<insert id="insert" keyColumn="tch_id" keyProperty="tchId"parameterType="com.yuan.mybatis.entity.Teacher" useGeneratedKeys="true">insert into teacher (tch_name, tch_info, tch_sex,tch_reg_time, tch_pic, tch_user,tch_pass)values (#{tchName}, #{tchInfo}, #{tchSex},#{tchRegTime}, #{tchPic}, #{tchUser}, #{tchPass})</insert>
2.4.3.6.SQL片段
<sql> 编写 可复用的SQL语句片段,
在其它语句中 通过 <include> 进行引入 refid与 id 属性对应
<sql id="Base_Column_List">tch_id,tch_name,tch_info,tch_sex,tch_reg_time,tch_pic,tch_user,tch_pass</sql><select id="selectList" resultMap="BaseResultMap" >select <include refid="Base_Column_List"/>from teacher</select>
2.4.3.7.select
<select> 用于编写查询SQL语句 , 通过 指定返回值类型完成结果集封装
resultMap 属性 是用于指明返回的实体类 , 与 <resultMap> 结点的 id 属性对应
<select id="selectOneById" parameterType="java.lang.Integer" resultMap="BaseResultMap">select<include refid="Base_Column_List" />from teacherwhere tch_id = #{tchId}</select>
resultType属性 也是用于指明返回值类型, 用于指明除 实体类以外的通用类型
<select id="selectCount" resultType="java.lang.Integer" >select count(*)from ${tabName}</select>
2.4.3.8.完整文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yuan.mybatis.mapper.TeacherMapper"><resultMap id="BaseResultMap" type="com.yuan.mybatis.entity.Teacher"><id property="tchId" column="tch_id" jdbcType="INTEGER"/><result property="tchName" column="tch_name" jdbcType="VARCHAR"/><result property="tchInfo" column="tch_info" jdbcType="VARCHAR"/><result property="tchSex" column="tch_sex" jdbcType="BOOLEAN"/><result property="tchRegTime" column="tch_reg_time" jdbcType="TIMESTAMP"/><result property="tchPic" column="tch_pic" jdbcType="VARCHAR"/><result property="tchUser" column="tch_user" jdbcType="VARCHAR"/><result property="tchPass" column="tch_pass" jdbcType="VARCHAR"/></resultMap><sql id="Base_Column_List">tch_id,tch_name,tch_info,tch_sex,tch_reg_time,tch_pic,tch_user,tch_pass</sql><select id="selectList" resultMap="BaseResultMap" >select <include refid="Base_Column_List"/>from teacher</select><select id="selectOneById" parameterType="java.lang.Integer" resultMap="BaseResultMap">select<include refid="Base_Column_List" />from teacherwhere tch_id = #{tchId}</select><select id="selectCount" resultType="java.lang.Integer" >select count(*)from ${tabName}</select><delete id="removeById" parameterType="java.lang.Integer">delete from teacherwhere tch_id = #{id}</delete><insert id="insert" keyColumn="tch_id" keyProperty="tchId"parameterType="com.yuan.mybatis.entity.Teacher" useGeneratedKeys="true">insert into teacher (tch_name, tch_info, tch_sex,tch_reg_time, tch_pic, tch_user,tch_pass)values (#{tchName}, #{tchInfo}, #{tchSex},#{tchRegTime}, #{tchPic}, #{tchUser}, #{tchPass})</insert><update id="updateById" parameterType="com.yuan.mybatis.entity.Teacher">update teacherset tch_name = #{tchName},tch_info = #{tchInfo},tch_sex = #{tchSex},tch_reg_time = #{tchRegTime},tch_pic = #{tchPic},tch_user = #{tchUser},tch_pass = #{tchPass}where tch_id = #{tchId}</update></mapper>
2.4.4.在配置文件中声明
在 Mybatis的主配置文件中, 增加映射文件的声明
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/metamooc" /><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><!-- 映射声明 --><mappers><mapper resource="mapper/TeacherMapper.xml"></mapper></mappers>
</configuration>
2.5.持久化操作( 1/4 操作)
持久化操作先要得到 SqlSession实例,
再得到Mapper接口的实例,
// 取出一个session 得到对数据持久化操作的句柄 stmt
SqlSession session = sqlSessionFactory.openSession();
// 通过session得到Mapper, 再通过 Mapper对象调用方法完成持久化操作
TeacherMapper teacherMapper = session.getMapper(TeacherMapper.class);
通过实例调用方法完成持久化操作 如:
// 插入数据
int insert = teacherMapper.insert(teacher);
// 查询数据List<Teacher> list = teacherMapper.selectList();
2.5.1.事务提交
进行 插入数据, 修改数据, 删除数据时 要手动处理事务
如果操作没有问题 提交事务, 出现问题 事务回滚
// 提交
session.commit();
// 或者 回滚
session.rollback();
2.6.释放资源(1/4 操作)
由于 连接数据库时 使用连接池, 所以只需要释放session实例
// 关闭 session
session.close();
相关文章:
Mybatis 框架 ( 一 ) 基本步骤
1.概念 1.1.什么是Mybatis框架 (1)Mybatis是一个半ORM(Object Relation Mapping 对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、…...
【华为OD机试真题】We Are A Team(C++javapython)100%通过率 超详细代码注释 代码优化
We Are A Team 题目描述: 总共有n个人在机房,每个人有一个标号(1<=标号<=n) ,他们分成了多个团队,需要你根据收到的m条消息判定指定的两个人是否在 一个团队中,具体的: 1、消息构成为abc,整数a、b分别代表两个人的标号,整数C代表指令 2、c = = 0 代表a和b在一…...
Oracle_Workflow_Builder工作流工具(一)
简介 目标WORKFLOW是oracle 公司的一个标准产品,它通过图形化的方式来表达业务处理过程。用户使用工作流可以灵活地定义或更改流程的结构。WORKFLOW是建立在数据库基础上的一个应用,它由后台的数据对象和前台的客户端程序组成。本文档主要介绍工作流的基…...
JavaWeb学习--RequestResponse
目录 JavaWeb学习--Request&Response 1,Request和Response的概述 request:获取请求数据 response:设置响应数据 **小结** 2,Request对象 **小结** 2.2 Request获取请求数据 **小结** 2.4 请求参数中文乱码问题 URL编码 2.5 Request请求转…...
Linux cat 命令
cat(英文全拼:concatenate)命令用于连接文件并打印到标准输出设备上。 使用权限 所有使用者 语法格式 cat [-AbeEnstTuv] [--help] [--version] fileName 参数说明: -n 或 --number:由 1 开始对所有输出的行数编…...
力扣sql中等篇练习(十四)
力扣sql中等篇练习(十四) 1 最后一个能进入电梯的人 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # 在表某一个范围内的可以考虑自连接的方式,注意连接的表只需要精准的字段 # 需要排序是因为它需要找到最后一个上车的用户 SELECT q1.person_name…...
什么是Spring FactoryBean?有什么作用?
1、什么是Spring Spring是分层的 Java SE/EE应用 full-stack 轻量级开源框架,以 IOC和AOP为内核。含有七大核心模块 2、Spring的七大模块 (1)Spring Core:核心容器提供了Spring的基本功能。核心容器的核心功能是用IOC 容器来管理类的依赖关系ÿ…...
Python List pop()方法
在Python中,列表(list)是一种有序的可变集合,可以包含任何数据类型的元素。列表对象提供了许多方法来处理列表中的元素,其中之一是pop()方法。 pop()方法用于从列表中移除并返回指定位置的元素。如果不指定位置&#…...
HJ51 输出单向链表中倒数第k个结点
写在前面: 做题环境如下: 题目渠道:牛客网 HJ51 输出单向链表中倒数第k个结点 华为机试题 编程语言:C 一、题目描述 描述 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针…...
c#笔记-内置类型
内置类型 内置类型是一些有关键字表示的类型。关键字具有非常高的优先级,可以让你在没有别的配置的情况下, 只要用的是c#就可以使用。这也意味着这些类型是非常重要,或是基本的东西。 整数:byte, sbyte, short, ushort, int, ui…...
功能齐全的 DIY ESP32 智能手表设计之原理图讲解一
相关设计资料下载ESP32 智能手表带心率、指南针设计资料(包含Arduino源码+原理图+Gerber+3D文件).zip 目录 USB部分原理图讲解 供电部分原理图讲解 USB转串口原理图讲解...
8年测试经验分享,15K的测试工程师需要掌握那些知识?
软件测试行业是随着软件产业的发展而兴起的一个重要领域,目前处于快速发展阶段。以下是软件测试行业的现状: 人才需求增长:随着互联网、移动互联网、物联网等新技术的不断发展,软件测试人才需求呈现出快速增长的趋势。越来越多的…...
利用通信基础设施提高电网的稳态稳定性(Matlab代码实现)
目录 1 概述 2 稳态稳定性分析 2.1 系统模型 2.2 稳态稳定性 2.3 问题说明 3 仿真结果 4 Matlab代码 1 概述 随着电力系统的复杂性和规模的增加,电力系统的有效控制变得越来越困难。我们提出了一种自动控制策略,该策略基于通过通信基础设施获得的…...
MySQL 一条SQL语句是如何执行的?
总览 所以今天我们把MySQL拆解一下,看看里边有哪些零件。下边是MySQL的基本架构示意图。 大体来说,MySQL分为Server层和存储引擎两部分。 Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能&am…...
plt.imshow 全黑解决办法
# 标签有时候数据偏小,需要给赋予其他颜色方便可视化 image_file "/root/autodl-tmp/datasets/consep/labels/train/000.png"classes (background,Epithelial, Inflammatory, Spindle-Shaped, Miscellaneous) palette [[0, 0, 0], [129, 127, 38], [12…...
有趣的地理题
题目 总部位于上海的“哔哩哔哩”(简称B站),是国内知名的视频网站。在B站投稿的用户被称为“UP主”。据统计,B站的UP主群体中,来自上海的比例最高,200万粉丝以上的UP主,来自上海的比例超过 30 …...
DD驱动鼠标键盘(驱动级别机器人使用鼠标键盘)
官网下载 DD虚拟键盘虚拟鼠标 github下载 GitHub - ddxoft/master 点击下载后,将驱动包下,这里以win7为例 setup运行安装 安装成功后 可以打开电脑管理,可以看见DD虚拟鼠标和键盘 这里以JAVA接入为例 使用管理员权限启动eclipse &#…...
每日学术速递4.30
CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Masked Frequency Modeling for Self-Supervised Visual Pre-Training(ICLR 2023) 标题:用于自监督视觉预训练的掩蔽频率建模 作者:Jiahao Xie, Wei Li, Xi…...
K8S部署及常见问题处理
目录 k8s kubeadm 一键自动化,安装k8s集群,安装所有运行需要的组件 一、环境初始化(三台机器都需要执行) 主机名、节点ip、部署组件 1、配置hosts(主节点master和业务节点node都需要配置)文件内容 2、…...
通过Robotstudio修改机器人程序的具体方法和步骤
通过Robotstudio修改机器人程序的具体方法和步骤 基本步骤可参考以下内容: 用网线连接机器人和电脑,机器人一侧要插入LAN2口;机器人和电脑的IP地址要在同一个网段内;请求写入权限;修改程序—编译—应用;加载修改后的程序到机器人;保存Robotstudio程序到电脑端;只能修改…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...
