본문 바로가기
개발공부/Spring

[Spring] my-batis를 이용해 Json 배열 데이터를 특정 객체에 매핑

by 양히◡̈ 2023. 9. 28.

PostgreSQL을 이용해서 특정 컬럼을 json 배열로 조회하도록 했는데, VO에 List<testVo> 로 만들어도 자동으로 매핑이 되지 않았다.

select문을 직접 DB에서 날렸을 땐 조회가 잘 되는데도 말이다.

찾아보니 my-batis에서 해당하는 컬럼에 핸들러를 이용해 매핑을 해주어야 한다네..

그래서 핸들러를 직접 만들어 사용하기로 했다. 핸들러에서 ObjectMapper를 이용해 매핑해주게끔 하였다.

 

import java.io.IOException;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collections;
import java.util.List;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.poi.ss.formula.functions.T;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import net.sf.json.JSONArray;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonArrayTypeHandler  extends BaseTypeHandler<List<T>> {

	Logger logger = LoggerFactory.getLogger(this.getClass());
	ObjectMapper objectMapper = new ObjectMapper();

	private List<T> convertToList(String s) {
		if (s == null || "".equals(s)) {
			return Collections.emptyList();
		}

		try {
			List<T> list = objectMapper.readValue(s, new TypeReference<>(){});
			return list;

		} catch (IOException e) {
			logger.error("[ExampleJsonTypeHandler] failed to convert string to list");
		}

		return Collections.emptyList();
	}

	@Override
	public void setNonNullParameter(PreparedStatement preparedStatement, int i, List<T> ts, JdbcType jdbcType) throws
		SQLException {
		JSONArray jsonArray = JSONArray.fromObject(ts);
		preparedStatement.setString(i, jsonArray.toString());
	}

	@Override
	public List<T> getNullableResult(ResultSet resultSet, String s) throws SQLException {
		return convertToList(resultSet.getString(s));
	}

	@Override
	public List<T> getNullableResult(ResultSet resultSet, int i) throws SQLException {
		return convertToList(resultSet.getString(i));
	}

	@Override
	public List<T> getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
		return convertToList(callableStatement.getString(i));
	}
}

 

 

그리고 해당 핸들러를 xml에서 resultMap을 만들어 사용을 명시해주면 된다.

<resultMap id="맵 이름" type="VO명">
    ...
    <result property="이름" column="컬럼명" typeHandler="com.prac.test.api.other.handler.JsonArrayTypeHandler" />
    ...
</resultMap>

 

댓글