mybatis自定义类型转换器

###mybatis自定义类型转换器
在开发权限系统时,需要存储某个角色对应的权限信息,权限信息通过,分割,填入权限的键值。例如数据库存储如下:

类型转换器代码如下:

import com.google.common.base.Strings;
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 org.springframework.stereotype.Component;

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;

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

    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, List<Integer> integers, JdbcType jdbcType) throws SQLException {
        if (integers == null || integers.size() == 0) {
            preparedStatement.setString(i, null);
            return;
        }

        StringBuilder sb = new StringBuilder();
        for (Integer s : integers) {
            sb.append(s).append(",");
        }
        preparedStatement.setString(i, sb.toString().substring(0, sb.toString().length() - 1));
    }

    @Override
    public List<Integer> getNullableResult(ResultSet resultSet, String s) throws SQLException {
        if (Strings.isNullOrEmpty(resultSet.getString(s))) {
            return null;
        }
        
        String[] arrays = resultSet.getString(s).split(",");
        List<Integer> integers = new ArrayList<>();
        for (String item : arrays) {
            integers.add(Integer.valueOf(item));
        }
        return integers;
    }

    @Override
    public List<Integer> getNullableResult(ResultSet resultSet, int i) throws SQLException {
        if (Strings.isNullOrEmpty(resultSet.getString(i))) {
            return null;
        }
        String[] arrays = resultSet.getString(i).split(",");
        List<Integer> integers = new ArrayList<>();
        for (String item : arrays) {
            integers.add(Integer.valueOf(item));
        }
        return integers;
    }

    @Override
    public List<Integer> getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        if (Strings.isNullOrEmpty(callableStatement.getString(i))) {
            return null;
        }
        String[] arrays = callableStatement.getString(i).split(",");

        List<Integer> integers = new ArrayList<>();
        for (String item : arrays) {
            integers.add(Integer.valueOf(item));
        }
        return integers;
    }
}

使用时,需注意以下信息:
###(1)在application.properties文件中,需要设置扫包的路径,否则mybatis无法识别该类型转换器。
指定mapper位置
mybatis.mapper-locations=classpath:/mapper/*.xml
指定需要扫描的类型转换器位置
mybatis.type-handlers-package=com.hero.server.support.mybatis.typehandler
###(2)查询时,自动将varchar类型转换成Integer列表。mapper文件中,结果映射时,添加对应的typehandler

<resultMap id="BaseResultMap" type="com.hero.server.entity.RolePermissions">
    <!--@Table tb_role_permissions-->
    <result property="roleId" column="role_id" jdbcType="INTEGER"/>
    <result property="permissionIds" column="permission_ids" jdbcType="VARCHAR" typeHandler="com.hero.server.support.mybatis.typehandler.ListIntegerTypeHandler"/>
</resultMap>

###(3)插入或者更新操作时,同样需要对其进行设置,这里需要在插入语句出进行设置,否则mybatis报错。


insert into upgrade.tb_role_permissions(role_id, permission_ids)
values (#{roleId},
#{permissionIds, jdbcType=VARCHAR, typeHandler=com.hero.server.support.mybatis.typehandler.ListIntegerTypeHandler})

<!--通过主键修改数据-->
<update id="update">
    update upgrade.tb_role_permissions
    <set>
        <if test="permissionIds != null and permissionIds != ''">
            permission_ids = #{permissionIds, jdbcType=VARCHAR, typeHandler=com.hero.server.support.mybatis.typehandler.ListIntegerTypeHandler},
        </if>
    </set>
    where role_id = #{roleId}
</update>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值