自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

桥边驿语人的博客

主要领域:java后端

  • 博客(48)
  • 资源 (9)
  • 收藏
  • 关注

原创 【学习计划】《MySQL实战45讲》03 | 事务隔离:为什么你改了我还看不见?

文章目录一、新名词1. 事务2. ACID二、新指令1. show index2. analyze table3. force index三、新参数1. innodb_stats_persistent四、新知识点1. **MySQL** 中支持事务的引擎2. 脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)五、小结索引选择异常和处理一、新名词1. 事务事务就是要保证一组数据库操作,要么全部成功,要么全部失败。2. ACIDACI

2022-05-24 17:22:44 138

原创 【学习计划】《MySQL实战45讲》02 | 日志系统:一条SQL更新语句是如何执行的?

文章目录一、新名词1. redo log2. binlog(归档日志)3. WAL4. crash-safe二、新参数1. innodb_flush_log_at_trx_commit2. sync_binlog三、新知识点1. redo log 与 binlog 的不同2. update 语句执行流程3. 两阶段提交四、小结一、新名词1. redo logInnoDB 引擎特有的日志。2. binlog(归档日志)Server 层也有自己的日志3. WALWAL 的全称是 Write-Ah

2022-05-14 17:07:28 158

原创 【学习计划】《MySQL实战45讲》01 | 基础架构:一条SQL查询语句是如何执行的?

文章目录MySQL的逻辑架构图一、新指令1. mysql_reset_connection二、新参数1. wait_timeout三、新知识点1. MySQL 可以分为几部分?2. Server 层包含哪些?3. 存储引擎层负责什么?4. 防止长连接被系统强行杀掉的解决方案。5. 查询缓存6. 分析器做了什么?7. 优化器做了什么?8. 执行器做了什么?MySQL的逻辑架构图一、新指令1. mysql_reset_connectionmysql>mysql_reset_connection

2022-05-06 16:40:35 206

原创 【学习计划】《MySQL实战45讲》18 | 为什么这些SQL语句逻辑相同,性能却差异巨大?

文章目录案例说明1. 条件字段函数操作2. 隐式类型转换3. 隐式字符编码转换案例说明1. 条件字段函数操作示例代码:mysql> select count(*) from tradelog where month(t_modified)=7;对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能。需要注意的是,优化器并不是要放弃使用这个索引。放弃了树搜索功能,优化器可以选择遍历主键索引,也可以选择遍历索引 t_modified,优化器对比索引大小后发现,索

2022-05-06 11:17:19 121

原创 【学习计划】《MySQL实战45讲》17 | 如何正确地显示随机消息?

文章目录一、新名词1. 内存临时表2. 磁盘临时表3. 优先队列算法二、新参数1. tmp_table_size2. internal_tmp_disk_storage_engine三、新知识点1. rand()2. rowid,每个引擎用来唯一标识数据行的信息。3. 随机排序方法四、小结一、新名词1. 内存临时表对于内存表,回表过程只是简单地根据数据行的位置,直接访问内存得到数据,根本不会导致多访问磁盘。优化器没有了这一层顾虑,那么它会优先考虑的,就是用于排序的行越少越好了,所以,MySQL这时就

2022-05-06 07:11:27 465

原创 【学习计划】《MySQL实战45讲》16 | “order by”是怎么工作的?

文章目录一、说明示例二、新名词1. 全字段排序2. rowid排序3. sort_buffer3. sort_buffer_size三、新参数1. max_length_for_sort_data四、新知识点1. 排序在内存中完成,也可能需要使用外部排序?2. 确定一个排序语句是否使用了临时文件的方法3. 全字段排序 VS rowid排序一、说明示例假设你要查询城市是“杭州”的所有人名字,并且按照姓名排序返回前1000个人的姓名、年龄。假设这个表的部分定义是这样的:CREATE TABLE `t`

2022-05-05 22:40:25 156

原创 【学习计划】《MySQL实战45讲》15 | 答疑文章(一):日志和索引相关问题

文章目录日志相关问题1. MySQL怎么知道binlog是完整的?2. redo log 和 binlog是怎么关联起来的?3. 处于prepare阶段的redo log加上完整binlog,重启就能恢复,MySQL为什么要这么设计?4. 如果这样的话,为什么还要两阶段提交呢?干脆先redo log写完,再写binlog。崩溃恢复的时候,必须得两个日志都完整才可以。是不是一样的逻辑?5. 不引入两个日志,也就没有两阶段提交的必要了。只用binlog来支持崩溃恢复,又能支持归档,不就可以了?6. 那能不能反过

2022-05-05 17:00:19 152

原创 【学习计划】《MySQL实战45讲》14 | count(*)这么慢,我该怎么办?

文章目录一、新知识点1. count(*)的实现方式2. 为什么InnoDB不跟MyISAM一样,也把数字存起来呢?3. 把计数保存在Redis和数据库的区别4. count(字段),count(主键id),count(1)和count(*)一、新知识点1. count(*)的实现方式MyISAM引擎把一个表的总行数存在了磁盘上,因此执行count(*)的时候会直接返回这个数,效率很高;而InnoDB引擎就麻烦了,它执行count(*)的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。

2022-05-03 17:51:29 89

原创 【写代码的小技巧】比较器Comparator的简单理解

文章目录一、使用场景二、通用示例1.List 中 sort 方法三、要点一、使用场景包含但是不局限于以下场景使用。List 中 sort 方法。二、通用示例1.List 中 sort 方法代码如下(示例):public static void main(String[] args) { List<Integer> list = new ArrayList<>(); list.add(1); list.add(4); list.

2022-05-03 17:15:56 184

原创 【学习计划】《MySQL实战45讲》13 | 为什么表数据删掉一半,表文件大小不变?

文章目录一、新名词1. “Online DDL”2. “inplace”二、新指令alter table三、新参数1. innodb_file_per_table四、新知识点1. drop table 和 delete2. 数据页的复用3. 删除数据造成的空洞4. 插入数据造成的空洞5. Online 和 inplace 的关系6. optimize table、analyze table和alter table这三种方式重建表的区别。五、小结数据库中收缩表空间的方法一、新名词1. “Online D

2022-05-03 14:59:17 802

原创 【学习计划】《MySQL实战45讲》12 | 为什么我的MySQL会“抖”一下?

文章目录一、新名词1. “脏页”2.“干净页”3. flush二、新参数1. innodb_io_capacity2. innodb_max_dirty_pages_pct3. innodb_flush_neighbors三、新知识点1. 什么情况会引发数据库的flush过程?2. 刷脏页对性能的影响3. 刷脏页写盘4. 内存页的三种状态一、新名词1. “脏页”当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。2.“干净页”内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一

2022-05-01 17:19:19 669

原创 【写代码的小技巧】初始化数组中的最大值和最小值

文章目录一、使用场景二、通用示例1.求数组中最大值与最小值的差值(初始化为数组的第一个元素)2.求数组中最大值与最小值的差值(初始化为 -1)三、要点四、总结一、使用场景包含但是不局限于以下场景使用。求数组中最大值与最小值的差值。例如,数组 [0, 2, 6, 10],最大值与最小值的差值为 8。二、通用示例1.求数组中最大值与最小值的差值(初始化为数组的第一个元素)代码如下(示例):public static void main(String[] args) { int[

2022-04-30 15:32:24 424

原创 【学习计划】《MySQL实战45讲》11 | 怎么给字符串字段加索引?

文章目录一、新名词前缀索引二、小结三、示例1. 前缀索引2. 倒序存储3. 使用hash字段一、新名词前缀索引定义字符串的一部分作为索引。二、小结字符串字段创建索引的场景可以使用的方式有:直接创建完整索引,这样可能比较占用空间;创建前缀索引,节省空间,但会增加查询扫描次数,并且不能使用覆盖索引;倒序存储,再创建前缀索引,用于绕过字符串本身前缀的区分度不够的问题;创建hash字段索引,查询性能稳定,有额外的存储和计算消耗,跟第三种方式一样,都不支持范围扫描。三、示例1. 前缀索

2022-04-25 22:46:54 680

原创 【写代码的小技巧】水塘抽样的简单理解

文章目录一、简单理解二、通用示例水塘抽样示例三、要点四、总结一、简单理解水塘抽样的证明过程可以到网上找,有特别详细的说明。这里给出自己的简单理解,方便记忆,也方便写代码。水塘抽样,可以在数组中以相同的概率获取目标元素的位置。比如,数组 [1, 2, 3, 3, 3],目标元素 3,返回索引 2, 3 或者 4 。二、通用示例水塘抽样示例代码如下(示例):public class RandomPickIndex { int[] nums; Random random =

2022-04-25 16:58:31 86

原创 【学习计划】《MySQL实战45讲》10 | MySQL为什么有时候会选错索引?

文章目录一、新名词1. 索引的“区分度”2. “基数”(cardinality)二、新指令1. show index2. analyze table3. force index三、新参数1. innodb_stats_persistent四、新知识点五、小结索引选择异常和处理一、新名词1. 索引的“区分度”一个索引上不同的值越多,这个索引的区分度就越好。基数越大,索引的区分度越好。2. “基数”(cardinality)索引上不同的值的个数。二、新指令1. show indexsh

2022-04-24 22:02:28 673

原创 【写代码的小技巧】与(&)的使用

文章目录一、使用场景二、通用示例1. 给定一个正整数 n,找到并返回 n 的二进制表示中两个 相邻 1 之间的 最长距离 。三、要点四、总结一、使用场景包含但是不局限于以下场景使用。判断当前正整数的二进制末位是 1 。(结合位移使用,效果更佳)二、通用示例1. 给定一个正整数 n,找到并返回 n 的二进制表示中两个 相邻 1 之间的 最长距离 。代码如下(示例):public static void main(String[] args) { // 22 的二进制是 "10

2022-04-24 16:12:47 287

原创 【写代码的小技巧】相邻位置的判断

文章目录一、使用场景二、通用示例1.字符串中连续相同字符2.字符串中包含多少个单词或者数值三、要点四、总结一、使用场景包含但是不局限于以下场景使用。字符串中连续相同字符。例如,“abbccc”判断最大连续相同字符数。字符串中包含多少个单词或者数值。例如,“a, bb, ccc”,“1, 22, 33”。二、通用示例1.字符串中连续相同字符代码如下(示例):public static void main(String[] args) { String s = "abbcc

2022-04-24 15:48:02 287

原创 【力扣问题记录】819. 最常见的单词

文章目录一、题目二、完整代码三、问题记录四、解决问题一、题目给定一个段落 (paragraph) 和一个禁用单词列表 (banned)。返回出现次数最多,同时不在禁用列表中的单词。题目保证至少有一个词不在禁用列表中,而且答案唯一。禁用列表中的单词用小写字母表示,不含标点符号。段落中的单词不区分大小写。答案都是小写字母。题目链接如下:819. 最常见的单词二、完整代码代码如下(示例):class Solution { public String mostCommonWord(Str

2022-04-22 04:56:16 62

原创 【学习计划】数据结构与算法之美

数据结构与算法之美

2022-04-22 00:55:21 51

原创 【写代码的小技巧】字符串转数值运算

文章目录一、使用场景二、通用示例字符串中数值的总和三、要点四、总结一、使用场景包含但是不局限于以下场景使用。字符串中数值的总和。例如,“11, 22, 33”求数值总和。二、通用示例字符串中数值的总和代码如下(示例):public static void main(String[] args) { String s = "11,22,33"; char[] chars = s.toCharArray(); int len = s.length();

2022-04-16 10:00:00 284

原创 【写代码的小技巧】字符串中字符的连续性判断

【写代码的小技巧】字符串中字符的连续性判断1.字符串中连续相同字符2.字符串中包含多少个单词或者数值

2022-04-15 17:01:40 2060

原创 力扣解题:第三题(个人思路整理)

解题思路一步步拆解、补充,直到完整解题1.首先想到的是需要循环整个字符串class Solution { int lengthOfLongestSubstring(String s) { // 循环整个字符串 int len = s.length(); for (int i = 0; i < len; i++) { } return 0; }}2.整个解题的过程大致是:1)从最左边的字符

2020-11-02 09:50:49 427

原创 java类中无法识别依赖包的问题

前段时间因为当前项目比较闲,被换到其他项目组做事情。换项目组带来的问题是,需要下载新的项目,并配置新的开发环境。这次换项目的过程中,有个环节让我花了不少时间折腾,以下就是遇到的问题。问题:下载新的项目,并配置新的开发环境后,启动项目时发现异常。异常情况为,依赖包都下载,也都更新了,但是类中始终无法识别到依赖包。解决办法:删除之前所有的依赖包,重新导入依赖包。...

2020-09-08 11:42:08 567

原创 Maven 的 Pom.xml 无法正常下载依赖包

今天说一个小问题,依赖包的下载。虽然看起来是小事,但是一不小心也能折磨你一整天。之前有个依赖包就困扰了我一段时间,oracle 的依赖包。依赖关系如下:<dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>11.2.0.1.0</version></dependency>

2020-05-27 00:14:37 1337

原创 简单说明:list.forEach 中变量必须为 final 的问题

可能有些人没遇到过 list.forEach 中变量必须为 final 的问题,那就先举两个例子示例1,如下:public static void main(String[] args) { List<String> stringList = new ArrayList<>(); stringList.add("a"); stringList.add("b"); stringList.add("c"); stringList.add("d"

2020-05-27 00:13:54 5456 4

原创 简单说明:ArrayList 在 For 循环中进行删除而产生异常的原因

经常会有人这么对 list 进行遍历,错而不自知。示例代码如下:public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); list.add("ddd"); for (String str : list) { if

2020-05-27 00:13:20 528 2

原创 Mybatis Plus 中 参数传递的优化之路

从项目开始使用 Mybatis Plus 到现在,对 Mapper 传递参数的方式做了多个版本的改进和优化。这篇文章主要讲解在改版和优化过程中遇到的问题,以及当时的一些想法。第一版:单个参数传递传递方式如下:UserMapper.javaList<UserVO> getUserList(String name);UserMapper.xml<!--查询所有用户信息--><select id="getUserList" resultMap="UserVOMap"&

2020-05-27 00:12:48 2799

原创 两张不同的表数据组成树形结构的解决办法

场景当需要将两张不同表的数据进行合并处理,并且两张表的主键均为自增,主键同是数字。这时候需要区分的、不同的表进行取值,可以使其中一张表的主键为负数,即-1,-2,-3。当需要把取出来的两张表分别再存进数据库时,要将之前取值是负数的主键转为正数,而转为正数的方式也很简单,也就是负负得正,即(-(-1)) = 1具体示例将系统表和菜单表的数据组合成树的形式,示例如下:[{ id: 1, lable: 基础数据, parentId: null, children: [

2020-05-27 00:07:48 2609 1

原创 关于表变动而导致的实体变动问题

因为表变动而导致的实体变动问题,出现这种情况较多的是版本迭代的时候。项目开发初期,表变动导致的代码改动量相对较小,改动后出现的问题也比较少。而在项目迭代的过程中,因为项目已经成型,大部分代码的逻辑和用法都已固定。此时表变动将有可能导致大量业务逻辑代码不可用。这篇文章就说说因为表变动而需要修改的代码部分。在此之前先说两个修改代码的小诀窍。修改代码的诀窍诀窍一:如果你用的开发工具是 IDEA 的话,你可以选中类名,然后按下 shift + F6 ,这时候会出现修改类名的对话框。在此处修改类名,将会把

2020-05-27 00:06:29 412

原创 SQL 中 Left Join 转为 Inner Join 的实际应用

之前我写过一篇文章叫做,《SQL 中 关于Left Join 转为 Inner Join 的问题》。文章中给出的一个结论是:左关联的查询语句中,只要有 where 的过滤条件,那么该语句将被转为内关联。继续上一篇的内容,在这篇文章中我来说说在日常开发中的一个实际应用。说来简单,但是不知道的人也经常颇受困扰。应用:对 Left Join 之后的数据进行过滤,即对左关联之后的数据进行过滤还是用前一篇文章的例子来说明,建表语句和造数语句均可在前一篇找到,在此不做累赘。需求说明:进入界面的时候,需要根据需

2020-05-27 00:02:06 464

原创 结合 Mybatis,探讨 Oracle 中 in 与 not in 的陷阱

一、Oracle 中的 in 与 not in1. 正常情况下的使用查询语句使用 in 和 not in 的例子--表:T_USER,USER_ID 有 1,2,3,4,5,6--查询 userId 中包含1,2,3的数据--查询结果:1,2,3SELECT * FROM T_USER T WHERE T.USER_ID IN (1, 2, 3);--查询 userId 中不包含1,2,3的数据--查询结果:4,5,6SELECT * FROM T_USER T WHERE T.USER

2020-05-26 23:56:12 1034

原创 一个“保存”按钮同时存在“增删改”三种操作,该如何去实现?

一般情况下,对表格中的数据进行“增删改”操作,都是直接操作数据库。现在有些项目因为设计或者优化的缘故,不对表格中的数据进行“增删改”,而是通过最后“保存”按钮的操作,一次性将数据传至服务器,由服务器对数据进行“增删改”。以下通过给用户分配角色这样的功能进行说明。操作界面大致如下(直接手画,略显粗糙,能看明白就行):序号用户角色1用户A角色A2用户A角色B...

2019-07-22 11:21:30 1872 3

原创 Oracle 中关于 Between and 日期边界问题

之所以会写日期边界范围的问题,是因为我在查询日期的时候,刚开始数据都能正常获取,但是突然有些数据获取不到。刚开始以为是 Between and 的边界问题。但是经过一番折腾发现,发现是 Oracle 在对日期格式的字段进行查询时,会对字符串进行了隐式转换。以下就是错误的查询语句-- create_time 的时间为 2019/3/26 23:00:00SELECT * FROM T_CL...

2019-04-20 23:13:18 12485 4

原创 Java异常被抛出或被捕获之后,代码是否继续执行的问题

结论从下面的测试结果很容易看出,左关联的查询语句中,只要有 WHERE 的过滤条件,那么该语句将被转为内关联。一、创建表演示使用,随便创建两张表--班级表CREATE TABLE T_CLASS( class_id NUMBER not null, class_name VARCHAR2(100))--学生表CREATE TABLE T_STUDENT( student...

2019-04-20 23:08:16 438

原创 对 Stream 中 Map 与 ForEach 做个简单说明

经常会有童鞋把 Map 和 Foreach 用错,可能会出现如下用法:List&lt;Student&gt; studentChangeList = studentList.stream() .forEach(student -&gt; student.setAge(99));有些编译器会直接报错,比如 IDEA。因为 ForEach 是没有返回值的,ForEach 处理过的...

2019-03-13 15:01:00 9196

原创 SQL中关于Left Join转为Inner Join的问题,即左关联转为内关联的问题

先说结论所谓实践出真知,个人也是因为对 Left Join 转为 Inner Join 的问题有疑问,于是逐一尝试,最后得出结论。从下面的实验结果很容易看出,在有左关联的查询语句中,只要有 WHERE 的过滤条件,那么该语句将被强制转为内关联。一、创建表演示使用,随便创建两张表--班级表CREATE TABLE T_CLASS( class_id NUMBER not null,...

2019-03-07 17:03:00 3157 4

原创 Mybatis Plus 2 升到 Mybatis Plus 3 时,oracle 自增序列的相关问题

一、Mybatis Plus 2,oracle 自增序列配置1. config.yml 配置文件#mybaits-plus配置,修改主键类型,mapper.xml、type 别名等mybatis-plus: mapper-locations: classpath:/mapper/*Mapper.xml global-config: #主键类型 0:&quot;数据库ID自增&quot;, 1:...

2019-01-17 09:10:20 6915 7

原创 Java项目启动时,oracle 驱动异常

报错信息:项目启动的时候,一直会报“registered driver with driverclassname=oracle.jdbc.driver.oracledriver was not found, trying direct instantiation.”。原因: Oracle 9i 之后,建议使用 oracle.jdbc.OracleDriver ,而不是 oracle.jdbc....

2018-12-18 08:51:41 5142

原创 window 下安装 Arthas

个人因为好奇在 Windows 系统下安装了 Arthas。有一个官方的坑,坑了我好几天,这里给正准备安装使用的小伙伴提醒下。在 Windows 下安装 Arthas,官方文档有这么一段描述:我在安装过程中遇到的坑就是关于 conemu不推荐使用官方文档说的 conemu,因为 Arthas 无法在该工具中正常启动。(本人亲测)直接用 Windows 自带的 cmd 可以正常使用 Ar...

2018-11-13 09:30:05 7635 2

原创 postman 中给所有接口token授权的配置

第一步配置生成token的接口在test中添加传递token的代码:代码如下:pm.test(&quot;Status code is 200&quot;, function () { pm.response.to.have.status(200); });// 把responseBody转为json字符串 var data = JSON.parse(re...

2018-10-25 11:42:59 4665 2

Minio:Java Client 快速入门指南和API参考文档

个人导出这两部分,方便平时查看使用。官方文档地址:https://docs.minio.io/。官方有中文翻译,在左上角可以切换

2019-02-18

JUnit 测试用例的20条最佳实践(中文版)

原文地址:https://dev-cheats.com/java/unit-testing-best-practices-junit-reference-guide.html 这个资源是把文章整理成PDF,方便本地查看。

2018-09-26

Oracle_PLSQL培训文档

PL/SQL是Procedure Language & Structured Query Language(过程化SQL语言)的缩写,是对SQL语言存储过程语言的扩展。它最大的优点是提供了一种服务器端存储过程语言,可以对数据进行快速高效的处理。 此文档对存储过程、触发器做了详细的说明,并附有实例。很适合初学者的入门学习。

2018-06-02

Spring Security 参考手册Spring Security中文版

很多独立软件供应商,因为灵活的身份验证模式二选择Spring Security。这样做允许他们快速的集成到他们的终端客户需求的解决方案而不用进行大量工程或者改变客户的环境。如果上面的验证机制不符合你的需求,Spring Security 是一个开放的平台,要实现你 自己的验证机制检查。 为了阅读方便,自己导出的文档,格式为HTML,文件也相对较小。 文档原地址:https://springcloud.cc/spring-security-zhcn.html

2018-05-29

HTTP的REST服务简介和最佳实践

一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式。”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则。 博文地址:https://blog.csdn.net/adparking/article/details/52278794 此PDF文档,只为方便阅读查看

2018-05-16

spring MVC 学习指南

spring MVC 学习指南

2017-01-27

Oracle_PLSQL培训文档

要学Oracle_PLSQL,这个文档很好!自己正在学习中!跟大家一起分享!补充一下:这里面的是基础内容!我自己正在学习的也是基础!

2012-07-17

张孝祥正在整理Java就业面试题大全

里面的面试题比较完整,而且有答案解释,共147页。内容分为以下几部分:1.学习方向与面试简历的相关问题;2. 笔试答题技巧与若干问题;3. 笔试题之Java基础部分;4. 算法与编程;5. html&JavaScript;&ajax;部分;6. Java web部分;7. 实际项目开发;8. 数据库部分;9.XML部分;10.流行的框架与新技术;11. 软件工程与设计模式;12.j2ee部分;13.ejb部分;14.webservice部分;15.Linux(这个只有一题);16. 问得稀里糊涂的题;17. 其他(向张孝祥老师致敬)不小心弄得高了!如果有需要的话,留个邮箱,我发给你们。大家一起分享才是最重要的!希望大家都能找到好工作。

2012-07-17

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除