package sgc.portal.base.mybatis.type;

import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * <pre>
 * 화면에서 여부를 나타내는 값들은 true/false로 값이 전달되고
 * DB Table 컬럼에는 Y/N 으로 들어가는 경우 Model 클래스에
 * Boolean으로 정의된 변수의 값을 판단하여 Boolean(true/false) -> Y/N
 * Y/N -> Boolean(true/false) 으로 전환될 수 있도록 MyBatis의 TypeHandler를 확장하여 지원
 * </pre>
 *
 * @author YongSang
 * @version 1.0.0
 * @since 2020. 9. 1.
 */
class BooleanNullableTypeHandler implements TypeHandler<Boolean> {
    @Override
    public void setParameter(PreparedStatement ps, int i, Boolean parameter, JdbcType jdbcType) throws SQLException {
        if (parameter == null) {
            ps.setString(i, null);
        } else {
            ps.setString(i, parameter ? "Y" : "N");
        }
    }

    @Override
    public Boolean getResult(ResultSet rs, String columnName) throws SQLException {
        String result = rs.getString(columnName);
        return rs.wasNull() ? null : result.equals("Y");
    }

    @Override
    public Boolean getResult(ResultSet rs, int columnIndex) throws SQLException {
        String result = rs.getString(columnIndex);
        return rs.wasNull() ? null : result.equals("Y");
    }

    @Override
    public Boolean getResult(CallableStatement cs, int columnIndex) throws SQLException {
        String result = cs.getString(columnIndex);
        return cs.wasNull() ? null : result.equals("Y");
    }
}