Keep and carry on.

背景:我想校验一个指定的String字符串,是否存在于另一个String数组中,选择Arrays.binarySearch()方法实现,代码如下:

1
2
3
4
5
6
String[] item = {"0","1","16","1591","1594","1596"};
if (Arrays.binarySearch(item, "1591") > 0) {
System.out.println("exists");
} else {
System.out.println("not exists");
}

运行结果:

1
not exists

很直观的能看到item数组里面存在字符串1591,为什么程序运行的结果却是找不到该元素呢?

Read More

泛型定义以及其带来的好处

泛型使类型(类和接口)能够在定义类、接口和方法时成为参数。与方法声明中使用的更熟悉的形式参数非常相似,类型参数为您提供了一种通过不同输入重复使用相同代码的方法。区别在于形式参数的输入是值,而类型参数的输入是类型。

使用泛型的代码比非泛型代码有很多好处:

  1. 编译时更强的类型检查。 Java 编译器对泛型代码应用强类型检查,如果代码违反类型安全,则会发出错误。修复编译时错误比修复运行时错误更容易,后者很难发现。
Read More

1.Double类型

在Java中,将两个double值转换为String类型,然后使用equals方法进行比较是一个常见的做法,但是这种方法并不是完全可靠,特别是在涉及浮点数的精度时仍然可能会遇到问题。

浮点数在内部以二进制表示,有时会存在舍入误差,这可能会导致两个在数值上非常接近的浮点数在转换为字符串后变得稍有不同。因此,尽管你可以使用字符串比较来避免直接比较浮点数时的精度问题,但这种方法并不是绝对可靠的。

Read More
post @ 2023-08-25

GROUP_CONCAT()函数

创建表person_info,并插入数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

CREATE TABLE `person_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
`family` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;


INSERT INTO niffler.person_info (name, family) VALUES('张三', '张三爸');
INSERT INTO niffler.person_info (name, family) VALUES('张三', '张三妈');
INSERT INTO niffler.person_info (name, family) VALUES('李四', '李四爸');
INSERT INTO niffler.person_info (name, family) VALUES('李四', '李四妈');
INSERT INTO niffler.person_info (name, family) VALUES('李四', '李四大哥');
INSERT INTO niffler.person_info (name, family) VALUES('王二', '王二爷爷');
INSERT INTO niffler.person_info (name, family) VALUES('王二', '王二姐姐');
Read More

Integer经典面试问题:两个Integer对象都赋值为128,这两个对象比较是否相同?为什么?

回答这个问题,首先我们要知道,在Java中,当你写Integer a = 1; 实际上是调用了Java的自动装箱功能。这会将整数 1 自动装箱为Integer对象,然后将这个对象赋值给变量a。

自动装箱功能是由编译器自动插入的,实际上它相当于执行了如下的代码:

1
Integer a = Integer.valueOf(1);

这里的valueOf方法是Integer类的一个静态方法,它的作用就是将传入的参数(通常是基本数据类型)自动转换为对应的包装类对象。对于Integer类来说,就是将整数值转换为Integer对象。

Read More

InnoDB is a general-purpose storage engine that balances high reliability and high performance. In MySQL 8.0, InnoDB is the default MySQL storage engine. Unless you have configured a different default storage engine, issuing a CREATE TABLE statement without an ENGINE clause creates an InnoDB table.

InnoDB是一种平衡高可靠性和高性能的通用存储引擎。在MySQL 8.0中,InnoDB是MySQL默认的存储引擎。除非您配置了不同的默认存储引擎,否则发出不带 ENGINE 子句的 CREATE TABLE 语句将创建一个 InnoDB 表。

Read More

GROUP_CONCAT()函数输出的结果,发现被截取了一部分,并没有显示完整,原来GROUP_CONCAT() 默认的输出长度为1024字节,超出的部分会被截掉不显示。

Read More
post @ 2023-07-14

1. SpringBoot

1.1 SpringBoot的作用

SpringBoot是一个快速构建项目并简化项目配置的工具,内部集成了Tomcat及大多数第三方应用和Spring框架的默认配置。与我们学习的SpringMVC和SpringCloud并无冲突,SpringBoot提供的这些默认配置,大大简化了SpringMVC、SpringCloud等基于Spring的Web应用的开发。

1.2.SpringBoot的自动配置原理(如何实现)?

SpringBoot的自动配置是如何实现的?

一般我们的SpringBoot项目启动类都会添加@SpringBootApplication注解,而这个注解的其中一个二级注解是@EnableAutoConfiguration注解。而@EnableAutoConfiguration注解通过@Import注解,以ImportSelector接口的方法来导入classpath下的META-INF/spring.factories文件,这些文件中会指定需要加载的一些类名称。

这些类一般都加了@Configuration注解,并且完成了对某框架(例如Redis、SpringMVC)的默认配置,当这些类符合条件时,就会被实例化,其中的配置生效,那么自动配置自然生效了。

Read More

执行update更新操作

1
2
3
4
5
6
7
8
9
10
11
<update id="batchUpdate" parameterType="java.util.List">
<foreach collection="list" item="item" separator=";" open="" close="">
update test_table
<set>
<if test="item.a != null">output_amount = #{item.a},</if>
<if test="item.b!= null">invoice_amount = #{item.b},</if>
<if test="item.c!= null">payment_amount = #{item.c},</if>
</set>
where id = #{item.id}
</foreach>
</update>

执行报错:

1
2
3
4
Error updating database.  
Cause: java.sql.SQLSyntaxErrorException:
You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near 'update test_table set a = 1, ' at line 14

刚开始出现这个错误,以为是update语句写的有问题,但是检查了很多遍都没有问题。奇怪的是,同样的代码,同样的数据,本地启的环境不行,测试环境却可以。经过同事提醒了一下,于是检查了一下配置文件,果然发现配置文件上的jdbc配置,测试环境比开发环境多了个allowMultiQueries=true

1
jdbc:mysql://127.0.0.1:3306/db?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true

MyBatis默认情况下不允许批量插入或更新数据的原因是出于安全考虑。在许多情况下,数据的插入和更新都需要经过验证和控制,以确保数据的完整性和一致性。如果允许默认的批量操作,可能会导致不正确的数据插入或更新,从而影响应用程序的正常运行。

通过配置allowMultiQueries=true可以开启MyBatis的批量操作功能。这个配置项告诉MyBatis允许在单个数据库连接中执行多个SQL语句,从而实现批量插入或更新数据的功能。但是要注意,在开启批量操作之前,确保你已经了解并理解了可能引发的安全风险,并且在使用批量操作时要进行适当的验证和控制,以确保数据的完整性和安全性。

Read More

使用HistoryService接口来查询历史流程实例

在Flowable中,已终止的流程实例不能通过RuntimeService接口直接查询到。相反,你需要使用HistoryService接口来查询历史流程实例,并从中筛选出已终止的实例。以下是正确的步骤:

  1. 确保你的应用程序连接到正确的Flowable流程引擎实例。你需要使用Flowable的API来执行后续的操作。

  2. 使用HistoryService接口的createHistoricProcessInstanceQuery()方法构建查询,设置适当的条件来筛选已终止的流程实例。

1
2
HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery()
.finished();
  1. 执行查询并获取已终止的流程实例列表。
1
List<HistoricProcessInstance> terminatedInstances = query.list();
  1. 根据需要选择要重启的流程实例。你可以根据流程实例的ID或其他属性进行选择。

  2. 如果你需要将已终止的流程实例重新激活,可以创建一个新的流程实例,或者使用历史流程实例中的数据进行修复。请注意,这取决于你的业务需求和流程定义的复杂性。

请注意,已终止的流程实例是历史数据,因此无法直接重新激活。你需要根据业务需求进行相应的处理。使用HistoryService接口可以提供有关已终止流程实例的详细信息,但不能直接操作它们。

Read More
⬆︎TOP