经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » PostgreSQL » 查看文章
java?mybatis如何操作postgresql?array数组类型
来源:jb51  时间:2022/1/19 9:43:09  对本文有异议

找了半天没有找到postgresql中关于array数组类型的字段如何对应到java中的数据类型,后来找到了mybatis的TypeHandler,只要实现一个自定义的TypeHandler就行了,如下,

我定义了几个基础数据类型的数组

  1. public class ArrayTypeHandler extends BaseTypeHandler<Object[]> {
  2. private static final String TYPE_NAME_VARCHAR = "varchar";
  3. private static final String TYPE_NAME_INTEGER = "integer";
  4. private static final String TYPE_NAME_BOOLEAN = "boolean";
  5. private static final String TYPE_NAME_NUMERIC = "numeric";
  6. @Override
  7. public void setNonNullParameter(PreparedStatement ps, int i, Object[] parameter, JdbcType jdbcType) throws SQLException {
  8. String typeName = null;
  9. if (parameter instanceof Integer[]) {
  10. typeName = TYPE_NAME_INTEGER;
  11. } else if (parameter instanceof String[]) {
  12. typeName = TYPE_NAME_VARCHAR;
  13. } else if (parameter instanceof Boolean[]) {
  14. typeName = TYPE_NAME_BOOLEAN;
  15. } else if (parameter instanceof Double[]) {
  16. typeName = TYPE_NAME_NUMERIC;
  17. }
  18. if (typeName == null) {
  19. throw new TypeException("ArrayTypeHandler parameter typeName error, your type is " + parameter.getClass().getName());
  20. }
  21. // 这3行是关键的代码,创建Array,然后ps.setArray(i, array)就可以了
  22. Connection conn = ps.getConnection();
  23. Array array = conn.createArrayOf(typeName, parameter);
  24. ps.setArray(i, array);
  25. }
  26. @Override
  27. public Object[] getNullableResult(ResultSet resultSet, String s) throws SQLException {
  28. return getArray(resultSet.getArray(s));
  29. }
  30. @Override
  31. public Object[] getNullableResult(ResultSet resultSet, int i) throws SQLException {
  32. return getArray(resultSet.getArray(i));
  33. }
  34. @Override
  35. public Object[] getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
  36. return getArray(callableStatement.getArray(i));
  37. }
  38. private Object[] getArray(Array array) {
  39. if (array == null) {
  40. return null;
  41. }
  42. try {
  43. return (Object[]) array.getArray();
  44. } catch (Exception e) {
  45. }
  46. return null;
  47. }
  48. }

然后在实体类里面对应的字段配置这个转换器就行,如果是配置文件需要在 xxmap.xml中配置对应属性

  1. @ColumnType(typeHandler = com.mvc.typehandler.ArrayTypeHandler.class)
  2. private String[] cities; //所操作的城市code列表,为空表示所有城市
  3. @ColumnType(typeHandler = com.mvc.typehandler.ArrayTypeHandler.class)
  4. private String[] areaTypes; //操作的行业类型code列表,为空表示所有行业
  5. @ColumnType(typeHandler = com.jmtool.mvc.typehandler.ArrayTypeHandler.class)
  6. private Integer[] targetStatus; //操作的目标数据状态

java mybatis操作 postgresql array数组类型备忘

postgrey sql数据库字段类型varchar[],java使用String[]类型,自定义ArrayTypeHandler

ArrayTypeHandler.java

  1. public class ArrayTypeHandler extends BaseTypeHandler<Object[]> {
  2. private static final String TYPE_NAME_VARCHAR = "varchar";
  3. private static final String TYPE_NAME_INTEGER = "integer";
  4. private static final String TYPE_NAME_BOOLEAN = "boolean";
  5. private static final String TYPE_NAME_NUMERIC = "numeric";
  6. @Override
  7. public void setNonNullParameter(PreparedStatement ps, int i, Object[] parameter, JdbcType jdbcType) throws SQLException {
  8. String typeName = null;
  9. if (parameter instanceof Integer[]) {
  10. typeName = TYPE_NAME_INTEGER;
  11. } else if (parameter instanceof String[]) {
  12. typeName = TYPE_NAME_VARCHAR;
  13. } else if (parameter instanceof Boolean[]) {
  14. typeName = TYPE_NAME_BOOLEAN;
  15. } else if (parameter instanceof Double[]) {
  16. typeName = TYPE_NAME_NUMERIC;
  17. }
  18. if (typeName == null) {
  19. throw new TypeException("ArrayTypeHandler parameter typeName error, your type is " + parameter.getClass().getName());
  20. }
  21. // 这3行是关键的代码,创建Array,然后ps.setArray(i, array)就可以了
  22. Connection conn = ps.getConnection();
  23. Array array = conn.createArrayOf(typeName, parameter);
  24. ps.setArray(i, array);
  25. }
  26. @Override
  27. public Object[] getNullableResult(ResultSet resultSet, String s) throws SQLException {
  28. return getArray(resultSet.getArray(s));
  29. }
  30. @Override
  31. public Object[] getNullableResult(ResultSet resultSet, int i) throws SQLException {
  32. return getArray(resultSet.getArray(i));
  33. }
  34. @Override
  35. public Object[] getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
  36. return getArray(callableStatement.getArray(i));
  37. }
  38. private Object[] getArray(Array array) {
  39. if (array == null) {
  40. return null;
  41. }
  42. try {
  43. return (Object[]) array.getArray();
  44. } catch (Exception e) {
  45. }
  46. return null;
  47. }
  48. }

配置文件中映射配置,增加typeHandler属性,填写ArrayTypeHandler.java的全路径。

  1. <result column="source_type" jdbcType="ARRAY" property="sourceType" typeHandler="com.wang.common.ArrayTypeHandler" />

用到的SQL:

  1. <insert id="insert" parameterType="com.wang.pojo.Qzf">
  2. ?? ?insert into t_qz_qzf(id,source_type)
  3. ?? ?values
  4. ?? ?(#{id,jdbcType=VARCHAR},#{sourceType,jdbcType=ARRAY,typeHandler="com.wang.common.ArrayTypeHandler"})
  5. </insert>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号