mybatis-怎么实现自己的TypeHandler

一、小需求

我们需要将java中的list类型转化成为字符串转化成string 保存到数据库
比如集合中[1,2,3,4] 数据库中的保存成 1,2,3,4

二、代码实现
package com.gupaoedu.type;

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 java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Author: kangping
 *
 * 泛型传你要转换的字段,我们是要把List集合转换成拼接的字符串
 */

public class MyTypeHandler extends BaseTypeHandler<List<Integer>> {

    /**
     * 设置结果集
     * @param ps
     * @param i
     * @param parameter
     * @param jdbcType
     * @throws SQLException
     */
    public void setNonNullParameter(PreparedStatement ps, int i, List<Integer> parameter, JdbcType jdbcType)
            throws SQLException {
        // 设置 String 类型的参数的时候调用,Java类型到JDBC类型
        // 注意只有在字段上添加typeHandler属性才会生效
        // insertBlog name字段
        System.out.println("---------------setNonNullParameter1:"+parameter);
        if (parameter != null && parameter.size() > 0) {
            String str =parameter.stream().map(e -> e.toString()).collect(Collectors.joining(","));
            ps.setString(i, str);
        } else {
            ps.setString(i, "");
        }

    }

    /**
     * 通过列名称从结果集获取数据
     * @param rs
     * @param columnName
     * @return
     * @throws SQLException
     */
    public List<Integer> getNullableResult(ResultSet rs, String columnName) throws SQLException {
        // 根据列名获取 String 类型的参数的时候调用,JDBC类型到java类型
        // 注意只有在字段上添加typeHandler属性才会生效
        System.out.println("---------------getNullableResult1:"+columnName);
        String columnValues = rs.getString(columnName);
        if (columnValues!=null && !columnValues.equals("")){

            String[] split = columnValues.split(",");
            List<Integer> list = Arrays.asList(split).stream().map(e -> Integer.parseInt(e)).collect(Collectors.toList());
            return list;
        }
        return new ArrayList<Integer>();
    }

    /**
     * 通过列下标获取数据
     * @param rs
     * @param columnIndex
     * @return
     * @throws SQLException
     */
    public List<Integer> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        // 根据下标获取 String 类型的参数的时候调用
        System.out.println("---------------getNullableResult2:"+columnIndex);
        return null;
    }

    /**
     * 获取游相关的数据
     * @param cs
     * @param columnIndex
     * @return
     * @throws SQLException
     */
    public List<Integer> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        System.out.println("---------------getNullableResult3:");
        return null;
    }
}
  1. 继承BaseTypeHandler类,实现当中的方法
  2. 传入的泛型为需要转换的java类型
  3. 实现逻辑(看上面的代码和注释)
三、怎么使用

1.我们查询结果时,需要在resultMap当中的那个字段上配置一个typeHandler标签,如下:

 <resultMap id="Basic_column" type="com.gupaoedu.domain.Test">
        <result column="id" property="id"/>
        <!--<result column="types" property="types"/>-->
        <result column="types" property="types" typeHandler="com.gupaoedu.type.MyTypeHandler"/>
    </resultMap>

2.当我们插入数据时,需要在对应的字段的#{}当中配置typeHandler,注意这里不需要加双引号,如下:

 <insert id="insert" parameterType="com.gupaoedu.domain.Test">
        insert into test(id,types) value (#{id},#{types,typeHandler=com.gupaoedu.type.MyTypeHandler})
    </insert>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值