1. 程式人生 > 其它 >mybatis自定義型別轉換器

mybatis自定義型別轉換器

技術標籤: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">
    <
[email protected]
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>