【达梦】达梦数据库使用TypeHandler读取数据库时,将字段中的数据读取为数组
达梦数据库使用TypeHandler读取数据库时,将字段中的数据读取为数组
这里使用的达梦依赖为:
<dependency><groupId>com.dameng</groupId><artifactId>DmJdbcDriver18</artifactId><version>8.1.3.140</version>
</dependency>
1. 定义一个arr
字段为数组格式.
添加注解 @TableField(typeHandler = BigDecimalArrayTypeHandler.class)
注意:
@TableName(value = "test1",autoResultMap = true)
中的autoResultMap = true
@Data
@TableName(value = "test1",autoResultMap = true)
public class Test1 {private String name;private Long id;@TableField(typeHandler = BigDecimalArrayTypeHandler.class)private BigDecimal[] arr;
}
2. 自定义TypeHandler类
然后编写自定义TypeHandler,这里需要的是BigDecimal[]
数组,根据自己需求定义.
注意:
setNonNullParameter
方法中的num_array
跟下面数据库中定义的字段类型对应上的
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;import java.math.BigDecimal;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;import java.sql.*;public class BigDecimalArrayTypeHandler extends BaseTypeHandler<BigDecimal[]> {@Overridepublic void setNonNullParameter(PreparedStatement preparedStatement, int i, BigDecimal[] bigDecimals, JdbcType jdbcType) throws SQLException {Array array = preparedStatement.getConnection().createArrayOf("num_array", bigDecimals);preparedStatement.setArray(i, array);}@Overridepublic BigDecimal[] getNullableResult(ResultSet resultSet, String columnName) {Array array = null;try {array = resultSet.getArray(columnName);} catch (SQLException e) {e.printStackTrace();return null;}return getArray(array);}@Overridepublic BigDecimal[] getNullableResult(ResultSet resultSet, int i) throws SQLException {return null;}@Overridepublic BigDecimal[] getNullableResult(CallableStatement callableStatement, int i) throws SQLException {return null;}private BigDecimal[] getArray(Array array) {if (array == null) {return null;}try {return (BigDecimal[]) array.getArray();} catch (SQLException e) {e.printStackTrace();}return null;}}
3. 配置文件中配置handle文件的包目录
mybatis-plus:type-handlers-package: com.xxx.handler
4. 数据库添加自定义字段
-- 定义数组类型
CREATE TYPE num_array AS VARRAY(100) OF DECIMAL(10,2);
DECIMAL(10,2) 可以根据自己业务更换
# 自定义数据类型
CREATE TYPE num_array AS VARRAY (100) OF DECIMAL(10, 2);
# 创建表结构时使用自定义类型
CREATE TABLE test2 (id INT,name varchar(25),arr num_array -- 使用自定义数组类型
);
# 或者往已有表中添加自定义类型的字段
ALTER TABLE test1 ADD arr num_array;
# 使用自定义类型添加数据
INSERT INTO test1 (id, name, arr) VALUES (1,'zhangsan', num_array(123.45, 678.90, 99.99));
5. controller 中测试下
@RequestMapping("/user")@ResponseBodypublic Test1 user() {Test1 test2 = new Test1();test2.setName("sfkjs");BigDecimal[] abc = {new BigDecimal(1.2), new BigDecimal(1.2), new BigDecimal(1.2)};test2.setArr(abc);test1Mapper.insert(test2);Test1 test1 = test1Mapper.selectById1(test2.getId());System.out.println(test1);return test1;}
6. 结果为: 可见arr
字段已然是数据格式
{"name": "sfkjs","id": 1928055508885798913,"arr": [1.2, 1.2, 1.2]
}