添加 jsonb 字段的处理

This commit is contained in:
2025-06-05 11:36:00 +08:00
parent 02c6a5ee70
commit 73ef340f01
2 changed files with 101 additions and 1 deletions

22
pom.xml
View File

@ -6,7 +6,7 @@
<groupId>ltd.llvy</groupId>
<artifactId>handler</artifactId>
<version>1.0-SNAPSHOT</version>
<version>1.0.2</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
@ -45,9 +45,29 @@
<artifactId>postgis-jdbc</artifactId>
<version>2.5.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jsr310 -->
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.19.0</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>central</id>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
<repository>
<id>gitea</id>
<url>https://www.llvy.ltd/api/packages/llvy.ltd/maven</url>

View File

@ -0,0 +1,80 @@
package ltd.llvy.postgis.handler;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import org.postgresql.util.PGobject;
/**
* (JsonbTypeHandler)
*
* @author zweiandlen
* @since 2025/6/4 16:30
*/
@MappedTypes({JsonNode.class})
@MappedJdbcTypes(JdbcType.JAVA_OBJECT)
public class JsonbTypeHandler extends BaseTypeHandler<JsonNode> {
private static final PGobject JSON_OBJECT;
private static final ObjectMapper OBJECT_MAPPER;
static {
JSON_OBJECT = new PGobject();
//
OBJECT_MAPPER = new ObjectMapper();
// 禁用日期作为时间戳的序列化方式
OBJECT_MAPPER.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
// 注册Java 8时间模块
OBJECT_MAPPER.registerModule(new JavaTimeModule());
}
@Override
public void setNonNullParameter(
PreparedStatement ps, int i, JsonNode parameter, JdbcType jdbcType) throws SQLException {
JSON_OBJECT.setType("jsonb");
JSON_OBJECT.setValue(toJson(parameter));
ps.setObject(i, JSON_OBJECT);
}
@Override
public JsonNode getNullableResult(ResultSet rs, String columnName) throws SQLException {
return parse(rs.getString(columnName));
}
@Override
public JsonNode getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return parse(rs.getString(columnIndex));
}
@Override
public JsonNode getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return parse(cs.getString(columnIndex));
}
private JsonNode parse(String json) {
try {
return OBJECT_MAPPER.readValue(json, JsonNode.class);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
private String toJson(Object obj) {
try {
return OBJECT_MAPPER.writeValueAsString(obj);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
}