- 博客(39)
- 收藏
- 关注
原创 Spring Boot与模板方法模式:实现统一的日志处理流程
在Spring Boot应用程序中,使用模板方法模式来实现统一的日志处理流程是一种有效的方法。通过这种方式,你可以使用模板方法模式来定义一个统一的日志处理流程,同时允许不同的日志处理器实现特定的日志格式化逻辑。在Spring Boot中实现日志处理的模板方法模式1. 定义抽象的日志处理器首先,创建一个抽象类,该类将定义日志处理的模板方法以及一些具体的日志处理步骤。3. 使用Spring依赖注入来选择合适的日志处理器你可以在服务层或者控制器中通过Spring的依赖注入来选择并使用具体的日志处理器。
2024-09-29 11:31:27 722
原创 Spring Boot与观察者模式实现数据同步更新机制
•Subject(被观察者):维护了一个观察者列表,并提供了添加、删除以及通知观察者的接口。•ConcreteObserver(具体的观察者):实现了更新接口,以保持其状态与被观察者的状态一致。在Spring Boot中实现观察者模式这里有一个简单的例子来展示如何在Spring Boot中使用观察者模式实现数据同步更新机制。5. 使用Spring的依赖注入来注册观察者你可以在配置类或主应用类中通过@Autowired将所有的观察者注册到被观察者中。4. 创建具体的被观察者。观察者模式的基本概念。
2024-09-29 11:11:06 737
原创 StopWath,apache commons lang3 包下的一个任务执行时间监视器的使用
【代码】StopWath,apache commons lang3 包下的一个任务执行时间监视器的使用。
2024-09-27 14:07:14 557
原创 常用的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 770
原创 SQL常用数据过滤 - EXISTS运算符
用于检查查询子句是否存在满足特定条件的记录,如果有一条或者多条记录存在,则返回True,否则返回False。EXISTS 直接跟在WHERE关键字之后,中间没有列名;子查询查询结果有一条或多条记录,则返回True。EXISTS后面接子查询;这里通过2张进行举例,
2024-09-26 14:50:58 438
原创 SQL中关于bit类型字段传入任何值都可以查出数据
在SQL中,BIT 类型的字段通常用于存储布尔值(例如,真/假,是/否),或者更准确地说,它存储一个位值,可以是0或1。• 当你向 BIT 类型的字段传递一个非0或1的值时,数据库可能会尝试将这个值转换为适合 BIT 类型的数据。3. 索引和查询优化器:•如果你的查询没有正确地利用索引,或者查询优化器决定采用全表扫描的方式,那么即使条件不匹配,也可能返回所有记录。5. NULL值处理:•如果 BIT 字段允许 NULL 值,并且你在查询时没有考虑到这一点,那么传入任何值都可能不会排除那些 NULL 的行。
2024-09-26 14:11:31 332
原创 guava中对Map的扩展数据结构
首先,这里最明显的就是在取出对象时省去了复杂的强制类型转换,避免了手动进行类型转换的错误。其次,我们可以看一下。方法返回的集合也不是一个独立的对象,可以理解为集合视图的关联,对这个新集合的操作仍然会作用于原始的。提供了将一个键映射到多个值的形式,使用起来无需定义复杂的内层集合,可以像使用普通的。所以,如果你想缓存对象,又不想做复杂的类型校验,那么使用方便的。大家可能会疑问,如果只是存对象的话,像下面这样用普通的。,说明了取出的确实是我们之前创建并放入的那个对象。的个数,例如下面这行代码打印的结果就会是2。
2024-09-04 14:05:27 1024
原创 mybatisplus使用拦截器动态修改SQL语句
在 MyBatis Plus 中,你可以使用自定义的拦截器来动态修改 SQL 语句。MyBatis Plus 提供了一个 InnerInterceptor 接口,你可以实现这个接口来创建自己的拦截器。这样,你就可以在 MyBatis Plus 中使用自定义拦截器来动态修改 SQL 语句了。创建好拦截器之后,你需要在 MyBatis Plus 的配置中注册这个拦截器。在 Spring Boot 应用中,确保拦截器被正确注册并且在 MyBatis Plus 的生命周期内可用。
2024-08-28 16:34:14 592
原创 java使用本地缓存,每天获取新的从0开始自增流水号
可以使用synchronized关键字或java.util.concurrent.atomic.AtomicInteger来实现。使用本地缓存如java.util.concurrent.ConcurrentHashMap来存储流水号。键可以是日期字符串(例如 "2023-04-01")。当需要获取流水号时,先检查当前日期与缓存中的键是否一致。由于流水号可能会被多个线程访问,因此需要保证线程安全。如果不一致,则重置流水号为0,并更新键。如果一致,则直接递增流水号并返回。在一天的开始时将流水号设置为0。
2024-08-26 17:01:17 221
原创 java8函数式接口的简单使用
Java 8 的 java.util.function 包中定义了一系列函数式接口,如 Function, Predicate, Consumer, Supplier 等,它们可以用于多种用途,例如数据转换、过滤、收集等。接口代表了一个接受一个类型参数 T 的输入,并产生一个类型 R 的结果的函数。接口代表了一个接受一个类型 T 的输入,并且不返回任何结果的操作。接口代表了一个接受一个类型 T 的输入,并返回一个布尔值的结果。它有一个抽象方法 test。接口代表了一个无参且返回一个类型 T 的结果的操作。
2024-08-23 10:56:49 209
原创 MyBatisPlus当字段为null时也更新该字段解决方法
MyBatisPlus 的 updateById 方法默认会将 null 值的字段更新到数据库中。如果使用 LambdaUpdateWrapper 或 UpdateWrapper 进行更新操作,也可以明确地设置字段为 null。如果需要更精细的控制,可以使用 MyBatisPlus 提供的 update 方法结合自定义的 SQL 语句来更新 null 值。确保字段允许 null 值:在数据库设计时,请确保那些你想要设置为 null 的字段允许 null 值。4 @TableField 注解配置。
2024-08-09 17:11:56 1535 1
原创 在 Spring Boot 应用中集成 Ehcache 并使用多个缓存实例
注意:spring-boot-starter-cache 是必需的,因为它提供了 Spring Cache 抽象层,而 ehcache 依赖则是实际的缓存实现。这种方式允许你更细粒度地控制缓存的读取、写入和清理过程,但同时也需要你处理更多的细节,比如并发控制、异常处理等。一旦初始化完成,你就可以在任何需要的地方使用 Ehcache 了。上述示例中,cache1 是在 ehcache.xml 中定义的第一个缓存实例名称。这样,同一个方法调用将被同时缓存在两个不同的缓存实例中。使用 Ehcache。
2024-07-31 15:01:12 339
原创 mybatisplus 实现接口MetaObjectHandler自动填充字段值
MetaObjectHandler是MyBatis-Plus提供的一个接口,用于处理元对象(MetaObject)级别的操作,主要用于自动填充字段,比如在插入或更新数据时自动填充创建时间、修改时间等字段。在这个例子中,insertFill方法会在插入数据前被调用,updateFill方法会在更新数据前被调用。在这里,@TableField注解的fill属性指定了字段的填充策略,FieldFill.INSERT表示仅在插入时填充,FieldFill.INSERT_UPDATE表示在插入和更新时都填充。
2024-07-25 15:49:37 189
原创 在一个事物方法中开启新事物,完成对数据库的修改
但是,在一个已经标记为@Transactional的方法内部调用另一个也标记了@Transactional的方法时,如果不正确处理,可能会导致一些意料之外的行为。这是因为默认情况下,Spring的@Transactional是基于代理的,这意味着如果在一个事务方法中直接调用另一个事务方法,后者并不会开启新的事务。这种方式会强制在当前事务的上下文中开启一个新的事务。这样,你就可以在一个已经处于事务中的方法内,安全地开启并完成对数据库的另一组修改操作。如何在一个事务方法中开启新事务。
2024-07-23 13:38:50 500
原创 spring事务详解
默认配置下,spring只有在抛出的异常为运行时unchecked异常时才回滚该事务,也就是抛出的异常为RuntimeException的子类(Errors也会导致事务回滚),而抛出checked异常则不会导致事务回滚。当事务方法被另外一个事务方法调用时,必须指定事务应该如何传播,例如,方法可能继续在当前事务中执行,也可以开启一个新的事务,在自己的事务中执行。因为JDK动态代理采用的是接口实现的方式,通过反射调用目标类的方法,此时如果调用本类的方法,this指的是目标类,并不是代理类所以不会走代理。
2024-07-06 17:03:07 778
原创 spring 事件监听使用实例
在Spring Boot应用中,当EventProducerService的produceEvent方法被调用时,它会发布一个CustomEvent,然后CustomEventListener会监听到这个事件并执行handleCustomEvent方法。在这个例子中,当我们启动应用并调用produceEvent时,CustomEventListener会打印出接收到的事件数据。在程序中,当某些事情发生时(比如用户点击了按钮),系统会发送一个事件,然后监听这个事件的处理器就会被触发,做出相应的反应。
2024-05-30 14:53:46 170
原创 @PostConstruct使用
PostConstruct 是一个来自Java的JSR 250规范的注解,用于标记一个方法,该方法将在对象初始化后但在其任何依赖注入完成之后被调用。在这个例子中,一旦MyService的bean被Spring容器创建并注入了所有依赖,init()方法就会被自动调用。@PostConstruct注解的使用确保了这些初始化操作只在对象创建时执行一次。注意,@PostConstruct注解的方法不能有参数,且方法的访问修饰符至少是protected,否则Spring容器可能无法识别和调用它。
2024-05-28 16:52:35 213
原创 Springboot 普通类调用 Mapper 接口使用 MybatisPlus 报错:空指针异常(NullPointerException)
被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Serclet的inti()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
2024-05-22 11:16:43 731
原创 mybatis-plus批量插入报错Invalid bound statement (not found): insertBatchSomeColumn问题解决
【代码】mybatis-plus批量插入报错Invalid bound statement (not found): insertBatchSomeColumn问题解决。
2024-05-21 15:02:14 646 1
原创 mysql 重复数据删除只保留一条
插入去重数据:使用INSERT INTO ... SELECT语句结合GROUP BY或DISTINCT将去重后的数据插入临时表。直接在原表上操作,通过自连接删除重复项,但需确保你有足够的方式确定哪一行是需要保留的(例如,通过日期、ID或其他唯一条件)。对于MySQL 8.0及以上版本,可以使用窗口函数ROW_NUMBER()来标记重复行,然后删除标记为非1(即重复的)行。将临时表数据移回原表:将临时表中的数据插入回原表。清理临时表:最后,如果不需要了,可以删除临时表。删除原表数据:清空原表数据。
2024-05-16 09:35:14 1869
原创 SQL窗口函数
我们的数据集很简单,是2023年两个地区的六行收入数据。如果我们使用这个数据集,对每个地区的收入进行GROUP BY求和,结果只会剩下两行,每个地区一行,然后是收入的总和:我希望你将窗口函数视为类似于这样的方式,但聚合并不是减少行数,而是在“后台”运行,并将值添加到现有行中。请注意,我们没有使用任何GROUP BY,数据集保持不变。然而,我们还是能够获得所有收入的总和。在我们更深入地了解它的工作原理之前,让我们先快速了解一下全部语法,然后再开始积累知识。
2024-05-16 09:32:24 1145
原创 使用try-with-resources自动关闭资源
总之,try-with-resources 是一种提高代码健壮性和可读性的现代Java特性,特别适用于需要管理外部资源(如文件、数据库连接、网络连接等)的场景。try-with-resources 是 Java 7 引入的一种异常处理和资源管理的新特性,它简化了以往需要显式关闭资源的代码,自动管理资源的生命周期,确保在代码块执行完毕后即使发生异常也能关闭资源,避免资源泄漏。)隔开,所有资源都会被自动管理。1. 自动关闭资源:最显著的优点是它能确保资源被正确关闭,无需在 finally 块块中手动关闭。
2024-05-11 14:06:57 366 1
原创 for循环的每次循环向数据库插入一条数据不能及时插入的原因及解决方法
1.将循环内逻辑抽离出一个新的方法,单独添加事物并设置新方法事物的传播行为为Propagation.REQUIRES_NEW,然后在循环内调用方法。这样调用这个方法后,这个方法单独开启事务,每次执行完,单独提交,遇到异常单独回滚,外部方法收到抛出的异常并不处理就好,这样内外事务互不影响。而对象内部的自我调用将无法实施切面中的增强,所以被调用方法的事物不生效。但是有的时候我们并不关心本次循环的过程中是否出现异常,这样的话,我们就希望,在for循环中,每次循环都单独回滚,单独提交,且不影响外部的代码环境。
2024-05-10 11:33:47 408
转载 使用 CompletableFuture 来优化接口响应慢问题
这两种方式虽然简单直观,但效率比较低下,随着应用复杂度的增加,这种低效的做法将会带来严重的性能问题。通过allOf,anyOf这两种方式我们可以让任务之间协同工作,join()和get()方法都是阻塞调用它们的线程(通常为主线程)来获取CompletableFuture异步之后的返回值。如下,我们定义了一个异步任务类,创建每一个查询操作的CompletableFuture异步任务放入线程中执行,并利用allOf等待全部任务执行完成,执行完成后组装查询信息到聚合对象中返回。
2024-05-08 10:00:25 393 1
原创 MybatisPlus自动分页,total不准确的问题
正常情况下这样做并没有什么问题,但是当我select 后面需要聚合,比如使用sum函数的时候,自动优化得到的total就会比预期多。发现mybatis自动优化了sql,把select 后面要查询的内容全部省略,直接count。最近在使用分页功能的时候发现统计到的total和预期不符,于是在控制台查看分页count sql,不过我还是不太推荐这么做,因为本身SQL有聚合,原先的SQL相当于查询全部数据,效率比较低。当日解决办法也是有的,就是禁用自动优化。这样他会在你原先的SQL外面包一层。
2024-04-29 11:39:31 423
原创 sqlserver 字段值拼接
请注意,选择哪种方法取决于您的 SQL Server 版本、拼接的具体需求(如是否需要处理 NULL 值、是否需要分隔符等),以及对性能的要求。以下是几种常见的字段拼接技术:1. 使用 + 运算符这是早期版本 SQL Server 中最常用的字段拼接方法,适用于字符串类型的字段。4. 使用 STRING_AGG 函数在 SQL Server 2017 及更高版本中,STRING_AGG 函数被引入,专门用于将多行数据的某个字段值拼接到一起,形成单个字符串,同时支持指定分隔符。
2024-04-15 16:56:33 2631 1
原创 Java 反射统计对象集合中指定字段的和
这个工具类方法通过反射获取对象的getter方法,然后通过流(Stream)对集合中的每个对象调用getter方法获取字段值并进行求和。注意,此方法假设对象的字段都有对应的getter方法,并且字段值都是Number类型或其子类。在实际使用时,需要处理可能出现的反射异常。如果字段没有对应的getter方法,或者字段值不是Number类型,可能需要进行适当的异常处理或类型转换。在Java中,如果你希望通过反射来对对象集合中的多个字段进行统计求和,可以创建一个工具类,使用反射API和流(Stream)来实现。
2024-04-15 16:50:53 247 1
原创 mybatis 一对多嵌套查询
注意,为了实现这样的关联查询,还需要确保数据库表结构符合关联关系(例如在order表中有user_id作为外键指向user表的id),并且在对应的UserMapper和OrderMapper中完成了基本的CRUD方法映射。以下是一个简单的例子说明如何在MyBatis中实现一对多查询。在MyBatisPlus中,处理一对多关系的查询相对较为简便,主要是借助于模型类的关联注解以及特殊的查询方法。以下是一个简化的例子:假设我们有两个实体类:User和Order,一个用户可以有多个订单,这是一种一对多的关系。
2024-04-11 16:07:59 809 1
原创 Java 8 Stream流常用操作
方法接受一个可选的比较器,将Stream中的元素按照指定方式(默认为自然顺序)进行排序,返回一个新的Stream。方法的参数是一个函数,该函数将一个元素映射成一个Stream,最终将这些Stream合并成一个新的Stream。类型的参数,用于过滤Stream中的元素,并返回符合条件的元素组成的新Stream。类型的参数,可以在Stream中的每个元素执行所提供的操作,该方法不会影响Stream的元素。类型的参数,用于将一个元素转换为另一个元素,并返回一个新的Stream。方法类似,不同之处在于。
2024-04-03 10:08:59 548 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 4312 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 433
原创 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 622
原创 Java 8 Stream流创建(二)
方法从文件中创建一个Stream流,每个元素代表文件中的一行。注意:在使用无限Stream流时,通常需要使用。集合类(如List和Set)可以通过调用。方法从数组创建一个Stream流。方法创建一个Stream流。方法限制元素数量,以避免无限循环。
2024-03-05 16:19:31 359 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 6197 2
原创 Java多线程+List分段完美解决导入等批量更新场景问题!
获取需要进行批量更新的大集合A,对大集合进行拆分操作,分成N个小集合A-1 ~ A-N。开启线程池,针对集合的大小进行调参,对小集合进行批量更新操作。对流程进行控制,控制线程执行顺序。开启异步执行任务的线程池。
2024-02-07 16:13:10 501 1
原创 Map+函数式接口方法解决 if-else
Map+函数式接口通过Map.get(key)来代替 if-else的业务分派,能够避免策略模式带来的类增多、难以俯视整个业务逻辑的问题。策略模式通过接口、实现类、逻辑分派来完成,把 if语句块的逻辑抽出来写成一个类,更好维护。入参String resourceId是用来查数据库的,这里简化了,传参之后不做处理。这样子写的好处是非常直观,能直接看到判断条件对应的业务逻辑。对应的业务逻辑放在value中。用上了Java8的新特性。判断条件放在key中。
2024-02-07 15:57:45 370 3
原创 Java 集合去重
这里假设getProperty()是获取对象属性的方法。如果对象的类实现了equals()和hashCode()方法,并且这两个方法是基于你想去重的那个属性来实现的,那么可以直接将列表转换为HashSet以达到去重的目的。请注意,这些示例假定MyObject是一个代表具体业务实体的类,而getProperty()是返回该类中用于判断是否重复的属性值的方法。这个方法会根据对象的属性值作为键存入Map中,由于Map不允许键重复,所以结果自然就是唯一的。方法2:Stream API (Java 8及以上版本)
2024-02-06 17:08:39 521 1
原创 sql 判断两个时间段是否存在交集
数据库的字段 start_time, end_time。集合1并上(or)集合3实际上包含了集合4逻辑。我的使用场景: A 表 将时间有交叉的数据查出来。集合1(第一个判断)集合2(第三个判断)集合3(第三个判断)
2024-01-25 08:41:58 508
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人