当前位置: 首页 > news >正文

Mybatis Plus 集成 PgSQL 指南

“哲学家们只是用不同的方式解释世界,而问题在于改变世界。”

——卡尔·马克思 (Karl Marx)

解读:马克思强调了实践的重要性,主张哲学不仅要理解世界,更要致力于改造世界。

本文我们引入 Mybatis Plus 作为 ORM ,并且使用 PgSQL 作为数据库,实现一个自定义复合类型数组参数的自定义函数。

一、POM 依赖

<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
<dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>42.6.0</version>
</dependency><!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version>
</dependency><!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version>
</dependency><!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.30</version><scope>provided</scope>
</dependency><!-- web -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

二、配置 YML

spring:datasource:# 数据源基本配置url: jdbc:postgresql://127.0.0.1:5432/dbnameusername: postgrespassword: #################driver-class-name: org.postgresql.Drivertype: com.alibaba.druid.pool.DruidDataSource

三、配置 Mybatis

package com.example.pgsqldemo.config;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;/*** @version: V1.0* @author: 余衫马* @description: mybatis 配置* @data: 2024-10-25 14:25**/
@Configuration
@MapperScan("com.example.pgsqldemo.dao")
public class MybatisConfig {
}

四、实体类封装

模拟复合类型传参,创建 MySettingsDTO 类,

package com.example.pgsqldemo.dto;import lombok.Data;/*** @version: V1.0* @author: 余衫马* @description: 自定设置类 DTO* @data: 2024-10-25 14:42**/
@Data
public class MySettingsDTO {/*** 配置项*/private String item;/*** 配置值*/private String content;}

创建 TestDTO 它有一个成员 List<MySettingsDTO> mySettingsDTOList

package com.example.pgsqldemo.dto;import lombok.Data;import java.util.List;/*** @version: V1.0* @author: 余衫马* @description: 测试 DTO* @data: 2024-10-25 14:37**/
@Data
public class TestDTO {private List<MySettingsDTO> mySettingsDTOList;}

五、数据库操作

创建复合类型,

CREATE TYPE type_my_setting AS (item text,content text
);

创建函数 dynamic_sql_query ,输出 item 字母顺序上最大的一行记录

CREATE OR REPLACE FUNCTION dynamic_sql_query (arr type_my_setting [])
RETURNS type_ptl_setting  AS $$
DECLAREmax_record type_my_setting ;
BEGIN-- Initialize max_record with the first element of the arraymax_record := arr[1];-- Loop through the array to find the record with the maximum item valueFOR i IN 2 .. array_length(arr, 1) LOOPIF arr[i].item > max_record.item THENmax_record := arr[i];END IF;END LOOP;RETURN max_record;
END;
$$ LANGUAGE plpgsql;

函数测试,

SELECT dynamic_sql_query (ARRAY[ROW('apple', 'content1')::type_my_setting ,ROW('banana', 'content2')::type_my_setting ,ROW('cherry', 'content3')::type_my_setting 
]);

六、自定义handler

处理复合类型数组

package com.example.pgsqldemo.handler;import com.example.pgsqldemo.dto.MySettingsDTO;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.postgresql.util.PGobject;import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;/*** @version: V1.0* @author: 余衫马* @description: MySettings复合类型数组处理器* @data: 2024-10-25 17:07**/
public class MySettingsArrayTypeHandler extends BaseTypeHandler<List<MySettingsDTO>> {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, List<MySettingsDTO> parameter, JdbcType jdbcType) throws SQLException {Connection conn = ps.getConnection();PGobject[] pgObjects = new PGobject[parameter.size()];// 每个对象都是 type_my_setting 复合类型for (int j = 0; j < parameter.size(); j++) {MySettingsDTO mySettingsDTO = parameter.get(j);PGobject pgObject = new PGobject();pgObject.setType("type_my_setting");pgObject.setValue(String.format("(%s,%s)", mySettingsDTO.getItem(), mySettingsDTO.getContent()));pgObjects[j] = pgObject;}// pgsql 复合数组类型 type_my_setting[]Array array = conn.createArrayOf("type_my_setting", pgObjects);ps.setArray(i, array);}@Overridepublic List<MySettingsDTO> getNullableResult(ResultSet rs, String columnName) throws SQLException {return toList(rs.getArray(columnName));}@Overridepublic List<MySettingsDTO> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return toList(rs.getArray(columnIndex));}@Overridepublic List<MySettingsDTO> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {return toList(cs.getArray(columnIndex));}private List<MySettingsDTO> toList(Array pgArray) throws SQLException {if (pgArray == null) {return null;}Object[] array = (Object[]) pgArray.getArray();List<MySettingsDTO> list = new ArrayList<>();for (Object obj : array) {PGobject pgObject = (PGobject) obj;String[] values = Objects.requireNonNull(pgObject.getValue()).replace("(", "").replace(")", "").split(",");MySettingsDTO mySettingsDTO = new MySettingsDTO(values[0], values[1]);list.add(mySettingsDTO);}return list;}
}

七、Mapper 与 XML 编写

在 DAO 层新建一个动态查询方法 dynamicSqlQuery

package com.example.pgsqldemo.dao;import com.example.pgsqldemo.dto.TestDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;import java.util.HashMap;
import java.util.List;/*** @version: V1.0* @author: 余衫马* @description: 测试 DAO* @data: 2024-10-25 14:26**/
@Mapper
public interface TestDao {public List<HashMap<String, Object>> dynamicSqlQuery(@Param("dto") TestDTO dto);}
<select id="dynamicSqlQuery" resultType="java.util.HashMap" statementType="CALLABLE">select * FROM dynamic_sql_query(#{dto.mySettingsDTOList,jdbcType=ARRAY,typeHandler=com.example.pgsqldemo.handler.MySettingsArrayTypeHandler});
</select>

八、Postman测试

POST localhost:8080/api/dynamicSqlQuery# 请求报文
{"mySettingsDTOList": [{"item": "AAAAA","content": "BBBBB"},{"item": "123","content": "456"},{"item": "ABC","content": "FFFFFF"}]
}# 响应报文
[{"item": "ABC","content": "FFFFFF"}
]

可以看到,传复合类型的数组参数可以被 SQL 函数正常执行,并返回了预期结果。

相关文章:

Mybatis Plus 集成 PgSQL 指南

“哲学家们只是用不同的方式解释世界&#xff0c;而问题在于改变世界。” ——卡尔马克思 (Karl Marx) 解读&#xff1a;马克思强调了实践的重要性&#xff0c;主张哲学不仅要理解世界&#xff0c;更要致力于改造世界。 本文我们引入 Mybatis Plus 作为 ORM &#xff0c;并且使…...

Rust常用数据结构教程 Map

文章目录 一、Map类型1.HashMaphashMap的简单插入entry().or_insert()更新hashMap 2.什么时候用HashMap3.HashMap中的键 二、BTreeMap1.什么时候用BTreeMap2.BTreeMap中的键 参考 一、Map类型 键值对数据又称字典数据类型 主要有两种 HashMap - BTreeMap 1.HashMap HashM…...

<el-popover>可以展示select change改变值的时候popover 框会自动隐藏

一、问题定位 点击查看详细链接 element-plus 的 popover 组件&#xff0c;依赖 tooltip 组件&#xff1b;当 tooltip 的 trigger 的值不是 hover 时&#xff0c;会触发 close 事件&#xff1b;下拉框的 click 事件&#xff0c;触发了 tooltip 组件的 close 事件 总结一下&am…...

SQLI LABS | Less-37 POST-Bypass mysql_real_escape_string

关注这个靶场的其它相关笔记&#xff1a;SQLI LABS —— 靶场笔记合集-CSDN博客 0x01&#xff1a;过关流程 输入下面的链接进入靶场&#xff08;如果你的地址和我不一样&#xff0c;按照你本地的环境来&#xff09;&#xff1a; http://localhost/sqli-labs/Less-37/ 是一个登…...

数字后端零基础入门系列 | Innovus零基础LAB学习Day9

Module 16 Wire Editing 这个章节的学习目标是学习如何在innovus中手工画线&#xff0c;切断一根线&#xff0c;换孔&#xff0c;更改一条net shape的layer和width等等。这个技能是每个数字IC后端工程师必须具备的。因为项目后期都需要这些技能来修复DRC和做一些手工custom走线…...

深度学习:GLUE(General Language Understanding Evaluation)详解

GLUE&#xff08;General Language Understanding Evaluation&#xff09;详解 GLUE&#xff08;General Language Understanding Evaluation&#xff09;是一个用于评估和比较自然语言理解&#xff08;NLU&#xff09;系统的综合基准测试。它包括了一系列的任务&#xff0c;旨…...

基于Multisim直流稳压电源电路±9V、±5V(含仿真和报告)

【全套资料.zip】直流稳压电源电路9V、5VMultisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 一般直流稳压电源都使用220伏市电作为电源&#xff0c;经过变压、整流、滤波后给稳压电路进行稳压…...

Vue Cli的配置中configureWebpack和chainWebpack的主要作用及区别是什么?

直接区别&#xff1a; configureWebpack项直接覆盖同名配置&#xff1b;chainWebpack项直接修改默认配置。 configureWebpack配置&#xff1a; // vue.config.js module.exports {configureWebpack: {plugins: [new MyAwesomeWebpackPlugin()]} }该代码段中的对象将会被web…...

ubuntu主机搭建sysroot交叉编译环境

ubuntu主机搭建sysroot交叉编译环境 主机是 ubuntu22.04 x86-64 hostubuntu22.04host-archx86-64host-cpui9-13900k 目标板是香橙派5b &#xff0c;ubuntu22.04,aarch64 ,cpu rk3588s targetubuntu22.04target-archaarch64target-cpurk3588s 安装 qemu-user-static 进入 …...

Python注意力机制Attention下CNN-LSTM-ARIMA混合模型预测中国银行股票价格|附数据代码...

全文链接&#xff1a;https://tecdat.cn/?p38195 股票市场在经济发展中占据重要地位。由于股票的高回报特性&#xff0c;股票市场吸引了越来越多机构和投资者的关注。然而&#xff0c;由于股票市场的复杂波动性&#xff0c;有时会给机构或投资者带来巨大损失。考虑到股票市场的…...

实验三 JDBC数据库操作编程(设计性)

实验三 JDBC数据库操作编程&#xff08;设计性&#xff09; 实验目的 掌握JDBC的数据库编程方法。掌握采用JDBC完成数据库链接、增删改查&#xff0c;以及操作封装的综合应用。实验要求 本实验要求每个同学单独完成&#xff1b;调试程序要记录调试过程中出现的问题及解决办法…...

各种环境换源教程

目录 pip 换源相关命令永久换源1. 命令行换源2. 配置文件换源 临时换源使用官方源使用镜像源 报错参考 npm换源相关命令永久换源1. 命令行换源2. 配置文件换源 pip 换源 相关命令 更新 pip 本身 首先&#xff0c;为了确保你使用的是最新版本的 pip&#xff0c;可以通过以下命…...

Rust项目中的Labels

姊妹篇: Go项目中的Labels 按照issue数量从多到少排序: https://github.com/rust-lang/rust/labels?page2&sortcount-desc https://github.com/rust-lang/rust/labels/A-contributor-roadblock 第1页: 标签/中文说明数字T-compiler/编译器Relevant to the compiler tea…...

Jmeter的安装和使用

使用场景&#xff1a; 我们需要对某个接口进行压力测试&#xff0c;在多线程环境下&#xff0c;服务的抗压能力&#xff1b;还有就是关于分布式开发需要测试多线程环境下数据的唯一性。 解决方案: jmeter官网连接&#xff1a;Apache JMeter - Apache JMeter™ 下载安装包 配…...

初识Electron 进程通信

概述 Electron chromium nodejs native API&#xff0c;也就是将node环境和浏览器环境整合到了一起&#xff0c;这样就构成了桌面端&#xff08;chromium负责渲染、node负责操作系统API等&#xff09; 流程模型 预加载脚本&#xff1a;运行在浏览器环境下&#xff0c;但是…...

go语言中的通道(channel)详解

在 Go 语言中&#xff0c;通道&#xff08;channel&#xff09; 是一种用于在 goroutine&#xff08;协程&#xff09;之间传递数据的管道。通道具有类型安全性&#xff0c;即它只能传递一种指定类型的数据。通道是 Go 并发编程的重要特性&#xff0c;能够让多个 goroutine 之间…...

【JS】内置类型的相关问题

我是目录 引言内置类型undefined与nullnull和undefined的区别字符串转换为字符串数字0.1+0.2不等于0.3NaNBigInt大数相加问题原生函数(封箱与解封)判断类型的方法typeofinstanceofObject.prototype.toString.callconstructor类型转换toStringtoNumbertoBoolean显式强制类型转…...

Mac上无法访问usr/local的文件

sudo chmod 755 /usr/loca 最后用百度提供的方法解决了...

http 常见状态码

1xx 信息&#xff0c;表示临时响应并需要请求者继续执行操作 2xx 成功&#xff0c;操作被成功接收并处理 3xx 表示要完成请求&#xff0c;需要进一步操作。通常&#xff0c;这些状态码用来重定向 4xx 客户端错误&#xff0c;请求包含语法错误或无法完成请求 5xx 服务…...

代码训练营 day59|并查集

前言 这里记录一下陈菜菜的刷题记录&#xff0c;主要应对25秋招、春招 个人背景 211CS本CUHK计算机相关硕&#xff0c;一年车企软件开发经验 代码能力&#xff1a;有待提高 常用语言&#xff1a;C 系列文章目录 第59天 &#xff1a;第十一章&#xff1a;图论part05 文章目录…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...