한개의 필드의 값을 hashmap으로 가져오려고 한다.
DB 내용
key1:value1,key2:value2,key3:value3
List<String> 으로 가져온 것과 마찬가지로 typeHandler를 사용하여 처리하였다.
DTO
HashMap<String, Object> extraProperties;public HashMap<String, Object> getExtraProperties() { return extraProperties;}public void setExtraProperties(HashMap<String, Object> extraProperties) { this.extraProperties = extraProperties;}
mybatis resultmap
<result property="extraProperties" column="extraProperties" typeHandler="com.my.handler.StringSplitMapTypeHandler" />
handler
import java.sql.CallableStatement;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.HashMap;import org.apache.ibatis.type.JdbcType;import org.apache.ibatis.type.TypeHandler;import com.my.util.CommonUtil;public class StringSplitMapTypeHandler implements TypeHandler<HashMap<String,Object>> { @Override public void setParameter(PreparedStatement ps, int i, HashMap<String,Object> parameter, JdbcType jdbcType) throws SQLException { if (parameter != null) { ps.setString(i, parameter.toString()); } } @Override public HashMap<String,Object> getResult(ResultSet rs, String columnName) throws SQLException { String columnValueStr = rs.getString(columnName); return CommonUtil.getStringSplitHashMap(columnValueStr, ",", ":"); } @Override public HashMap<String,Object> getResult(ResultSet rs, int columnIndex) throws SQLException { String columnValueStr = rs.getString(columnIndex); return CommonUtil.getStringSplitHashMap(columnValueStr, ",", ":"); } @Override public HashMap<String,Object> getResult(CallableStatement cs, int columnIndex) throws SQLException { String columnValueStr = cs.getString(columnIndex); return CommonUtil.getStringSplitHashMap(columnValueStr, ",", ":"); }}
getStringSplitHashMap 코드
public static HashMap<String,Object> getStringSplitHashMap(String targetStr, String fieldSeparator, String mapSeparator){ if (targetStr == null) return null; String[] fields = targetStr.split(fieldSeparator); HashMap<String,Object> returnData = new HashMap<String,Object>(); for(String str : fields){ String[] splitStr = str.split(mapSeparator); if(splitStr.length < 2) continue; String key = splitStr[0]; String value = splitStr[1]; returnData.put(key, value); } return returnData; }