MyBatis `foreach` 标签深度解析:动态SQL与批量操作利器
引言在MyBatis中,动态SQL是其最强大的功能之一。而在构建动态SQL时,处理集合(如List, Array, Map)的遍历是一项常见需求,尤其是在构建IN条件查询或执行批量插入/更新时。MyBatis为此提供了<foreach>标签,它是一个功能强大的循环工具,能够极大地简化SQL的编写和维护。 本文将深入解析<foreach>标签的各个属性,并通过清晰的示例展示其在不同场景下的应用,包括处理List、Array和Map类型的参数,助你彻底掌握这个动态SQL利器。 <foreach> 标签属性详解<foreach>标签的强大之处在于其灵活的属性配置,可以构建出各种复杂的循环逻辑。 123456789101112131415161718- collection: 要做foreach的对象,作为入参时,List对象默认用"list"代替作为键,数组对象"array"代替作为键,Map对象没有默认的键。在作为入参时可以使用@Param("keyName")来设置...
MapStruct的使用
MapStruct是一个代码生成库,简化了Java对象到Java对象之间的映射过程。通过注解接口,它可以自动生成转换代码,支持多种映射场景,如属性映射、定制方法、目标对象更新等。此外,还支持数据类型转换、嵌套对象映射和使用上下文对象定制转换。在Spring项目中,可通过Maven/Gradle依赖和配置进行集成。 注:MapStruct 从版本 1.2.0.Beta1 开始支持与 Lombok 整合,利用 Lombok 生成的 getter、setter 和构造函数来生成映射实现。 配置Maven1234567891011121314151617181920212223242526272829303132<dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>${mapstruct.version}</version><...
jmx_exporter 的安装及配置使用
参考: https://www.cnblogs.com/JIKes/p/18183537 https://prometheus.github.io/jmx_exporter 简介为了使用Prometheus监控JVM,你需要一个能够采集JVM指标的工具,比如jmx_exporter。 地址:https://github.com/prometheus/jmx_exporter kube-prom operator监听grafana dashboard id【7727】
整理 Java 8 Stream 的用法
前言 Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。 Stream特点 stream不存储数据,而是按照特定的规则对数据进行计算,一般会输出结果。 stream不会改变数据源,通常情况下会产生一个新的集合或一个值。 stream具有延迟执行特性,只有调用终端操作时,中间操作才会执行。 Stream实例化方式通过集合12345678910111213141516public static List<Employee> getEmployeeDataList(){ List<Employee> list = new ArrayList<>(); list.add(new Employee(1,"张三",20,8500D,1)); list.add(new Employee(2,"李四",18,600D,1)); list.add(new Employee(3,"王五",21,5500D,3)); ...
设计模式
面向对象设计原则我们在进行软件开发时,不仅仅需要将最基本的业务给完成,还要考虑整个项目的可维护性和可复用性,我们开发的项目不单单需要我们自己来维护,同时也需要其他的开发者一起来进行共同维护,因此我们在编写代码时,应该尽可能的规范。如果我们在编写代码时不注重这些问题,整个团队项目就像一座屎山,随着项目的不断扩大,整体结构只会越来越遭。 甚至到最后你会发现,我们的程序居然是稳定运行在BUG之上的… 所以,为了尽可能避免这种情况的发生,我们就来聊聊面向对象设计原则。 单一职责原则单一职责原则(Simple Responsibility Pinciple,SRP)是最简单的面向对象设计原则,它用于控制类的粒度大小。 一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。 比如我们现在有一个People类: 123456789101112131415161718192021222324252627282930//一个人类public class People { /** * 人类会编程 */ public void coding()...
Quarkus 结合 OIDC 及 Hibernate 的实战指南
本文介绍如何在 Quarkus 框架中集成 OIDC 认证和 Hibernate ORM,实现多租户数据源配置和身份认证功能。 参考资料:Quarkus 官方文档 Quarkus 简介Quarkus 是专为 OpenJDK HotSpot 和 GraalVM 量身定制的 Kubernetes 原生 Java 技术栈,采用最佳 Java 库和标准精心打造。它具有以下特点: 快速启动:采用编译时启动技术,实现惊人的快速启动时间 低内存占用:极低的 RSS 内存占用(不仅是堆大小) 云原生优化:在 Kubernetes 等容器编排平台中提供近乎即时的向上扩展和高密度内存利用率 响应式编程:支持 JDK 9+ 的 Publisher/Flow 响应式编程模型 开源协议:所有依赖项都基于 Apache Software License 2.0 官方提供了多个性能对比示例:https://quarkus.io/vision/continuum 环境准备基础要求 JDK:9 或以上版本 Maven:3.6.2 或以上版本 IDE:IntelliJ IDEA(推荐) ID...
CompletableFuture
CompletableFuture 在Java8中,CompletableFuture提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,并且提供了函数式编程的能力,可以通过回调的方式处理计算结果,也提供了转换和组合 CompletableFuture 的方法。 它可能代表一个明确完成的Future,也有可能代表一个完成阶段( CompletionStage ),它支持在计算完成以后触发一些函数或执行某些动作。 它实现了Future和CompletionStage接口 创建CompletableFuture supplyAsync 有 runAsync 无两者的区别在于是否返回result 执行 CompletableFuture.allOf() CompletableFuture.anyOf()两者的区别在于是否需要全部任务执行完在继续allOf是阻塞式的,需要全部future执行完才会继续anyOf则是有个执行完就ok调用get方法,得到结果值 回调函数 thenApply回调函数(callback) 当前阶段正常完成以后执行,而且当前阶...
Java HashMap 底层实现原理
转自:https://mrbird.cc/Java-HashMap%E5%BA%95%E5%B1%82%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.html 本节用于记录Java HashMap底层数据结构、方法实现原理等,基于JDK 1.8。 底层数据结构Java HashMap底层采用哈希表结构(数组+链表、JDK1.8后为数组+链表或红黑树)实现,结合了数组和链表的优点: 数组优点:通过数组下标可以快速实现对数组元素的访问,效率极高; 链表优点:插入或删除数据不需要移动元素,只需修改节点引用,效率极高。 HashMap图示如下所示: HashMap内部使用数组存储数据,数组中的每个元素类型为Node<K,V>: 123456789101112131415161718192021222324252627282930313233343536373839static class Node<K,V> implements Map.Entry<K,V> { final int hash; ...
JVM 调优相关记录
jvm调优相关jvisualvm VisualVM是集成了命令行JDK工具和轻量级分析功能的可视化工具。专为开发和生产时间使用而设计。 结合visualvm gc插件使用 修改插件 1231. 先查看java版本,再去下面链接查看应该粘贴哪个插件地址http://visualvm.github.io/pluginscenters.html2. 我的是1.8_102 https://visualvm.github.io/archive/uc/8u40/updates.xml.gz 如下是查看jmeter jvm参数,cpu内存,堆内存监控等 一些gc相关 健康的gc升之后极速下降,再继续升,下降 gc相关下文引用shiyonghm 1234567891011JVM区域总体分两类,heap区和非heap区。heap区又分为:Eden Space(伊甸园)、Survivor Space(幸存者区)、Old Gen(老年代)。非heap区又分:Code Cache(代码缓存区);Perm Gen(永久代);Jvm Stack(java虚拟机栈);...
如何使用 jstack 分析异常线程以及线程状态
使用top命令定位异常进程。找到CPU和内存占用率都非常高的pid,假设为11268 top 此时可以再执行ps -ef | grep java,查看所有的java进程,在结果中找到进程号为11268的进程,可以查看是哪个应用占用的该进程。 ps -ef|grep java 使用top -H -p 进程号查看异常线程,(-H : 加上这个选项启动top,top一行显示一个线程。否则,它一行显示一个进程。) top -H -p 11268 使用printf "%x\n" 线程号将异常线程号转化为16进制,假设异常线程为11422 printf "%x\n" 11422 -> 2c9e 使用jstack 进程号|grep 16进制异常线程号 -A90来定位异常代码的位置(-A90是指输出的日志行数)。可以看到异常代码的位置。 jstack 11268|grep 2c9e -A90 介绍top命令在linux环境下,可以通过top命令查看各个进程的cpu使用情况,默认按cpu使用率排序 通过top -Hp 可以查看...
