- 博客(69)
- 收藏
- 关注
原创 数据库查询出数据用Map<String,double>接收,报错java.lang.ClassCastException: java.math.BigDecimal cannot be cast to
在 Java 中,JDBC 查询结果中的数值类型(如 Oracle 的 NUMBER、MySQL 的 DECIMAL)默认会被映射为 BigDecimal,而不是 Double。MyBatis 会自动处理 BigDecimal → Double 的转换。方法二:从 ResultSet 中获取时就做转换(适用于自定义 DAO)方法三:使用 MyBatis / MyBatis-Plus 自动映射。方法一:使用 .doubleValue() 显式转换。
2025-06-12 10:55:24
162
原创 EasyExcel导出多Sheet多出一列this$0
在使用 EasyExcel 导出数据时,如果发现导出的 Excel 文件中多出了一个名为 this$0 的列,这通常是由于 Lambda 表达式导致的。具体来说,当你在一个类的方法内部使用了 Lambda 表达式,并且该 Lambda 表达式引用了外部类的实例变量或方法时,Java 编译器会在生成的字节码中添加一个指向外部实例的隐式引用(即 this$0)。如果确实存在这样的字段(如 this$0),你可以使用 EasyExcel 提供的 @ExcelIgnore 注解来忽略这些字段。
2025-05-12 15:49:31
282
原创 MyBatis-Plus使用 wrapper.apply() 添加自定义 SQL 片段
在 MyBatis-Plus 中,wrapper.apply() 方法允许你在构建查询条件时插入任意的 SQL 片段。在这个例子中,我们不仅检查了用户的年龄是否大于20岁以及邮箱是否非空,还添加了一个额外的条件来筛选邮箱包含特定域名的用户。如果有多个参数,可以依次使用 {1}, {2} 等。在这个例子中,apply 方法被用来添加一个子查询来计算平均年龄,并选择所有年龄大于平均年龄的用户。apply 方法可以与其他条件一起使用,比如 eq, gt, lt 等,以构建更复杂的查询逻辑。示例 1: 基本应用。
2025-05-12 13:24:40
437
原创 sql serve 多表联合查询,根据一个表字段值动态改变查询条件
当查询条件更加复杂,或者需要根据不同情况构建完全不同的SQL语句时,可以考虑使用动态SQL。假设你有两张表:Orders(订单表)和 Customers(客户表),你想根据Customers表中的某个字段(例如CustomerType)来决定对Orders表应用不同的过滤条件。在SQL Server中进行多表联合查询时,如果需要根据一个表的字段值动态改变查询条件,可以采用几种不同的方法来实现这一需求。在这个例子中,我们根据CustomerType的不同,对Orders表设置了不同的查询条件。
2025-05-08 10:30:53
363
原创 hashMap一些不太常用但非常有用的方法及使用示例
HashMap 提供了多种方法来操作键值对,除了常用的 put()、get() 和 remove() 方法之外,还有一些不太常用但非常有用的方法。如果指定的键尚未与某个值关联或关联的值为 null,则将该键与给定的值关联;否则,使用给定的重映射函数重新计算该键的新值。此方法允许你基于现有值(如果存在)或计算新值,并将其放入映射中。当指定键没有对应值时,使用提供的映射函数计算其值并放入映射中。只有在键对应的值非空时,才应用给定的重映射函数计算新值。
2025-05-07 17:13:09
247
原创 java 使用Caffeine实现本地缓存
Caffeine 是一个高性能的本地缓存库,广泛用于 Java 应用程序中。它支持多种缓存淘汰策略(如基于容量、时间、引用等),并且性能优于 Guava Cache,因此成为许多开发者的首选。Caffeine 支持在缓存未命中时自动加载数据。Caffeine 提供了丰富的统计功能,可以帮助你监控缓存的命中率、加载时间等。以下是一个完整的示例,展示如何使用 Caffeine 创建和使用本地缓存。Caffeine 支持异步加载缓存,适合耗时的数据加载场景。(2) 使用加载函数。(3) 异步加载缓存。
2025-04-21 15:32:26
278
原创 union all几个常见问题及其解决方案
与 UNION 不同,UNION ALL 不会去除重复的记录,它简单地将一个查询的结果附加到另一个查询的结果之后。当你希望在 UNION ALL 的结果上进行排序时,必须将整个 UNION ALL 放在一个子查询或派生表中,并在外层应用 ORDER BY 子句。这里,users 表的 id 和 profiles 表的 age 可能数据类型不同(例如一个是整数,另一个是字符串),这会导致错误或意外的行为。问题描述: 即使列的数量相同,但如果列的顺序不一致,也会导致数据错位的问题。5. 忽略了排序需求。
2025-04-15 13:19:39
629
原创 保证集合中的元素按自然顺序排列
在 Java 中,如果你想保证集合中的元素按自然顺序排列(比如数字从小到大,字符串按字母顺序),可以使用 TreeSet 或 PriorityQueue 等集合类。它也是一个按自然顺序排列的集合,但它是基于堆结构实现的,适合用来处理动态排序问题。如果集合中存储的是你自己定义的对象(比如 Person 类),你需要让这个类实现 Comparable 接口,并定义自然排序规则。TreeSet 是一个有序集合,默认会按照元素的自然顺序进行排序。如果你存储的是字符串,TreeSet 也会按照字母顺序排列。
2025-03-26 11:14:53
171
原创 easyExcel2.2.10中为0数据显示为空
在 EasyExcel 2.2.10 中,如果希望将数值为0的数据在 Excel 中显示为空(即不显示0。
2025-03-24 14:09:33
531
原创 LinkedHashMap的常用功能
LinkedHashMap 是 Java 集合框架中的一员,继承自 HashMap 类,并且实现了 Map 接口。与 HashMap 不同的是,LinkedHashMap 保留了元素插入的顺序(插入顺序),或者根据最近最少使用(access order)的顺序来排序元素。在这个示例中,我们首先展示了一个普通的 LinkedHashMap 如何保持插入顺序。然后,我们创建了一个作为 LRU 缓存使用的 LinkedHashMap,并通过重写 removeEldestEntry 方法设置了最大容量。
2025-03-24 09:50:47
270
原创 springboot EasyExcel 实现导入导出
创建类实现@Component// 标题样式// 加粗// 字体大小// 水平居中// 背景色// 内容样式// 垂直居中// 细边框@Override// 拿到poi的workbook// 当前事件会在 数据设置到poi的cell里面才会回调// 判断不是头的情况 如果是fill 的情况 这里会==null 所以用not trueif (cell!= null) {
2025-03-13 13:13:55
462
原创 MapDB支持持久化和事务的本地缓存的java库
MapDB 是一个功能强大的 Java 库,它提供了类似标准 Java 集合(如 Map, Set)的接口,但增加了持久化和事务支持。以下是一个简单的示例,展示了如何使用 MapDB 创建一个内存中的 HashMap,并演示了基本的读写操作。首先,在你的项目中添加 MapDB 的依赖。如果你想将数据持久化到文件而不是仅保存在内存中,可以稍微修改上述代码来使用文件存储。
2025-03-07 15:49:47
223
原创 springboot多数据源事务管理
JTA适用于需要强一致性的分布式事务场景。适用于简单的多数据源事务管理。手动管理事务提供了最大的灵活性,但代码复杂度较高。Spring 的注解是最简单的方式,但需要确保事务管理器配置正确。
2025-02-14 16:45:34
594
原创 springboot mybatis-plus 集成多数据源
这个示例将展示如何配置两个数据源,并确保每个数据源都有自己对应的 SqlSessionFactory 和事务管理器。创建两个配置类来分别配置主数据源和次数据源及其相关的 SqlSessionFactory 和事务管理器。确保为每个数据源定义的 Mapper 接口位于正确的包下,并继承 BaseMapper。:MyBatis-Plus 的功能(如默认方法)依赖其自定义的。:将不同数据源的Mapper接口分别放在不同的包中(如。确保每个数据源的Mapper绑定到正确的工厂。检查Mapper接口的包路径是否在。
2025-02-14 16:03:59
520
原创 [SQL Server]从数据类型 varchar 转换为 numeric 时出错
首先确认是哪个 SQL 语句触发了错误。检查错误日志或应用代码,定位具体的 SQL 语句。前端输入校验(如限制只能输入数字和小数点)。:执行此操作前需确保所有数据均可转换为。函数快速定位无法转换为数值的。后端插入/更新前检查数据合法性。若无法修复,可将无效数据置为。或计算中避免隐式转换。)或插入数据时的类型不匹配。此查询会列出所有无法转换为。在转换时使用安全函数(如。空白字符或特殊符号(如。格式错误(如多小数点。
2025-02-11 09:43:58
1082
原创 java 字符串日期字段格式化前端显示
在 Java 应用程序中,如果你有一个字符串类型的日期字段,并希望将其格式化后显示在前端,可以通过多种方式实现。这通常涉及到在后端将字符串转换为 Date 或 LocalDateTime 等对象,然后使用适当的注解或配置来确保它们以正确的格式序列化为 JSON 发送到前端。如果你使用的是 Jackson 来处理 JSON 序列化和反序列化,可以在实体类的日期字段上添加 @JsonFormat 注解,以便控制日期格式。你可以创建一个自定义的 getter 方法来格式化字符串日期,而不改变原来的字符串字段。
2025-01-26 15:07:58
1099
原创 解析日期字符串时,解析器遇到的问题
错误信息 Text '2025-01-23 10:44:06.0' could not be parsed at index 10 表明在尝试解析日期字符串时,解析器遇到了问题。为了正确解析 '2025-01-23 10:44:06.0' 这样的日期字符串,你需要确保使用的日期格式模式准确地反映了字符串的格式。这个问题通常是因为提供的日期格式模式与实际的日期字符串格式不匹配导致的。例如,如果使用了不包含时间部分的模式来解析一个带有时间部分的字符串,就会发生这种情况。
2025-01-23 11:43:17
2476
原创 QueryWrapper 格式化日期字段查询
在使用 MyBatis-Plus 的 QueryWrapper 时,如果你需要对日期字段进行格式化或基于日期的条件查询(如忽略时间部分),你可以结合 SQL 函数和 QueryWrapper 提供的方法来实现。虽然这不是直接格式化查询的一部分,但如果你希望在实体类级别处理日期格式,可以考虑使用 @TableField 注解,并结合 Java 的 LocalDate 或 LocalDateTime 类型。然后,在你的服务层或控制器中,你可以将日期对象传递给 QueryWrapper,它会自动处理日期格式。
2025-01-23 09:49:21
982
原创 mybatis 返回结果Map类型时保证字段顺序
MyBatis 还允许你通过实现 ResultHandler 接口来自定义结果处理逻辑。在这个处理器中,你可以控制如何存储每一行数据,并且可以选择使用 LinkedHashMap 来保持字段顺序。@Override// 确保每行数据都存储在一个 LinkedHashMap 中try {// 处理 orderedResults...如果不想使用 Map 作为返回类型,而是希望保持字段顺序并且有固定的结果结构,那么最好的方法是定义一个 resultMap 并指定字段顺序。
2025-01-02 10:02:44
472
原创 mybatis 使用@Insert插入操作后返回自增id
在 MyBatis 中使用 @Insert 注解进行插入操作并返回自增 ID,可以通过结合 @Options 注解来实现。@Options 注解允许你指定是否使用生成的键(useGeneratedKeys=true)以及将生成的键设置到实体对象的哪个属性上(keyProperty)。下面是具体的步骤和示例代码。
2024-12-31 16:01:49
946
原创 reason: no instance(s) of type variable(s) U exist so that KsMxVo conforms to Comparable<? super U>
你遇到的错误信息 no instance(s) of type variable(s) U exist so that KsMxVo conforms to Comparable<?super U> 表明 Java 编译器无法推断出一个合适的类型参数,使得 KsMxVo 类型符合 Comparable<?super U> 的要求。这个错误通常发生在尝试对泛型集合或对象进行排序时,编译器需要确保所有元素实现了 Comparable 接口,并且可以相互比较。
2024-12-23 15:27:18
788
原创 java.lang.ArrayStoreException异常的正确解决方法
java.lang.ArrayStoreException 是一个运行时异常,当试图将错误类型的元素存储到类型安全的数组中时抛出。这个异常通常发生在使用泛型数组或通过反射操作数组时。
2024-12-06 11:41:24
382
原创 SQL server 计算同比和环比
同比是指与去年同期相比的增长率,而环比是指与上一期相比的增长率。以下是如何在 SQL Server 中计算同比和环比的示例。•CurrentYearSales:计算 2023 年每个月的总销售额。•LastYearSales:计算 2022 年每个月的总销售额。•MonthlySales:计算 2023 年每个月的总销售额。假设我们希望计算 2023 年 10 月和 11 月的销售额同比增长率。•使用 LAG 函数获取上一个月的销售额。假设我们希望计算 2023 年每个月的销售额环比增长率。
2024-11-26 14:06:23
735
原创 SQL server 中 CROSS APPLY的使用
CROSS APPLY 类似于 INNER JOIN,但它允许你在一个查询中多次引用外部表的行,并且可以动态地生成结果集。CROSS APPLY 和 OUTER APPLY 是 SQL Server 中非常强大的操作符,特别适用于需要对每个外部行进行复杂处理或动态生成结果集的场景。1. 多行结果:当子查询或表表达式返回多行结果时,CROSS APPLY 可以将这些结果与外部表的每一行进行组合。2. 表表达式:CROSS APPLY 后面的子查询是一个表表达式,它为每个员工返回最新的订单。
2024-11-04 17:16:21
1091
2
原创 SQL server 列转行
在 SQL Server 中,将列转换为行的操作通常被称为“透视”(Pivot)的逆操作,即“反透视”(Unpivot)。2. Value FOR Attribute IN (Name, Age, Salary, Department):这部分指定了哪些列将被转换为行,并且指定了新的列名 Attribute 和 Value。•性能:对于大数据量的表,UNPIVOT 操作可能会有一定的性能影响,需要根据实际情况进行优化。•数据类型:确保所有被转换的列具有兼容的数据类型。示例:包含不同类型数据的转换。
2024-11-04 16:47:33
567
2
原创 SQL Server 中,将单行数据转换为多行数据
如果你使用的是 SQL Server 2016 或更高版本,推荐使用 STRING_SPLIT 函数,因为它简单且易于维护。对于早期版本,可以使用自定义函数或临时表/表变量来实现相同的功能。如果你使用的是早期版本的 SQL Server(如 SQL Server 2008 或更早),可以使用自定义函数来实现拆分。假设你有一个表 T,其中有一列 Values 包含逗号分隔的字符串,你想要将这些字符串拆分成多行。如果你有一组固定的字符串需要拆分,可以使用临时表或表变量来实现。3. 使用临时表或表变量。
2024-10-25 14:00:10
2387
原创 sqlserver 中charindex、patindex、like 的比较
在 SQL Server 中,CHARINDEX、PATINDEX 和 LIKE 都是用于字符串匹配和搜索的函数或操作符,但它们各自有不同的用途和特点。•功能:PATINDEX 函数用于返回一个模式在另一个字符串中的起始位置。•返回值:如果找到子字符串,则返回其在主字符串中的起始位置(从 1 开始计数);•LIKE 在处理复杂的模式匹配时更灵活,但在某些情况下可能会导致性能问题,特别是在没有合适索引的情况下。•功能:CHARINDEX 函数用于返回一个子字符串在另一个字符串中的起始位置。
2024-10-16 14:53:05
850
原创 springboot项目重新发布时初始化一些操作(清空指定表数据)
方法三:使用 Flyway 或 Liquibase 进行数据库迁移如果你使用 Flyway 或 Liquibase 进行数据库版本控制和迁移,可以在迁移脚本中包含清空表数据的 SQL 语句。在 src/main/resources/db/changelog 目录下创建一个新的变更日志文件(例如 changelog-2.xml),并在其中编写清空表数据的变更集。方法二:使用 @PostConstruct 注解你也可以使用 @PostConstruct 注解,在 Bean 初始化后执行清空表数据的操作。
2024-10-15 10:33:09
602
原创 SQL server sum(isnull(sl, 0)) 返回null问题
在这个示例中,由于 WHERE 子句 id > 2 没有匹配到任何行,SUM(ISNULL(sl, 0)) 会返回 NULL。通过使用 ISNULL(SUM(ISNULL(sl, 0)), 0),我们可以确保即使没有匹配到任何行,结果也会是 0 而不是 NULL。在 SQL Server 中,SUM(ISNULL(sl, 0)) 返回 NULL 的情况通常是因为查询没有返回任何行。即使 ISNULL 函数将 NULL 值替换为 0,如果没有任何行满足查询条件,SUM 函数仍然会返回 NULL。
2024-10-12 16:25:40
549
原创 Spring Boot与模板方法模式:实现统一的日志处理流程
在Spring Boot应用程序中,使用模板方法模式来实现统一的日志处理流程是一种有效的方法。通过这种方式,你可以使用模板方法模式来定义一个统一的日志处理流程,同时允许不同的日志处理器实现特定的日志格式化逻辑。在Spring Boot中实现日志处理的模板方法模式1. 定义抽象的日志处理器首先,创建一个抽象类,该类将定义日志处理的模板方法以及一些具体的日志处理步骤。3. 使用Spring依赖注入来选择合适的日志处理器你可以在服务层或者控制器中通过Spring的依赖注入来选择并使用具体的日志处理器。
2024-09-29 11:31:27
825
2
原创 Spring Boot与观察者模式实现数据同步更新机制
•Subject(被观察者):维护了一个观察者列表,并提供了添加、删除以及通知观察者的接口。•ConcreteObserver(具体的观察者):实现了更新接口,以保持其状态与被观察者的状态一致。在Spring Boot中实现观察者模式这里有一个简单的例子来展示如何在Spring Boot中使用观察者模式实现数据同步更新机制。5. 使用Spring的依赖注入来注册观察者你可以在配置类或主应用类中通过@Autowired将所有的观察者注册到被观察者中。4. 创建具体的被观察者。观察者模式的基本概念。
2024-09-29 11:11:06
1032
原创 StopWath,apache commons lang3 包下的一个任务执行时间监视器的使用
【代码】StopWath,apache commons lang3 包下的一个任务执行时间监视器的使用。
2024-09-27 14:07:14
654
原创 常用的MySQL日期、时间函数
从日期 d 中获取指定的值,type 指定返回的值。返回年份及第几周(0到53),mode 中 0 表示周天,1表示周一,以此类推。返回日期 d 是星期几,如 Monday,Tuesday。日期 d 今天是星期几,1 星期日,2 星期一,以此类推。计算日期 d 是本年的第几个星期,范围是 0 到 53。计算日期 d 是本年的第几个星期,范围是 0 到 53。日期 d 是星期几,0 表示星期一,1 表示星期二。返回日期d是第几季节,返回 1 到 4。返回日期d中的月份值,1 到 12。
2024-09-27 10:51:48
995
原创 SQL常用数据过滤 - EXISTS运算符
用于检查查询子句是否存在满足特定条件的记录,如果有一条或者多条记录存在,则返回True,否则返回False。EXISTS 直接跟在WHERE关键字之后,中间没有列名;子查询查询结果有一条或多条记录,则返回True。EXISTS后面接子查询;这里通过2张进行举例,
2024-09-26 14:50:58
522
原创 SQL中关于bit类型字段传入任何值都可以查出数据
在SQL中,BIT 类型的字段通常用于存储布尔值(例如,真/假,是/否),或者更准确地说,它存储一个位值,可以是0或1。• 当你向 BIT 类型的字段传递一个非0或1的值时,数据库可能会尝试将这个值转换为适合 BIT 类型的数据。3. 索引和查询优化器:•如果你的查询没有正确地利用索引,或者查询优化器决定采用全表扫描的方式,那么即使条件不匹配,也可能返回所有记录。5. NULL值处理:•如果 BIT 字段允许 NULL 值,并且你在查询时没有考虑到这一点,那么传入任何值都可能不会排除那些 NULL 的行。
2024-09-26 14:11:31
570
原创 guava中对Map的扩展数据结构
首先,这里最明显的就是在取出对象时省去了复杂的强制类型转换,避免了手动进行类型转换的错误。其次,我们可以看一下。方法返回的集合也不是一个独立的对象,可以理解为集合视图的关联,对这个新集合的操作仍然会作用于原始的。提供了将一个键映射到多个值的形式,使用起来无需定义复杂的内层集合,可以像使用普通的。所以,如果你想缓存对象,又不想做复杂的类型校验,那么使用方便的。大家可能会疑问,如果只是存对象的话,像下面这样用普通的。,说明了取出的确实是我们之前创建并放入的那个对象。的个数,例如下面这行代码打印的结果就会是2。
2024-09-04 14:05:27
1390
原创 mybatisplus使用拦截器动态修改SQL语句
在 MyBatis Plus 中,你可以使用自定义的拦截器来动态修改 SQL 语句。MyBatis Plus 提供了一个 InnerInterceptor 接口,你可以实现这个接口来创建自己的拦截器。这样,你就可以在 MyBatis Plus 中使用自定义拦截器来动态修改 SQL 语句了。创建好拦截器之后,你需要在 MyBatis Plus 的配置中注册这个拦截器。在 Spring Boot 应用中,确保拦截器被正确注册并且在 MyBatis Plus 的生命周期内可用。
2024-08-28 16:34:14
1584
原创 java使用本地缓存,获取自增流水号(线程安全)
可以使用synchronized关键字或java.util.concurrent.atomic.AtomicInteger来实现。使用本地缓存如java.util.concurrent.ConcurrentHashMap来存储流水号。键可以是日期字符串(例如 "2023-04-01")。当需要获取流水号时,先检查当前日期与缓存中的键是否一致。由于流水号可能会被多个线程访问,因此需要保证线程安全。如果不一致,则重置流水号为0,并更新键。如果一致,则直接递增流水号并返回。在一天的开始时将流水号设置为0。
2024-08-26 17:01:17
449
原创 java8函数式接口的简单使用
Java 8 的 java.util.function 包中定义了一系列函数式接口,如 Function, Predicate, Consumer, Supplier 等,它们可以用于多种用途,例如数据转换、过滤、收集等。接口代表了一个接受一个类型参数 T 的输入,并产生一个类型 R 的结果的函数。接口代表了一个接受一个类型 T 的输入,并且不返回任何结果的操作。接口代表了一个接受一个类型 T 的输入,并返回一个布尔值的结果。它有一个抽象方法 test。接口代表了一个无参且返回一个类型 T 的结果的操作。
2024-08-23 10:56:49
261
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人