pgsql中使用jsonb的mybatis-plus和Spring Data JPA的配置

在pgsql中使用jsonb類型的數據時,實體對象要對其進行一些相關的配置,而mybatis和jpa中使用各不相同。?

在項目中經常會結合?MyBatis-Plus?和?JPA 進行開發,MyBatis_plus對于操作數據更靈活,jpa可以自動建表,兩者各取其長,就能減少開發和運維的工作量:

Mybatis-Plus和Spring Data JPA的比較


一、 添加依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>MybatisTest</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><mybatisplus.version>3.5.12-SNAPSHOT</mybatisplus.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId></dependency><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.23</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.8</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>2.7.8</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId><version>2.7.8</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.6.15.Final</version></dependency><dependency><groupId>com.vladmihalcea</groupId><artifactId>hibernate-types-52</artifactId><version>2.16.0</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-jsqlparser-4.9</artifactId><version>${mybatisplus.version}</version></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.7.18</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatisplus.version}</version></dependency></dependencies></dependencyManagement><repositories><repository><id>aliyun</id><url>https://maven.aliyun.com/nexus/content/groups/public</url></repository><repository><id>oss-public</id><url>https://oss.sonatype.org/content/repositories/public</url></repository><repository><id>snapshots</id><url>https://central.sonatype.com/repository/maven-snapshots/</url><releases><enabled>false</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository></repositories>
</project>
二、application.yml配置數據庫以及jpa:
spring:datasource:driver-class-name: org.postgresql.Driverurl: jdbc:postgresql://127.0.0.1:5432/postgresusername: postgrespassword: 123456jpa:hibernate:ddl-auto: update  #自動生成數據庫表properties:hibernate:dialect: org.hibernate.dialect.PostgreSQL9Dialectshow-sql: true # jpa配置,在控制臺顯示hibernate的sql
三、自定義類型處理器

創建處理?jsonb?類型的 TypeHandler:

package org.example.entity;import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;
import org.postgresql.util.PGobject;import java.lang.reflect.Field;
import java.sql.PreparedStatement;
import java.sql.SQLException;@Slf4j
@MappedTypes({Object.class})
//  FastjsonTypeHandler 同理繼承使用
// 更多使用查看文檔 https://baomidou.com/guides/type-handler/#%E8%87%AA%E5%AE%9A%E4%B9%89%E7%B1%BB%E5%9E%8B%E5%A4%84%E7%90%86%E5%99%A8
public class JsonbTypeHandler extends JacksonTypeHandler {public JsonbTypeHandler(Class<?> type) {super(type);}// 自3.5.6版本開始支持泛型,需要加上此構造.public JsonbTypeHandler(Class<?> type, Field field) {super(type, field);}@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {if (ps != null) {PGobject jsonObject = new PGobject();jsonObject.setType("jsonb");jsonObject.setValue(toJson(parameter));ps.setObject(i, jsonObject);}}
}
四、? 實體類配置

這里要注意四個地方
?1.?TableName這里一定要指定autoResultMap,這里是讓mybatis在查詢 xml 時候需要映射 typeHandler 配合 @TableField(typeHandler = JsonbTypeHandler.class) 使用。

否則定義的jsonb對象查出來是空的。

2.寫一個父類,JsonBaseEntity,定義json和jsonb的類型,讓實體類去繼承它。

@TypeDefs({@TypeDef(name = "json", typeClass = JsonStringType.class),@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
})
@MappedSuperclass
public class JsonBaseEntity {}

3. 在字段上使用?@TableField?指定類型處理器TypeHandler,此處是mybatis在添加,查詢時使用。

4.?在字段上使用@Type,@Column來定議jpa字段的類型以及別名

@Type(type="jsonb")
@Column(columnDefinition = "jsonb",name="content_list")

package org.example.entity;import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;import lombok.Data;
import org.hibernate.annotations.Type;import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import java.io.Serializable;
import java.util.List;/*** 一個測試對象** @author lyl* @version v1.0* @since 2025/4/18*/@Entity(name = "test_bb")
@Data
@TableName(autoResultMap = true, value = "test_bb")
public class TestEntity extends JsonBaseEntity   implements Serializable {@Idprivate String id;private String name;@Type(type = "jsonb")@Column(name = "content", columnDefinition = "jsonb")@TableField(typeHandler = JsonbTypeHandler.class)private List<String> content;@Type(type = "jsonb")@Column(name = "data", columnDefinition = "jsonb")@TableField(typeHandler = JsonbTypeHandler.class)private List<Integer> data;@Type(type="jsonb")@Column(columnDefinition = "jsonb",name="content_list")@TableField(typeHandler = JsonbTypeHandler.class)private List<TestContent> contentList;
}
五、?創建mapper
@Mapper
public interface TestMapper extends BaseMapper<TestEntity> {
}

六、 調用例子
@SpringBootTest
public class TestAction {@Resourceprivate TestMapper testMapper;@Testpublic void test() {TestEntity entity=new TestEntity();entity.setId("66");;entity.setName("556");List<String> aa=new ArrayList<>();aa.add("aa");aa.add("cc");List<Integer> all=new ArrayList<>();all.add(11);all.add(22);all.add(33);entity.setData(all);entity.setContent(aa);entity.setContentList(Arrays.asList(TestContent.of("name", "秋秋"), TestContent.of("name", "哈哈")));// testMapper.insert(entity);TestEntity t=testMapper.selectById("66");System.out.println("data:"+t.getData());System.out.println("content:"+t.getContentList().get(0).getContent());}
}


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/902301.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902301.shtml
英文地址,請注明出處:http://en.pswp.cn/news/902301.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

kotlin + spirngboot3 + spring security6 配置登錄與JWT

1. 導包 implementation("com.auth0:java-jwt:3.14.0") implementation("org.springframework.boot:spring-boot-starter-security")配置用戶實體類 Entity Table(name "users") data class User(IdGeneratedValue(strategy GenerationType.I…

【JavaWeb后端開發03】MySQL入門

文章目錄 1. 前言1.1 引言1.2 相關概念 2. MySQL概述2.1 安裝2.2 連接2.2.1 介紹2.2.2 企業使用方式(了解) 2.3 數據模型2.3.1 **關系型數據庫&#xff08;RDBMS&#xff09;**2.3.2 數據模型 3. SQL語句3.1 DDL語句3.1.1 數據庫操作3.1.1.1 查詢數據庫3.1.1.2 創建數據庫3.1.1…

人工智能在智能家居中的應用與發展

隨著人工智能&#xff08;AI&#xff09;技術的飛速發展&#xff0c;智能家居逐漸成為現代生活的重要組成部分。從智能語音助手到智能家電&#xff0c;AI正在改變我們與家居環境的互動方式&#xff0c;讓生活更加便捷、舒適和高效。本文將探討人工智能在智能家居中的應用現狀、…

【EasyPan】項目常見問題解答(自用持續更新中…)

EasyPan 網盤項目介紹 一、項目概述 EasyPan 是一個基于 Vue3 SpringBoot 的網盤系統&#xff0c;支持文件存儲、在線預覽、分享協作及后臺管理&#xff0c;技術棧涵蓋主流前后端框架及中間件&#xff08;MySQL、Redis、FFmpeg&#xff09;。 二、核心功能模塊 用戶認證 注冊…

4.1騰訊校招簡歷優化與自我介紹攻略:公式化表達+結構化呈現

騰訊校招簡歷優化與自我介紹攻略&#xff1a;公式化表達結構化呈現 在騰訊校招中&#xff0c;簡歷是敲開面試大門的第一塊磚&#xff0c;自我介紹則是展現個人魅力的黃金30秒。本文結合騰訊面試官偏好&#xff0c;拆解簡歷撰寫公式、自我介紹黃金結構及分崗位避坑指南&#xf…

【Easylive】consumes = MediaType.MULTIPART_FORM_DATA_VALUE 與 @RequestPart

【Easylive】項目常見問題解答&#xff08;自用&持續更新中…&#xff09; 匯總版 consumes MediaType.MULTIPART_FORM_DATA_VALUE 的作用 1. 定義請求的數據格式 ? 作用&#xff1a;告訴 Feign 和 HTTP 客戶端&#xff0c;這個接口 接收的是 multipart/form-data 格式的…

OpenSSL1.1.1d windows安裝包資源使用

環境&#xff1a; QT版本&#xff1a;5.14.2 用途: openssl1.1.1d版本 問題描述&#xff1a; 今天嘗試用百度云人臉識別api搭載QT的人臉識別程序&#xff0c;需要用到 QNetworkManager 訪問 https 開頭的網址。 但是遇到了QT缺乏 openssl 的相關問題&#xff0c;找了大半天…

代碼實戰保險花銷預測

文章目錄 摘要項目地址實戰代碼&#xff08;初級版&#xff09;實戰代碼&#xff08;進階版&#xff09; 摘要 本文介紹了一個完整的機器學習流程項目&#xff0c;重點涵蓋了多元線性回歸的建模與評估方法。項目詳細講解了特征工程中的多項實用技巧&#xff0c;包括&#xff1…

RS232 串行通信:C++ 實現指南

文章目錄 一、RS232 簡介1. 電氣特性2. 傳輸速率3. 傳輸距離 二、在 C 中實現 RS232 通信1. Windows 平臺&#xff08;1&#xff09;打開串行端口&#xff08;2&#xff09;配置串行通信參數&#xff08;3&#xff09;發送數據&#xff08;4&#xff09;接收數據&#xff08;5&…

Linux指令合集

一、VI的使用 命令行模式&#xff1a;默認此模式&#xff0c;從輸入模式回到命令行模式&#xff1a;esc &#xff0c; esc按完&#xff0c;insert消失 輸入模式&#xff1a;按 i 進入 &#xff0c; 看到insert就能編輯代碼 退出vi 保存代碼 命令行模式下 按&#xf…

IDEA使用jclasslib Bytecode Viewer查看jvm字節碼

學習jvm的時候&#xff0c;想查看字節碼和局部變量表&#xff0c;可以使用idea安裝jclasslib Bytecode View插件查看。 &#xff08;1&#xff09;安裝工具&#xff1a; 安裝完成后需要重啟idea. &#xff08;2&#xff09;準備一段代碼&#xff0c;編譯運行 package com.te…

從多個Excel批量篩查數據后合并到一起

這篇文章將講解如何批量的從多個Excel文件中篩選出需要的數據&#xff0c;最后合并到一張新的Excel。 全程0代碼圖形化界面操作。 準備數據 這里準備了3個測試文件&#xff0c;每個文件的格式是一樣的 現在我們需要篩選出每個文件里面&#xff0c;基金簡稱包含“南方遠見”&a…

Debian GNU/Linux的新手入門介紹

Debian GNU/Linux&#xff1a;起源、基本介紹與發行版對比 一、起源與發展歷程 Debian GNU/Linux 是現存最古老的 Linux 發行版之一&#xff0c;由 Ian Murdock 于 1993 年 8 月 16 日創立。其名稱結合了他的女友&#xff08;后成為妻子&#xff09;Debra 和他自己的名字 Ian…

Sentinel源碼—7.參數限流和注解的實現一

大綱 1.參數限流的原理和源碼 2.SentinelResource注解的使用和實現 1.參數限流的原理和源碼 (1)參數限流規則ParamFlowRule的配置Demo (2)ParamFlowSlot根據參數限流規則驗證請求 (1)參數限流規則ParamFlowRule的配置Demo 一.參數限流的應用場景 二.參數限流規則的屬性 …

多數據源配置(MyBatis-Plus vs AbstractRoutingDataSource)

MyBatis-Plus vs AbstractRoutingDataSource MyBatis-Plus多數據源配 1.添加依賴 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.0</version> <…

聊透多線程編程-線程互斥與同步-13. C# Mutex類實現線程互斥

目錄 一、什么是臨界區&#xff1f; 二、Mutex類簡介 三、Mutex的基本用法 解釋&#xff1a; 四、Mutex的工作原理 五、使用示例1-保護共享資源 解釋&#xff1a; 六、使用示例2-跨進程同步 示例場景 1. 進程A - 主進程 2. 進程B - 第二個進程 輸出結果 ProcessA …

stm32week12

stm32學習 九.stm32與HAL庫 2.HAL庫框架 總架構&#xff1a; 文件介紹&#xff1a; ppp是某一外設&#xff0c;ex是拓展功能 HAL庫API函數和變量命名規則&#xff1a; HAL庫對寄存器位操作的相關宏定義&#xff1a; HAL庫的回調函數&#xff1a; 3.STM32啟動過程 MDK編譯過…

opencv HSV的具體描述

色調H&#xff1a; 使用角度度量&#xff0c;取值范圍為0\~360&#xff0c;從紅色開始按逆時針方向計算&#xff0c;紅色為0&#xff0c;綠色為120&#xff0c;藍色為240。它們的補色是&#xff1a;黃色為60&#xff0c;青色為180&#xff0c;紫色為300。通過改變H的值&#x…

Java Lambda表達式指南

一、Lambda表達式基礎 1. 什么是Lambda表達式&#xff1f; 匿名函數&#xff1a;沒有名稱的函數函數式編程&#xff1a;可作為參數傳遞的代碼塊簡潔語法&#xff1a;替代匿名內部類的更緊湊寫法 2. 基本語法 (parameters) -> expression 或 (parameters) -> { statem…

面向對象設計中的類的分類:實體類、控制類和邊界類

目錄 前言1. 實體類&#xff08;Entity Class&#xff09;1.1 定義和作用1.2 實體類的特點1.3 實體類的示例 2. 控制類&#xff08;Control Class&#xff09;2.1 定義和作用2.2 控制類的特點2.3 控制類的示例 3. 邊界類&#xff08;Boundary Class&#xff09;3.1 定義和作用3…