小不的笔记

时间之外的往事

mysql 删除行数据

删除单表数据

1
DELETE FROM table_name WHERE column_name  = 'value'    

删除单表数据带别名

1
DELETE t FROM table_name t WHERE t.column_name  = 'value'    

删除单表数据带 LEFT JOIN

1
DELETE t1 FROM table_name1 t1 LEFT JOIN table_name2 ON t2 t1.key = t2.key WHERE t2.column_name2  = 'value'    

删除多表数据带 INNER JOIN

1
DELETE t1, t2 FROM table_name1 t1 INNER JOIN table_name2 ON t2 t1.key = t2.key WHERE t2.column_name2  = 'value'    

删除单表数据带同表子查询

如果直接使用同表子查询, SQL会无法执行 “You can’t specify target table for update in FROM clause”

可以通过把子查询包括在另一个子查询里,强制MySQL生成一个临时表来解决。

1
2
3
DELETE FROM table_name WHERE id IN (
SELECT tp.id FROM (SELECT id FROM table_name WHERE column_name = 'value2') tp
)

也可以尝试使用关联自身(LEFT/INNER JOIN)的方式来删除。

删除所有数据

1
DELETE FROM table_name

也可以使用

1
TRUNCATE TABLE table_name;

DELETE 语句可以生成binlog,在事务内可以还能回退,会触发Triggers,但不会自动释放表空间。
TRUNCATE 不会产生binlog,也不能回退,不会触发Triggers,但是能释放表空间,还有他很快。。。

jdk8-method-reference

方法引用

简介

方法引用是一种在 Java 中使用现有方法来创建简洁的 lambda 表达式的方式。它可以让你直接指向现有方法,而无需重新定义方法体。方法引用可以使代码更加简洁、易读,并减少冗余。

...More

Java8 default method

Java8 引入”默认方法”的新特性,它允许开发者不破坏现有的接口实现的前提下给接口添加新的方法。它提供了灵活性,允许接口定义实现并在具体类未提供该方法的实现时使用默认实现。这个特性部分实现了多重继承的功能,在接口的演化和代码复用方面都非常实用。

...More

dorado unkown package

正常部署的 dorado 项目在启动一段时间之后访问会报unkown package [widget]。因为 dorado 在启动时会把资源文件解压到临时目录里,可能是资源文件被清理掉导致的错误。

...More

Maven 跳过测试 skip test

跳过测试并不是一个好的做法,但是很多时候不得不这么做:D

通过命令行

1
2
3
4
5
6
7
8
9
# 编译测试类,跳过测试类的执行
mvn clean package -DskipTests
# 跳过测试类的编译和执行
mvn clean package -Dmaven.test.skip=true

# 跳过测试类的编译和执行,PowerShell 专属写法。
mvn clean package --% -Dmaven.test.skip=true
mvn clean package `-Dmaven.test.skip=true
mvn clean package '-Dmaven.test.skip=true'

...More

dorado 接口安全风险

dorado 封装了Ajax请求,导致在权限处理上与传统Web项目还是有很大的区别。dorado下,暴露一个服务可以通过@Expose@DataProvider@DataResolver等注解。 比如,我想提供一个接口,参数为name, 返回值为"Hello " + name, 我只需要写一个Java方法,同时把类注册到Spring上下文,并在方法上标注@Expose

1
2
3
4
5
6
7
@Service
public class DemoController {
@Expose
public String hello(String name) {
return "Hello " + name;
}
}

像这样的一个接口,在任何一个dorado页面都可以通过构建一个AjaxAction,并配置service为beanId#方法名的形式 demoController#hello, 就可以调用这个方法。

1
2
3
4
5
6
new dorado.widget.AjaxAction({
service: "demoController#hello",
parameter: "xobo"
}).execute(function(result) {
console.log(result)
})

dorado封装了HTTP请求,所有的请求统一发给URL /dorado/view-service,然后由报文内容决定调用哪一个接口。 dorado 的这一特性导致,无法通过拦截URL的方式管理接口的权限,只能通过AOP的方式去拦截方法从而实现接口的管理。每个页面都会提供大量的接口,不同的页面可能会使用相同的接口。会导致接口权限的配置变得特别复杂。 从简化配置的角度,可以通过解析dorado view建立dorado接口与页面的映射,通过判断是否有权限访问接口所在的页面来判断能否访问接口。然后对需要更细粒度管理的接口做一个额外的配置。 基于此思路开发了 dorado exposedservice security https://github.com/cnxobo/dorado-exposedservice-security.git ,以解决dorado接口安全问题。

NUC8 黑果Monterey启动特别慢

NUC8 黑果 Monterey 启动特别慢

三星的某些型号的 SSD,比如我的 970 EVO plus,执行 TRIM 的操作特别的慢。而在 APFS 上,如果启用了 TRIM,macOS 会在启动的时候执行一次 TRIM 操作释放未使用的空间,就会导致启动速度特别的慢。 可以通过升级 OpenCore 到 0.7.9 及以上版本,然后设置SetApfsTrimTimeout值为 0(默认为-1)关闭启动时的 TRIM 操作以提升启动速度,我的是从启动时间 5 分钟提升到 20s。

macOS 12.0 及以上版本 SetApfsTrimTimeout超时功能失效只有 0 禁用,及其值开启。

...More

Spring Security 3 升级导致 Request method 'POST' not supported

一个上古项目由于安全原因需要升级依赖,其中Spring 版本需要由3升级到5。完成版本升级之后GET请求的接口都是正常的,POST请求的接口都会报Request method ‘POST’ not supported。

[AbstractHandlerExceptionResolver:199] - Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method ‘POST’ not supported]

在debug跟踪代码,发现请求会在CsrfFilter里被转发到/然后报错。通过查阅Spring迁移文档3to4发现,Spring Security4开始默认启用Csrf。由于之前项目并不支持Csrf,导致权限框架把请求拦截下来。给项目配置禁用Csrf就可以了。<csrf disabled="true"/>

1
2
3
4
<http>
...
<csrf disabled="true"/>
</http>