日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

PostgreSQL 、springboot 、spring data jpa 集成

發(fā)布時(shí)間:2023/12/10 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PostgreSQL 、springboot 、spring data jpa 集成 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  項(xiàng)目地址:https://gitee.com/zhxs_code/PostgreSQL_springboot_jpa_demo.git

????? 增刪查改都已經(jīng)實(shí)現(xiàn)。

  重點(diǎn)部分:

    1.定義自己的方言。

    

1 package com.zxl.postgrespringdemo.config.dialect; 2 3 import org.hibernate.dialect.PostgreSQL94Dialect; 4 import org.hibernate.type.StringType; 5 6 import java.sql.Types; 7 8 public class JsonbPostgresDialect extends PostgreSQL94Dialect { 9 public JsonbPostgresDialect() { 10 super(); 11 registerColumnType(Types.JAVA_OBJECT, "jsonb"); 12 registerHibernateType(Types.ARRAY, StringType.class.getName()); 13 } 14 15 16 } View Code

    2. 配置文件中聲明使用自己定義的方言 (yml格式)

  

database-platform: com.zxl.postgrespringdemo.config.dialect.JsonbPostgresDialect View Code

    3.編寫自己的json轉(zhuǎn)換類型,用來實(shí)現(xiàn)json類型與Postgre類型的轉(zhuǎn)換

package com.zxl.postgrespringdemo.config;import com.alibaba.fastjson.JSON; import com.fasterxml.jackson.databind.ObjectMapper; import org.hibernate.HibernateException; import org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.type.SerializationException; import org.hibernate.usertype.ParameterizedType; import org.hibernate.usertype.UserType; import org.postgresql.util.PGobject; import org.springframework.util.ObjectUtils;import java.io.IOException; import java.io.Serializable; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; import java.util.Properties;public class JsonbType implements UserType, ParameterizedType {private final ObjectMapper mapper = new ObjectMapper();private static final ClassLoaderService classLoaderService = new ClassLoaderServiceImpl();public static final String CLASS = "CLASS";private Class<?> jsonClassType;@Overridepublic void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) throws HibernateException, SQLException {if (value == null) {st.setNull(index, Types.OTHER);} else {try {st.setObject(index, mapper.writeValueAsString(value), Types.OTHER);} catch (IOException e) {e.printStackTrace();}}}@Overridepublic Object deepCopy(Object originalValue) throws HibernateException {if (originalValue != null) {try {return mapper.readValue(mapper.writeValueAsString(originalValue),returnedClass());} catch (IOException e) {throw new HibernateException("Failed to deep copy object", e);}}return null;}@Overridepublic Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException, SQLException {PGobject o = (PGobject) rs.getObject(names[0]);if (o.getValue() != null) {return JSON.parseObject(o.getValue(), jsonClassType);}return null;}@Overridepublic Serializable disassemble(Object value) throws HibernateException {Object copy = deepCopy(value);if (copy instanceof Serializable) {return (Serializable) copy;}throw new SerializationException(String.format("Cannot serialize '%s', %s is not Serializable.", value, value.getClass()), null);}@Overridepublic Object assemble(Serializable cached, Object owner) throws HibernateException {return deepCopy(cached);}@Overridepublic Object replace(Object original, Object target, Object owner) throws HibernateException {return deepCopy(original);}@Overridepublic boolean isMutable() {return true;}@Overridepublic int hashCode(Object x) throws HibernateException {if (x == null) {return 0;}return x.hashCode();}@Overridepublic boolean equals(Object x, Object y) throws HibernateException {return ObjectUtils.nullSafeEquals(x, y);}@Overridepublic Class<?> returnedClass() {return jsonClassType;}@Overridepublic int[] sqlTypes() {return new int[]{Types.JAVA_OBJECT};}@Overridepublic void setParameterValues(Properties properties) {final String clazz = (String) properties.get(CLASS);if (clazz != null) {jsonClassType = classLoaderService.classForName(clazz);}} } View Code

    4.demo實(shí)體類

1 /** 2 * 用戶demo類 3 */ 4 @Data 5 @AllArgsConstructor 6 @NoArgsConstructor 7 @Entity 8 @Table(name = "user_demo") 9 @TypeDefs({ 10 @TypeDef(name = "infoType", typeClass = JsonbType.class, parameters = { 11 @Parameter(name = JsonbType.CLASS, value = "com.zxl.postgrespringdemo.pojo.UserBaseInfo") 12 }), 13 @TypeDef(name = "addressType", typeClass = JsonbType.class, parameters = { 14 @Parameter(name = JsonbType.CLASS, value = "com.zxl.postgrespringdemo.pojo.Address") 15 }) 16 }) 17 public class UserDemo { 18 19 @Id 20 @GeneratedValue 21 private Long id; 22 23 @Column(columnDefinition = "jsonb") 24 @Type(type = "addressType") 25 private Address address; 26 27 28 @Column(columnDefinition = "jsonb") 29 @Type(type = "infoType") 30 private UserBaseInfo info; 31 } View Code

    5. 執(zhí)行原生的SQL語(yǔ)句

@Repository public interface UserRepository extends JpaRepository<UserDemo, Long> {// postgre 原生sql語(yǔ)句查詢。@Query(value = "select * from user_demo as a where (a.address ->> 'province') = ?1", nativeQuery = true)List<UserDemo> findByAddress_Province(String value);@Query(value = "select * from user_demo as a where (a.info ->> 'name') = ?1", nativeQuery = true)List<UserDemo> findByInfo_Name(String name); } View Code

  

  參考過的相關(guān)文檔與博客:

  https://blog.csdn.net/carry1beyond/article/details/79568934

  

?

轉(zhuǎn)載于:https://www.cnblogs.com/zhaohuaxishi/p/10120593.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的PostgreSQL 、springboot 、spring data jpa 集成的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。