mybatis 对 pg数据库的引用类型
时间: 2025-01-07 12:38:30 浏览: 4
### MyBatis 使用 PostgreSQL 引用类型的最佳实践
#### 配置数据源
为了使应用程序能够访问 PostgreSQL 数据库,需正确配置 `application.properties` 文件中的数据源属性。确保 URL、用户名、密码以及驱动类名称都设置无误,并注意字符串结尾不应有多余空格[^4]。
```properties
spring.datasource.url=jdbc:postgresql://localhost:5432/testscmdb?useSSL=false
spring.datasource.username=dbuser
spring.datasource.password=123
spring.datasource.driver-class-name=org.postgresql.Driver
```
#### 定义实体类支持 JSON/JSONB 字段映射
当涉及到处理 PostgreSQL 特定的数据类型如 `json` 或者更推荐使用的 `jsonb` 时,可以通过定义 Java 实体类来表示这些列。对于这种复杂结构化数据的支持,通常会借助 Jackson 库来进行序列化和反序列化操作[^1]。
```java
import com.fasterxml.jackson.databind.JsonNode;
// ...
private JsonNode jsonData; // 对应于表里的 json/jsonb 列
```
#### 创建自定义 TypeHandler
为了让 MyBatis 能够理解并适当地转换上述提到的特殊字段(比如 `JsonNode`),应当编写相应的 `TypeHandler` 来实现这一点。这允许开发者控制读写过程中的行为,从而更好地兼容目标数据库特性[^2]。
```java
@MappedTypes(JsonNode.class)
public class JsonNodeTypeHandler extends BaseTypeHandler<JsonNode> {
private final ObjectMapper objectMapper = new ObjectMapper();
@Override
public void setNonNullParameter(PreparedStatement ps, int i, JsonNode parameter, JdbcType jdbcType) throws SQLException {
String jsonString = objectMapper.writeValueAsString(parameter);
ps.setObject(i, jsonString, Types.OTHER); // OTHER 表示非标准 SQL 类型
}
@Override
public JsonNode getNullableResult(ResultSet rs, String columnName) throws SQLException {
String jsonString = rs.getString(columnName);
try {
return StringUtils.isEmpty(jsonString) ? null : objectMapper.readTree(jsonString);
} catch (IOException e) {
throw new RuntimeException(e.getMessage(), e.getCause());
}
}
// ...其他方法省略...
}
```
#### 注册 TypeHandler 至全局或局部作用域
完成自定义处理器之后,则需要将其注册给 MyBatis 框架以便实际应用起来。可以在 XML 映射文件中指定特定语句使用该 handler;也可以通过全局方式让整个项目默认采用此策略[^3]。
```xml
<!-- 局部 -->
<select id="selectUserById" resultMap="BaseResultMap">
SELECT * FROM users WHERE id=#{id} AND data_type_handler=com.example.JsonNodeTypeHandler
</select>
<!-- 全局 -->
<typeHandlers>
<typeHandler javaType="com.fasterxml.jackson.databind.JsonNode"
handler="com.example.JsonNodeTypeHandler"/>
</typeHandlers>
```
阅读全文