- 博客(30)
- 收藏
- 关注
原创 java8函数式接口的简单使用
Java 8 的 java.util.function 包中定义了一系列函数式接口,如 Function, Predicate, Consumer, Supplier 等,它们可以用于多种用途,例如数据转换、过滤、收集等。接口代表了一个接受一个类型参数 T 的输入,并产生一个类型 R 的结果的函数。接口代表了一个接受一个类型 T 的输入,并且不返回任何结果的操作。接口代表了一个接受一个类型 T 的输入,并返回一个布尔值的结果。它有一个抽象方法 test。接口代表了一个无参且返回一个类型 T 的结果的操作。
2024-08-23 10:56:49
181
原创 MyBatisPlus当字段为null时也更新该字段解决方法
MyBatisPlus 的 updateById 方法默认会将 null 值的字段更新到数据库中。如果使用 LambdaUpdateWrapper 或 UpdateWrapper 进行更新操作,也可以明确地设置字段为 null。如果需要更精细的控制,可以使用 MyBatisPlus 提供的 update 方法结合自定义的 SQL 语句来更新 null 值。确保字段允许 null 值:在数据库设计时,请确保那些你想要设置为 null 的字段允许 null 值。4 @TableField 注解配置。
2024-08-09 17:11:56
646
原创 在 Spring Boot 应用中集成 Ehcache 并使用多个缓存实例
注意:spring-boot-starter-cache 是必需的,因为它提供了 Spring Cache 抽象层,而 ehcache 依赖则是实际的缓存实现。这种方式允许你更细粒度地控制缓存的读取、写入和清理过程,但同时也需要你处理更多的细节,比如并发控制、异常处理等。一旦初始化完成,你就可以在任何需要的地方使用 Ehcache 了。上述示例中,cache1 是在 ehcache.xml 中定义的第一个缓存实例名称。这样,同一个方法调用将被同时缓存在两个不同的缓存实例中。使用 Ehcache。
2024-07-31 15:01:12
301
原创 mybatisplus 实现接口MetaObjectHandler自动填充字段值
MetaObjectHandler是MyBatis-Plus提供的一个接口,用于处理元对象(MetaObject)级别的操作,主要用于自动填充字段,比如在插入或更新数据时自动填充创建时间、修改时间等字段。在这个例子中,insertFill方法会在插入数据前被调用,updateFill方法会在更新数据前被调用。在这里,@TableField注解的fill属性指定了字段的填充策略,FieldFill.INSERT表示仅在插入时填充,FieldFill.INSERT_UPDATE表示在插入和更新时都填充。
2024-07-25 15:49:37
166
原创 在一个事物方法中开启新事物,完成对数据库的修改
但是,在一个已经标记为@Transactional的方法内部调用另一个也标记了@Transactional的方法时,如果不正确处理,可能会导致一些意料之外的行为。这是因为默认情况下,Spring的@Transactional是基于代理的,这意味着如果在一个事务方法中直接调用另一个事务方法,后者并不会开启新的事务。这种方式会强制在当前事务的上下文中开启一个新的事务。这样,你就可以在一个已经处于事务中的方法内,安全地开启并完成对数据库的另一组修改操作。如何在一个事务方法中开启新事务。
2024-07-23 13:38:50
455
原创 spring事务详解
默认配置下,spring只有在抛出的异常为运行时unchecked异常时才回滚该事务,也就是抛出的异常为RuntimeException的子类(Errors也会导致事务回滚),而抛出checked异常则不会导致事务回滚。当事务方法被另外一个事务方法调用时,必须指定事务应该如何传播,例如,方法可能继续在当前事务中执行,也可以开启一个新的事务,在自己的事务中执行。因为JDK动态代理采用的是接口实现的方式,通过反射调用目标类的方法,此时如果调用本类的方法,this指的是目标类,并不是代理类所以不会走代理。
2024-07-06 17:03:07
765
原创 spring 事件监听使用实例
在Spring Boot应用中,当EventProducerService的produceEvent方法被调用时,它会发布一个CustomEvent,然后CustomEventListener会监听到这个事件并执行handleCustomEvent方法。在这个例子中,当我们启动应用并调用produceEvent时,CustomEventListener会打印出接收到的事件数据。在程序中,当某些事情发生时(比如用户点击了按钮),系统会发送一个事件,然后监听这个事件的处理器就会被触发,做出相应的反应。
2024-05-30 14:53:46
145
原创 @PostConstruct使用
PostConstruct 是一个来自Java的JSR 250规范的注解,用于标记一个方法,该方法将在对象初始化后但在其任何依赖注入完成之后被调用。在这个例子中,一旦MyService的bean被Spring容器创建并注入了所有依赖,init()方法就会被自动调用。@PostConstruct注解的使用确保了这些初始化操作只在对象创建时执行一次。注意,@PostConstruct注解的方法不能有参数,且方法的访问修饰符至少是protected,否则Spring容器可能无法识别和调用它。
2024-05-28 16:52:35
189
原创 Springboot 普通类调用 Mapper 接口使用 MybatisPlus 报错:空指针异常(NullPointerException)
被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Serclet的inti()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
2024-05-22 11:16:43
665
原创 mybatis-plus批量插入报错Invalid bound statement (not found): insertBatchSomeColumn问题解决
【代码】mybatis-plus批量插入报错Invalid bound statement (not found): insertBatchSomeColumn问题解决。
2024-05-21 15:02:14
484
原创 mysql 重复数据删除只保留一条
插入去重数据:使用INSERT INTO ... SELECT语句结合GROUP BY或DISTINCT将去重后的数据插入临时表。直接在原表上操作,通过自连接删除重复项,但需确保你有足够的方式确定哪一行是需要保留的(例如,通过日期、ID或其他唯一条件)。对于MySQL 8.0及以上版本,可以使用窗口函数ROW_NUMBER()来标记重复行,然后删除标记为非1(即重复的)行。将临时表数据移回原表:将临时表中的数据插入回原表。清理临时表:最后,如果不需要了,可以删除临时表。删除原表数据:清空原表数据。
2024-05-16 09:35:14
1462
原创 SQL窗口函数
我们的数据集很简单,是2023年两个地区的六行收入数据。如果我们使用这个数据集,对每个地区的收入进行GROUP BY求和,结果只会剩下两行,每个地区一行,然后是收入的总和:我希望你将窗口函数视为类似于这样的方式,但聚合并不是减少行数,而是在“后台”运行,并将值添加到现有行中。请注意,我们没有使用任何GROUP BY,数据集保持不变。然而,我们还是能够获得所有收入的总和。在我们更深入地了解它的工作原理之前,让我们先快速了解一下全部语法,然后再开始积累知识。
2024-05-16 09:32:24
1020
原创 使用try-with-resources自动关闭资源
总之,try-with-resources 是一种提高代码健壮性和可读性的现代Java特性,特别适用于需要管理外部资源(如文件、数据库连接、网络连接等)的场景。try-with-resources 是 Java 7 引入的一种异常处理和资源管理的新特性,它简化了以往需要显式关闭资源的代码,自动管理资源的生命周期,确保在代码块执行完毕后即使发生异常也能关闭资源,避免资源泄漏。)隔开,所有资源都会被自动管理。1. 自动关闭资源:最显著的优点是它能确保资源被正确关闭,无需在 finally 块块中手动关闭。
2024-05-11 14:06:57
277
1
原创 for循环的每次循环向数据库插入一条数据不能及时插入的原因及解决方法
1.将循环内逻辑抽离出一个新的方法,单独添加事物并设置新方法事物的传播行为为Propagation.REQUIRES_NEW,然后在循环内调用方法。这样调用这个方法后,这个方法单独开启事务,每次执行完,单独提交,遇到异常单独回滚,外部方法收到抛出的异常并不处理就好,这样内外事务互不影响。而对象内部的自我调用将无法实施切面中的增强,所以被调用方法的事物不生效。但是有的时候我们并不关心本次循环的过程中是否出现异常,这样的话,我们就希望,在for循环中,每次循环都单独回滚,单独提交,且不影响外部的代码环境。
2024-05-10 11:33:47
342
转载 使用 CompletableFuture 来优化接口响应慢问题
这两种方式虽然简单直观,但效率比较低下,随着应用复杂度的增加,这种低效的做法将会带来严重的性能问题。通过allOf,anyOf这两种方式我们可以让任务之间协同工作,join()和get()方法都是阻塞调用它们的线程(通常为主线程)来获取CompletableFuture异步之后的返回值。如下,我们定义了一个异步任务类,创建每一个查询操作的CompletableFuture异步任务放入线程中执行,并利用allOf等待全部任务执行完成,执行完成后组装查询信息到聚合对象中返回。
2024-05-08 10:00:25
272
1
原创 MybatisPlus自动分页,total不准确的问题
正常情况下这样做并没有什么问题,但是当我select 后面需要聚合,比如使用sum函数的时候,自动优化得到的total就会比预期多。发现mybatis自动优化了sql,把select 后面要查询的内容全部省略,直接count。最近在使用分页功能的时候发现统计到的total和预期不符,于是在控制台查看分页count sql,不过我还是不太推荐这么做,因为本身SQL有聚合,原先的SQL相当于查询全部数据,效率比较低。当日解决办法也是有的,就是禁用自动优化。这样他会在你原先的SQL外面包一层。
2024-04-29 11:39:31
375
原创 sqlserver 字段值拼接
请注意,选择哪种方法取决于您的 SQL Server 版本、拼接的具体需求(如是否需要处理 NULL 值、是否需要分隔符等),以及对性能的要求。以下是几种常见的字段拼接技术:1. 使用 + 运算符这是早期版本 SQL Server 中最常用的字段拼接方法,适用于字符串类型的字段。4. 使用 STRING_AGG 函数在 SQL Server 2017 及更高版本中,STRING_AGG 函数被引入,专门用于将多行数据的某个字段值拼接到一起,形成单个字符串,同时支持指定分隔符。
2024-04-15 16:56:33
2319
1
原创 Java 反射统计对象集合中指定字段的和
这个工具类方法通过反射获取对象的getter方法,然后通过流(Stream)对集合中的每个对象调用getter方法获取字段值并进行求和。注意,此方法假设对象的字段都有对应的getter方法,并且字段值都是Number类型或其子类。在实际使用时,需要处理可能出现的反射异常。如果字段没有对应的getter方法,或者字段值不是Number类型,可能需要进行适当的异常处理或类型转换。在Java中,如果你希望通过反射来对对象集合中的多个字段进行统计求和,可以创建一个工具类,使用反射API和流(Stream)来实现。
2024-04-15 16:50:53
224
1
原创 mybatis 一对多嵌套查询
注意,为了实现这样的关联查询,还需要确保数据库表结构符合关联关系(例如在order表中有user_id作为外键指向user表的id),并且在对应的UserMapper和OrderMapper中完成了基本的CRUD方法映射。以下是一个简单的例子说明如何在MyBatis中实现一对多查询。在MyBatisPlus中,处理一对多关系的查询相对较为简便,主要是借助于模型类的关联注解以及特殊的查询方法。以下是一个简化的例子:假设我们有两个实体类:User和Order,一个用户可以有多个订单,这是一种一对多的关系。
2024-04-11 16:07:59
749
1
原创 Java 8 Stream流常用操作
方法接受一个可选的比较器,将Stream中的元素按照指定方式(默认为自然顺序)进行排序,返回一个新的Stream。方法的参数是一个函数,该函数将一个元素映射成一个Stream,最终将这些Stream合并成一个新的Stream。类型的参数,用于过滤Stream中的元素,并返回符合条件的元素组成的新Stream。类型的参数,可以在Stream中的每个元素执行所提供的操作,该方法不会影响Stream的元素。类型的参数,用于将一个元素转换为另一个元素,并返回一个新的Stream。方法类似,不同之处在于。
2024-04-03 10:08:59
509
1
原创 Transaction rolled back because it has been marked as rollback-only原因及解决办法
3.service中try catch后,手动回滚异常,并返回异常码。虽然感知不到异常,但是通过判断调用方返回结果,是否手动回滚。不会让事务commit。原因:已经标记为rollback-only,但是后面的程序执行后又commit事务,抛出此异常。让调用方感知异常,不会让事务commit。异常会被层层感知,不会让事务commit。有一个核心思想就是:不要让同一个事务标记为rollback-only后又commit。解决办法:(核心思想:既然标识为rollback-only,就不要让事务再commit)
2024-03-22 10:36:17
3886
1
原创 sql窗口函数的使用
以下是一个简单的窗口函数使用示例及其说明:假设有一个员工表employees,包含字段id(员工ID)、department_id(部门ID)、salary(工资)和hire_date(入职日期)。根据需要选择不同的窗口函数(如SUM, AVG, MAX, MIN, COUNT, ROW_NUMBER, RANK, DENSE_RANK, LAG, LEAD等),以及相应的分区和排序条件,来完成各种复杂的分析任务。结果将为每个部门内员工的工资排名。示例3:计算每位员工与前一位员工之间的工资差额。
2024-03-18 11:30:13
425
原创 Java 使用反射将map中对应key的值赋值对象中
1. 获取需要操作的字段对应的 Field 对象,可以使用 Class 类的 getField 或 getDeclaredField 方法,前者只能获取 public 的字段,后者可以获取任意字段;2. 使用 Field 对象的 setAccessible 方法将字段的可访问性设置为 true,以便能够修改私有属性;使用反射 API 中的 Field 类的 set 方法来给对象的指定字段赋值。3. 使用 Field 对象的 set 方法给字段赋。值,需要传入参数分别为需要赋值的对象以及赋的值。
2024-03-18 10:28:08
594
原创 Java 8 Stream流创建(二)
方法从文件中创建一个Stream流,每个元素代表文件中的一行。注意:在使用无限Stream流时,通常需要使用。集合类(如List和Set)可以通过调用。方法从数组创建一个Stream流。方法创建一个Stream流。方法限制元素数量,以避免无限循环。
2024-03-05 16:19:31
353
1
原创 MyBatisPlus实现多表查询
5. 链式查询: MyBatisPlus的动态SQL功能强大,可以利用eq, like, join等方法进行链式条件构建和多表查询。2. 关联查询: 使用@OneToOne, @OneToMany, @ManyToOne等注解进行一对一、一对多或多对一关联查询。3. 自定义SQL查询: 如果上述方式无法满足复杂的需求,可以通过编写自定义SQL语句进行多表查询。4. 嵌套查询: 利用MyBatisPlus的subquery()方法构造嵌套查询。在Mapper接口中直接查询即可。
2024-02-26 08:29:12
5253
2
原创 Java多线程+List分段完美解决导入等批量更新场景问题!
获取需要进行批量更新的大集合A,对大集合进行拆分操作,分成N个小集合A-1 ~ A-N。开启线程池,针对集合的大小进行调参,对小集合进行批量更新操作。对流程进行控制,控制线程执行顺序。开启异步执行任务的线程池。
2024-02-07 16:13:10
485
1
原创 Map+函数式接口方法解决 if-else
Map+函数式接口通过Map.get(key)来代替 if-else的业务分派,能够避免策略模式带来的类增多、难以俯视整个业务逻辑的问题。策略模式通过接口、实现类、逻辑分派来完成,把 if语句块的逻辑抽出来写成一个类,更好维护。入参String resourceId是用来查数据库的,这里简化了,传参之后不做处理。这样子写的好处是非常直观,能直接看到判断条件对应的业务逻辑。对应的业务逻辑放在value中。用上了Java8的新特性。判断条件放在key中。
2024-02-07 15:57:45
353
3
原创 Java 集合去重
这里假设getProperty()是获取对象属性的方法。如果对象的类实现了equals()和hashCode()方法,并且这两个方法是基于你想去重的那个属性来实现的,那么可以直接将列表转换为HashSet以达到去重的目的。请注意,这些示例假定MyObject是一个代表具体业务实体的类,而getProperty()是返回该类中用于判断是否重复的属性值的方法。这个方法会根据对象的属性值作为键存入Map中,由于Map不允许键重复,所以结果自然就是唯一的。方法2:Stream API (Java 8及以上版本)
2024-02-06 17:08:39
469
1
原创 sql 判断两个时间段是否存在交集
数据库的字段 start_time, end_time。集合1并上(or)集合3实际上包含了集合4逻辑。我的使用场景: A 表 将时间有交叉的数据查出来。集合1(第一个判断)集合2(第三个判断)集合3(第三个判断)
2024-01-25 08:41:58
482
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人