mybatis映射postgresql数组类型字段相关查询及插入数据
1.数据表结构
CREATE TABLE "error_code" (
"err_code" varchar(15) COLLATE "pg_catalog"."default" NOT NULL,
"ori_code" varchar[] COLLATE "pg_catalog"."default",
"system" varchar(20) COLLATE "pg_catalog"."default",
"err_desc_en" varchar(300) COLLATE "pg_catalog"."default",
"err_desc_cn" varchar(300) COLLATE "pg_catalog"."default",
"usr_desc_en" varchar(300) COLLATE "pg_catalog"."default",
"usr_desc_cn" varchar(300) COLLATE "pg_catalog"."default",
"udate" timestamp(6),
"oper_user" varchar(255) COLLATE "pg_catalog"."default"
);
2.实体类
public class ErrorCode {
private String errCode;
private String[] oriCode;
private String system;
private String errDescEn;
private String errDescCn;
private String usrDescEn;
private String usrDescCn;
private String operUser;
private LocalDateTime updateTime = LocalDateTime.now();
}
3.自定义typeHandler配置类
package com.test.errorcode.config;
import java.sql.Array;
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.TypeException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ArrayTypeHandler extends BaseTypeHandler<Object[]>{
private static final Logger LOGGER = LoggerFactory.getLogger(ArrayTypeHandler.class);
private static final String TYPE_NAME_VARCHAR = "varchar";
private static final String TYPE_NAME_INTEGER = "integer";
private static final String TYPE_NAME_BOOLEAN = "boolean";
private static final String TYPE_NAME_NUMERIC = "numeric";
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Object[] parameter, JdbcType jdbcType)
throws SQLException {
String typename = null;
if (parameter instanceof Integer[]) {
typename = TYPE_NAME_INTEGER;
} else if (parameter instanceof String[]) {
typename = TYPE_NAME_VARCHAR;
} else if (parameter instanceof Boolean[]) {
typename = TYPE_NAME_BOOLEAN;
} else if (parameter instanceof Double[]) {
typename = TYPE_NAME_NUMERIC;
}
if (typename == null) {
throw new TypeException("arraytypehandler parameter typename error, your type is " + parameter.getClass().getName());
}
// 创建array,然后ps.setarray(i, array)就可以了
Array array = ps.getConnection().createArrayOf(typename, parameter);
ps.setArray(i, array);
}
@Override
public Object[] getNullableResult(ResultSet rs, String columnName) throws SQLException {
return getArray(rs.getArray(columnName));
}
@Override
public Object[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return getArray(rs.getArray(columnIndex));
}
@Override
public Object[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return getArray(cs.getArray(columnIndex));
}
private Object[] getArray(Array array) {
if (array == null) {
return null;
}
try {
return (Object[]) array.getArray();
} catch (SQLException e) {
LOGGER.error("ArrayTypeHandler getArray SQLException",e);
}
return null;
}
}
4.mapper.java
package com.test.errorcode.dao.mapper;
import java.util.List;
import java.util.Set;
import org.apache.ibatis.annotations.Param;
import com.github.pagehelper.Page;
import com.test.errorcode.dao.entity.MdErrorCode;
public interface MdErrorCodeMapper {
/**
* 根据错误码查询错误码数据信息
* @param errCode
* @return
*/
public MdErrorCode findByErrCode(String errCode);
/**
* 根据错误码和原错误码查询数据列表
* @param errCode
* @param oriCode
* @return
*/
public List<MdErrorCode> queryErrorCodeByErrOrOri(@Param("errCode")String errCode,@Param("oriCode")String oriCode);
/**
* 根据原错误码查询数据信息
* @param oriCode
* @return
*/
public MdErrorCode findByOriCode(String oriCode);
/**
*
* <p>Title: queryByOriCode</p>
* <p>Description: queryByOriCode</p>
* @param @param oriCode
* @param @return 参数
* @return List<MdErrorCode> 返回类型
* @throws
*/
public List<MdErrorCode> queryByOriCode(String oriCode);
/**
* 分页查询
* @param errCode
* @param oriCode
* @param system
* @return
*/
public Page<MdErrorCode> queryPage(@Param("errCode")String errCode,@Param("oriCode")String oriCode,@Param("system")String system);
/**
*
* @param errCodes
* @return
*/
public List<MdErrorCode> queryErrorCodesIn(@Param("errCodes")Set<String> errCodes);
/**
* 插入
* @param errorCode
* @return
*/
public boolean insertErrorCode(@Param("errorCode")MdErrorCode errorCode);
/**
* 批量插入
* @param errorCodes
* @return
*/
public int batchInsertErrorCode(@Param("errorCodes")List<MdErrorCode> errorCodes);
/**
* 更新
* @param errorCode
* @return
*/
public boolean updateErrorCode(@Param("errorCode")MdErrorCode errorCode);
}
5.mapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.test.errorcode.dao.mapper.MdErrorCodeMapper">
<resultMap id="mdErrorCodeResultMap" type="com.test.errorcode.dao.entity.MdErrorCode">
<id property="errCode" column="err_code" />
<result property="oriCode" column="ori_code" jdbcType="ARRAY" typeHandler="com.test.errorcode.config.ArrayTypeHandler"/>
<result property="system" column="system" />
<result property="errDescEn" column="err_desc_en" />
<result property="errDescCn" column="err_desc_cn" />
<result property="usrDescEn" column="usr_desc_en" />
<result property="usrDescCn" column="usr_desc_cn" />
<result property="operUser" column="oper_user" />
<result property="updateTime" column="udate" />
</resultMap>
<select id="findByErrCode" resultMap="mdErrorCodeResultMap" >
select * from md_error_code where err_code = #{errCode}
</select>
<select id="queryErrorCodesIn" resultMap="mdErrorCodeResultMap" >
select * from md_error_code where err_code in
<foreach collection="errCodes" item="errCode" index="index" open="(" close=")" separator=",">
#{errCode}
</foreach>
</select>
<select id="findByOriCode" resultMap="mdErrorCodeResultMap" >
select * from md_error_code where ori_code @> array[#{oriCode}]
</select>
<select id="queryByOriCode" resultMap="mdErrorCodeResultMap" >
select * from md_error_code where ori_code @> array[#{oriCode}]
</select>
<select id="queryErrorCodeByErrOrOri" resultMap="mdErrorCodeResultMap" >
select * from md_error_code
<where>
<if test="errCode != null">
err_code = #{errCode}
</if>
<if test="oriCode != null">
and ori_code @> array[#{oriCode}]
</if>
</where>
</select>
<select id="queryPage" resultMap="mdErrorCodeResultMap">
select * from md_error_code
<where>
<if test="errCode!=null"> err_code = #{errCode} </if>
<if test="oriCode!=null"> and ori_code @> array[#{oriCode}] </if>
<if test="system!=null"> and system = #{system} </if>
</where>
order by err_code
</select>
<insert id="insertErrorCode" parameterType="com.test.errorcode.dao.entity.MdErrorCode">
insert into md_error_code
("err_code","ori_code","system","err_desc_en","err_desc_cn",
"usr_desc_en","usr_desc_cn","oper_user","udate")
values
(#{errorCode.errCode},
#{errorCode.oriCode, jdbcType=ARRAY, typeHandler=com.test.errorcode.config.ArrayTypeHandler},
#{errorCode.system},#{errorCode.errDescEn},
#{errorCode.errDescCn},#{errorCode.usrDescEn},#{errorCode.usrDescCn},#{errorCode.operUser},
#{errorCode.updateTime})
</insert>
<insert id="batchInsertErrorCode">
insert into md_error_code
("err_code","ori_code","system","err_desc_en","err_desc_cn",
"usr_desc_en","usr_desc_cn","oper_user","udate")
values
<foreach collection="errorCodes" item="errorCode" separator =",">
(#{errorCode.errCode},
#{errorCode.oriCode, jdbcType=ARRAY, typeHandler=com.test.errorcode.config.ArrayTypeHandler},
#{errorCode.system},#{errorCode.errDescEn},
#{errorCode.errDescCn},#{errorCode.usrDescEn},#{errorCode.usrDescCn},#{errorCode.operUser},
#{errorCode.updateTime})
</foreach>
</insert>
<update id="updateErrorCode">
update md_error_code
<set>
ori_code=#{errorCode.oriCode,jdbcType=ARRAY, typeHandler=com.test.errorcode.config.ArrayTypeHandler},
system=#{errorCode.system},err_desc_en=#{errorCode.errDescEn},err_desc_cn=#{errorCode.errDescCn},
usr_desc_en=#{errorCode.usrDescEn},usr_desc_cn=#{errorCode.usrDescCn},oper_user=#{errorCode.operUser},
udate=#{errorCode.updateTime}
</set>
where err_code=#{errorCode.errCode}
</update>
</mapper>
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 zyh
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果