文章目录
- MySQL自定义排序
- 用locate本质是数字排序
- case when then...语法排序
- field()函数排序
- 阿里云Maven镜像仓库无法下载spring-cloud-dependencies依赖问题
- MySQL更新同一个表的同个字段
- 解决方法一(推荐)
- 解决方法二
- SpringBoot返回的JSON中的null转换为空字符串
- Spring的相关注解
- MySQL JSON对象、数组查询
- JSON对象查询
- JSON数组查询
- Nacos的配置自动刷新
- @Value注解读取配置
- @ConfigurationProperties(prefix = "user")注解注入实体类 读取配置
- Nacos基于profile粒度的多环境配置
- Nacos服务配置数据模型
- Nacos数据持久化
- 解决Nacos 1.3.1连接MySQL 8数据库报错
- Spring事务机制
- Spring事务嵌套和传播行为
- Spring事务失效场景
- MySQL 8修改用户密码
- Validation支持同时加两个@Pattern注解
- Validation自定义注解实现:不为空才进行正则表达式校验
- Linux防火墙给某个端口添加指定ip
- Mysql order by中使用case when
- 批量导入MySQL报错
- 鼠标右键没有360压缩菜单的解决
MySQL自定义排序
用locate本质是数字排序
用locate本质是数字排序,可以先把数字打印出来
SELECT id, second_class, LOCATE(second_class, '【现场发布】世界互联网大会领先科技成果,世界互联网大会领先科技成果,国际电联WSIS奖-Winner(最高项目奖),国际电联AI/ML in 5G大赛奖,国际电联WSIS奖-Winner(大奖)') AS sort
FROM t_awards
WHERE award_type = '8' AND top_class = '国际奖项';
不存在与LOCATE中的记录,结果集会放到最前面。
建议用倒序排。
case when then…语法排序
SELECT id, second_class,
case
when second_class = '【现场发布】世界互联网大会领先科技成果' then 20
when second_class = '世界互联网大会领先科技成果' then 18
when second_class = '国际电联WSIS奖-Winner(最高项目奖)' then 16
ELSE -1 END as sort
FROM t_awards
ORDER BY sort desc
field()函数排序
ORDER BY FIELD(second_class,'【现场发布】世界互联网大会领先科技成果','世界互联网大会领先科技成果','国际电联WSIS奖-Winner(最高项目奖)') desc;
不存在与field中的记录,结果集会放到最前面。
建议用倒序排。
参考链接
阿里云Maven镜像仓库无法下载spring-cloud-dependencies依赖问题
http://maven.aliyun.com/nexus/content/groups/public/
上面这个url下载不了,更换url链接即可:
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
参考链接
MySQL更新同一个表的同个字段
MySQL在同一SQL语句中,如果不能先查询出表中的某些值,再update这个表。
例如:
// 这样做会报错:You can't specify target table 'table name' for update in FROM clause。
UPDATE 表A
SET 字段A = (SELECT 字段B FROM 表A)
解决方法一(推荐)
update 表1 a1
inner join (select 字段1,字段2 from 表1 where 条件) a2 on 条件
set a1.字段1 = a2.字段2
解决方法二
创建一张临时表
参考链接
SpringBoot返回的JSON中的null转换为空字符串
Jackson自定义序列化null值处理(处理数组、list、array、set类型的null值)
springboot中返回值json中null转换空字符串
Spring的相关注解
@ConditionalOnMissingBean
@ConditionalOnProperty
@ConditionalOnBean
@Primary
参考链接
MySQL JSON对象、数组查询
JSON对象查询
- 使用对象操作的方法进行查询:字段->‘$.json属性’
- 使用函数进行查询:json_extract(字段, ‘$.json属性’)
- 获取JSON数组/对象长度:JSON_LENGTH()
JSON数组查询
- 对象操作方式查询:字段->‘$[0].属性’
- 使用函数查询:JSON_CONTAINS(字段,JSON_OBJECT(‘json属性’, ‘内容’))
- 获取JSON数组/对象长度:JSON_LENGTH()
示例:
// detail_list为JSON数组字段 flowKey、opened为数组中的对象属性
select json_contains(detail_list, json_object('opened', '1')) as opened
from t_flow_path
where json_contains(detail_list, json_object('flowKey', 'threeLeaderAudit'));
参考链接
Nacos的配置自动刷新
@Value注解读取配置
在该类上添加@RefreshScope注解
@ConfigurationProperties(prefix = “user”)注解注入实体类 读取配置
默认支持自动刷新配置
Nacos基于profile粒度的多环境配置
读取(Data Id)文件格式:
${spring.application.name}-${spring.profiles.active}.${nacos.config.file-extension}
比如在Nacos上新增一个Data Id为:nacos-config-dev.yaml的基础配置
需要在项目的配置文件中增加
spring.profiles.active=dev
激活配置
Nacos服务配置数据模型
一共有三种配置方案:
1、
默认命名空间(public) + 默认Group分组(DEFAULT_GROUP) + 自定义Data Id(没有默认值)
2、
默认命名空间 + 自定义Group分组 + 自定义的Data Id(没有默认值)
3、
自定义命名空间 + 自定义Group分组 + 自定义的Data Id(没有默认值)
详情可以参考20200804课件.docx
Nacos数据持久化
解决Nacos 1.3.1连接MySQL 8数据库报错
解决方法如下:
第一步:在nacos安装目录下新建plugins/mysql文件夹,并放入mysql-connector-java-8.0.18.jar
我的数据库是8.0.27,用这个包可以连接上。
windows和linux都需要做这一步。
第二步:修改conf/application.properties文件中的数据库信息。注意需要修改url链接。
#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://10.1.128.188:3306/nacos_config?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2b8
db.user=root
db.password=
注意url ?号后的内容需要修改,nacos默认的连接Mysql 8会报错
解决Nacos无法连接Mysql8.0+的问题(坑爹的阿里官方文档,已无力吐槽)
Spring事务机制
- Spring事务底层是基于数据库事务和AOP的,Spring事务隔离级别对应的是数据库的隔离级别。
- Spring事务的传播行为是自己实现的,也是Spring事务中最复杂的。
- Sprino事务的传播机制是基于数据库连接来做的,一个数据库连接一个事务,如果传播机制配置为需要新开一个事务,那人实际上就是先建立一个
数据库连接,在此新数据库连接上执行sql。
Spring事务嵌套和传播行为
- 在同一个类中事务嵌套,最终的结果应该是取决于最外层的方法事务的传播特性。
- 在不同的类的事务嵌套,外层的方法按照外层的事务传播属性执行,内层的传播属性按照内层的传播属性的特点去运行。注意:内层方法如果没有加事务注解会以外层方法事务为准,内层方法如果加了事务注解会以内层方法事务为准。
事务嵌套和传播行为
Spring事务失效场景
- 事务方法访问修饰符不是public。
- 事务方法是static、final的。
- 事务方法中的异常被catch后,没有再次抛出新的异常。
- 操作的数据库表如果本身不支持事务。
- 多线程的调用导致事务失效。
有两种解决方法:1、可以使用thread.setUncaughtExceptionHandler方法来处理线程内部的异常。 2、外层方法使用FutureTask,并且抛出ExecutionException, InterruptedException。
事务失效场景
MySQL 8修改用户密码
-- 修改密码
alter user 'root'@'%' IDENTIFIED BY '新密码';
-- 刷新权限
flush privileges;
参考链接
Validation支持同时加两个@Pattern注解
@Pattern(regexp = "111|3", message = "奖项等级类型有误1")
@Pattern(regexp = "111|4", message = "奖项等级类型有误2")
private String topClass;
Validation自定义注解实现:不为空才进行正则表达式校验
/**
* 自定义注解整合 javax.validation:不为空才进行正则表达式校验
*
* @author liquanhong
* @createTime 2023/05/26
*/
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = NotBlankThenPattern.NotBlankThenPatternValidation.class)
@Documented
public @interface NotBlankThenPattern {
String regexp() default "";
String message() default "格式错误";
/**
* @return the groups the constraint belongs to
*/
Class<?>[] groups() default {};
/**
* @return the payload associated to the constraint
*/
Class<? extends Payload>[] payload() default {};
class NotBlankThenPatternValidation implements ConstraintValidator<NotBlankThenPattern, String> {
private Pattern pattern;
@Override
public void initialize(NotBlankThenPattern constraintAnnotation) {
this.pattern = Pattern.compile(constraintAnnotation.regexp());
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (StringUtil.isEmpty(value)) {
return true;
}
return pattern.matcher(value).matches();
}
}
}
其中StringUtil.isEmpty可以用其他框架的。
Linux防火墙给某个端口添加指定ip
sudoroot:<42&x24<3T{/}5#6
sudo firewall-cmd --list-all
sudo firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.1.121.76" port protocol="tcp" port="9002" accept"
sudo firewall-cmd --reload
Mysql order by中使用case when
需求:
**实现逻辑:**只管未分配专家的数据,分配了专家的数据按后面的字段排序。
代码如下:
order by
case when awardExpert.id is null then 1 else 2 end,
apply.submit_time desc,apply.id,expert.update_time desc;
批量导入MySQL报错
Connection memory limit 50331648 bytes exceeded. Consumed 81426016 bytes.
; uncategorized SQLException; SQL state [HY000]; error code [4082]; Connection closed. Connection memory limit 50331648 bytes exceeded. Consumed 81426016 bytes
问题原因:
MySQL 8用户连接内存限制,设置单个用户连接可以使用的最大内存量(默认16MB)。如果任何用户连接使用超过这个数量,任何来自该连接的新查询都会被ER_CONN_LIMIT拒绝。
- 此限制不适用于系统用户或root帐户;
- InnoDB缓冲池使用的内存也不包括在内。
就是说限制临时内存,排序,链接等内存。
解决方法:
MySQL> set global connection_memory_limit=可以使用的最大内存(字节);
附: 查询单个用户连接可以使用的最大内存量SQL语句
select @@connection_memory_limit;
参考链接、参考链接
鼠标右键没有360压缩菜单的解决
确保电脑管家没有禁止自启动: