教程

在 JDBC PreparedStatement 中使用 IN 语句

1、简介 在数据库 SQL 查询中,我们经常使用 IN 语句来一次性检索匹配多个值的记录,本文将带你了解如何在 JDBC PreparedStatement 中使用 IN 子句。 2、设置 创建一个 CUSTOMER 表,并添加一些记录,以便使用 IN 子句进行查询: void populateDB() throws SQLException { String createTable = "CREATE TABLE CUSTOMER (id INT, first_name VARCHAR(50), last_name VARCHAR(50))"; connection.createStatement().execute(createTable); String load = "INSERT INTO CUSTOMER (id, first_name, last_name) VALUES(?,?,?)"; IntStream.rangeClosed(1, 100) .forEach(i -> { PreparedStatement preparedStatement1 = null; try { preparedStatement1 = connection.prepareStatement(load); preparedStatement1.setInt(1, i); preparedStatement1.setString(2, "firstname" + i); preparedStatement1.setString(3, "lastname" + i); preparedStatement1.execute(); } catch (SQLException e) { throw new RuntimeException(e); } }); } 3、PreparedStatement PreparedStatement 表示一个已经预编译的 SQL 语句,可以高效地多次使用,每次使用可以填充不同的参数。

Maven 环境变量:M2_HOME、MAVEN_HOME 和 PATH

1、概览 在 Apache Maven 安装的过程中,我们需要配置各种环境变量,以确保 Maven 能正常运行。本文将带你了解与之相关的三个变量:M2_HOME、MAVEN_HOME 和 PATH。 先来看看如何配置最早版本的 Maven。 注意:Apache Maven 1.x 和 Maven 2.x 已停止使用。第 2 节和第 3 节展示的配置仅供参考,不提倡使用。 2、Maven 1.x 下载并解压 Maven 压缩文件,进入到解压目录的 bin 文件夹。在这个目录中,你可以尝试执行一下 maven 命令,看看它是否能正常工作: $ maven -v 该命令输出如下,表示我们缺少一个必需的环境变量: MAVEN_HOME must be set MAVEN_HOME 环境变量指定了 Maven 目录(解压后的)的位置,而且该环境变量是必须的。 在系统中添加这个环境变量后,再次运行之前的命令(需要新的终端中运行): $ maven -v 结果如下: __ __ | \/ |__ _Apache__ ___ | |\/| / _` \ V / -_) ' \ ~ intelligent projects ~ |_| |_\__,_|\_/\___|_||_| v.

使用 poi-tl 模板生成 MS Word 文档

1、概览 poi-tl 是一个基于 Apache POI 的开源 Java 库,用于简化使用模板生成 Word 文档的过程。它是一个 Word 模板引擎,可根据 Word 模板和数据创建新文档。 我们可以在模板中指定样式。从模板生成的文档将保留指定的样式。模板是声明式的,纯粹基于标签,图片、文本、表格等都有不同的标签模式。poi-tl 库还支持自定义插件,以根据需要构建文档。 本文将带你了解模板中可以使用的不同标签,以及模板中自定义插件的用法。 2、依赖 要使用 poi-tl 库,我们需要在项目中添加其 maven 依赖: <dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl</artifactId> <version>1.12.2</version> </dependency> 你在 Maven Central 中找到最新版本的 poi-tl 库。 3、配置 使用 ConfigureBuilder 类来构建配置: ConfigureBuilder builder = Configure.builder(); ... XWPFTemplate template = XWPFTemplate.compile(...).render(templateData); template.writeAndClose(...); 模板文件是以 Word .docx 文件格式保存的。首先,我们使用 XWPFTemplate 类的 compile 方法对模板进行编译。模板引擎编译模板,并根据 templateData 在新的 docx 文件中进行渲染。在这里,writeAndClose 创建一个新文件,并按照模板中指定的格式写入指定的数据。templateData 是一个 HashMap 的实例,其中 Key 为 String,值为 Object。 我们可以根据自己的需要配置模板引擎。 3.1、标签前缀和后缀 模板引擎使用大括号 {{}} 表示标签。我们可以将其设置为 ${} 或其他任何形式:

Hibernate 中 INSERT 查询的 ON CONFLICT 子句

1、概览 本文将带你了解 Hibernate 6.5 中引入的用于 INSERT 查询的 ON CONFLICT 子句。 我们使用 ON CONFLICT 子句来处理使用 HQL 或 Criteria 查询插入数据时违反表约束的情况。ON CONFLICT 子句也可以用于处理 upsert 查询。 2、ON CONFLICT 子句 使用 ON CONFLICT 子句进行 insert 的语法如下: "INSERT" "INTO"? targetEntity targetFields (queryExpression | valuesList) conflictClause? conflictClause 的写法为: "on conflict" conflictTarget? conflictAction conflictAction(冲突操作)可以是 DO NOTHING 或者 DO UPDATE。 现在,来看一个例子。假设实体类 Student 的属性有 studentId 和 name: @Entity public class Student { @Id private long studentId; private String name; } studentId 属性是 Student 实体的唯一键。我们可以在 INSERT VALUES 查询中手动插入 @Id 值,或者使用 @GeneratedValue 注解来指定 ID 的生成策略。

Quarkus 整合 Mongodb

1、简介 Quarkus 是一个流行的 Java 框架,经过优化,可用于创建内存占用小、启动速度极快的应用。 与流行的 NoSQL 数据库 MongoDB 搭配使用时,Quarkus 为开发高性能、可扩展的应用提供了强大的工具包。 本文将带你了解如何使用 Quarkus 配置 MongoDB、实现基本的 CRUD 操作,以及如何使用 Quarkus 的 Panache(Object Document Mapper,ODM)来简化这些操作。 2、配置 2.1、Maven 依赖 要在 Quarkus 中使用 MongoDB,需要添加 quarkus-mongodb-client 依赖: <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-mongodb-client</artifactId> <version>3.13.0</version> </dependency> 该依赖提供了使用 MongoDB Java 客户端与 MongoDB 数据库交互的必要工具。 2.2、运行 MongoDB 数据库 本文采用 Docker 的方式运行 MongoDB,这种方式非常便捷,无需在机器上直接安装 MongoDB。 从 Docker Hub 拉取 MongoDB 镜像: docker pull mongo:latest 启动一个新的容器: docker run --name mongodb -d -p 27017:27017 mongo:latest 2.3、配置 MongoDB 数据库 要配置的主要属性是访问 MongoDB 的 URL。我们可以在 connection 字符串中包含几乎所有的配置。

通过 CLI 命令行发送 Key/Value 消息到 Kafka

1、概览 本文将带你了解从 Kafka 命令行(CLI)发送 Key/Value 消息的两种方法。 在处理金融交易、预订、在线购物等实时事件驱动系统中,确保特定 Topic 上消息的有序性是一个常见需求。在这种情况下,我们应该为发送到这些 Topic 的事件使用 Kafka Message Key。 2、先决条件 首先,需要一个正在运行的 Kafka 实例。如果没有,可以使用 Kafka Docker 或根据 Kafka 快速入门指南 建立一个环境。下面的章节将假定我们已经有一个运行中的 Kafka 实例,且可以通过 kafka-server:9092 访问。 接下来,假设我们开发的是一个 “支付系统”,而且需要从命令行发送消息。 以下是对应的 Model 类: // 支付事件 public class PaymentEvent { private String reference; private BigDecimal amount; private Currency currency; // 标准的 Getter / Setter 方法 } 另一个前提条件是要有访问 Kafka CLI 工具的权限,这很简单。首先,下载 Kafka 发行版,然后解压下载的文件,并进入解压后的文件夹中。在 bin 文件夹下就可以找到 Kafka CLI 工具。 本文后面内容中的所有 CLI 命令,都假设是在 Kafka 解码文件夹下执行的。

Spring AI 与 NVIDIA LLM API

Spring AI 现在支持 NVIDIA®(英伟达™)的 大型语言模型 API,可与各种 模型 集成。通过利用 NVIDIA 的 OpenAI 兼容 API,Spring AI 允许开发人员通过熟悉的 Spring AI API 使用 NVIDIA LLM。 本文将带你了解如何配置和使用 Spring AI OpenAI 聊天客户端来连接 NVIDIA LLM API。 完整的示例代码可从 nvidia-llm GitHub 仓库获取。 SpringAI / NVIDIA 整合文档。 先决条件 创建 NVIDIA 帐户并获得足够的积分。 从 NVIDIA 提供的 LLM 模型 中选择自己喜欢的模型。如下面截图中的 meta/llama-3.1-70b-instruct。 从模型页面获取所选模型的 API Key。 依赖 首先,将 Spring AI OpenAI Starter 添加到 Maven pom.xml 中: <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId> </dependency> 对于 Gradle 来说,需要在 build.gradle 添加如下依赖:

Quarkus 整合 Elasticsearch

1、概览 Quarkus 是一个现代框架,它能让你轻松高效地地构建高性能应用。 本文将带你了解如何在 Quarkus 中整合 Elasticsearch,一个著名的全文搜索引擎和 NoSQL 数据库。 2、依赖和配置 首先,你需要在本地主机上运行 Elasticsearch 实例(推荐用 Docker 的方式)。 然后,在 Quarkus 应用中添加依赖: <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-elasticsearch-rest-client</artifactId> <version>${quarkus.version}</version> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-elasticsearch-java-client</artifactId> <version>${quarkus.version}</version> </dependency> quarkus-elasticsearch-rest-client 依赖提供了底层的 Elasticsearch REST 客户端。 quarkus-elasticsearch-java-client 依赖提供了高级的 Elasticsearch Java 客户端。 在我们的应用中,可以根据需要选择使用合适的客户端。 接下来,将 Elasticsearch HOST 添加到 application.properties 文件中: quarkus.elasticsearch.hosts=localhost:9200 现在,我们可以开始在 Quarkus 应用中使用 Elasticsearch 了。ElasticsearchRestClientProducer 和 ElasticsearchJavaClientProducer 会自动创建所有必要的 Bean。 3、Elasticsearch 低级 REST 客户端 我们可以使用 Elasticsearch 低级 REST 客户端 将应用与 Elasticsearch 集成。这使得我们可以完全控制序列化和反序列化过程,并允许我们使用 JSON 构建 Elasticsearch 的查询。

在 Spring Boot 中使用 SendGrid 发送电子邮件

1、概览 无论是用户注册、密码重置还是促销活动,发送电子邮件都是现代 Web 应用的一项重要功能。 本文将带你了解如何在 Spring Boot 应用中使用 SendGrid 发送电子邮件。 2、SendGrid 设置 在开始之前,我们首先需要一个 SendGrid 账户。SendGrid 提供了免费套餐,允许我们每天发送多达 100 封电子邮件,这对于演示来说已经足够了。 注册完成后,需要创建一个 API Key 来对我们发送到 SendGrid 服务的请求进行 身份认证。 3、项目设置 在开始使用 SendGrid 发送电子邮件之前,需要添加 SDK 依赖并配置应用。 3.1、依赖 首先,在项目的 pom.xml 文件中添加 SendGrid SDK 依赖: <dependency> <groupId>com.sendgrid</groupId> <artifactId>sendgrid-java</artifactId> <version>4.10.2</version> </dependency> 该依赖为我们提供了与 SendGrid 服务交互和从应用发送电子邮件所需的类。 3.2、定义 SendGrid 配置属性 现在,为了与 SendGrid 服务交互并向用户发送电子邮件,我们需要配置 API Key 以验证 API 请求。我们还需要配置发件人姓名和电子邮件地址,它们应与我们在 SendGrid 账户中设置的发件人身份相匹配。 我们在项目的 application.yaml 文件中配置这些属性,并使用 @ConfigurationProperties 将这些值映射到 POJO,Service 层在与 SendGrid 交互时会引用配置的 POJO: @Validated @ConfigurationProperties(prefix = "com.

Hibernate 6 中序列的命名策略

1、简介 本文将带你了解如何为数据库序列(Sequences)配置 Hibernate 6 的隐式 命名策略。Hibernate 6 引入了几种新的命名策略,这些策略会影响序列的命名和使用方式。 2、标准命名策略 默认情况下,Hibernate 6 使用标准命名策略。它根据实体名称和列名称生成序列名称。假如,我们有一个带有 id 列的实体 Person,那么序列名称就是 person_seq。 要修改命名策略,需要在 application.properties 中为不同的命名策略添加必要的配置。 # 使用标准命名策略 spring.jpa.properties.hibernate.id.db_structure_naming_strategy=standard 下面介绍如何为每种命名策略设置配置。 来看一个基本的 Person 实体类: @Entity public class Person { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private Long id; private String name; // Getter / Setter 省略 } 在本例中,由于我们使用的是标准策略,因此在建表的同时,Hibernate 会自动生成一个名为 person_seq 的序列: Hibernate: create table person ( id bigint not null, name varchar(255), primary key (id) ) Hibernate: create sequence person_seq start with 1 increment by 50 标准策略的一个关键点是其默认增量(increment)值。Hibernate 会分配一个较大的值,如 50,以优化批处理操作,减少序列检索所需的数据库调用次数。