mybatis自定義型別轉換器
阿新 • • 發佈:2021-01-10
技術標籤: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>