프로세서 typeHandlers의 유형에 따라 비즈니스 오브젝트를 구현하기 위해 변환 데이터베이스 데이터를 MyBatis로

개발, 데이터베이스에 저장된 변환 데이터 JSON 형식에 대한 필요성을지도 또는 목록 컬렉션의 자바 객체의 컬렉션이 처리하는 방법입니다 충족? 전화 번호 데이터베이스, 신분증 대칭 당신이 처리하는 방법을 알아 암호화 된 데이터를 해독하는? 데이터베이스의 날짜 형식에 대한 이전 백엔드 날짜의 타임 스탬프를 변환 할 때, 당신은 어떻게 그것을 처리 했습니까?

개발에서 주류 사용은 ORM 프레임 워크로 MyBatis로. 프로젝트 데이터베이스 비즈니스 객체 데이터베이스에서 데이터를 획득, MyBatis로는 typeHandlers이 변환을 수행하는 플러그인을 제공합니다. 코드 수정 문을 사용하여 <삽입>, <업데이트> <삭제>로 다음 있습니다 :

#{conditions,jdbcType=VARCHAR,typeHandler=com.kuqi.mall.demo.conmon.mybatis.JsonMapHandler}

다음과 같이 SELECT 문 세트 맵의 결과에서 것은 사용된다 :

<result property="conditions" column="conditions"  typeHandler="com.kuqi.mall.demo.conmon.mybatis.JsonMapHandler"/>

위의 데이터의 경우, 각각의 사용자 정의 빠른 typeHandlers은 데이터 컨버터를 통합. 다음과 같이 플러그인 구현 다음과 같다 :

JsonMapHandler JSON (데이터 변환) JsonListHandler (배열 데이터 변환) AesEncryptorHandler (예 : 전화 번호, 상기 암호화 된 식별 데이터 변환 등 대칭 암호화) AbstractInstantDateHandler (전환 시간 스탬프).

JsonMapHandler는 다음을 달성 :

/**
 * json和map对象的转换
 */
@MappedTypes(Map.class)
public class JsonMapHandler implements TypeHandler<Map<String, Object>> {

    @Override
    public void setParameter(PreparedStatement preparedStatement, int i, Map<String, Object> stringObjectMap, JdbcType jdbcType) throws SQLException {
        preparedStatement.setString(i, CollectionUtils.isEmpty(stringObjectMap) ? null : JSON.toJSONString(stringObjectMap));
    }

    @Override
    public Map<String, Object> getResult(ResultSet resultSet, String s) throws SQLException {
        String jsonStr;
        return StringUtils.isEmpty(jsonStr = resultSet.getString(s)) ? null : JSON.parseObject(jsonStr, Map.class);
    }

    @Override
    public Map<String, Object> getResult(ResultSet resultSet, int i) throws SQLException {
        String jsonStr;
        return StringUtils.isEmpty(jsonStr = resultSet.getString(i)) ? null : JSON.parseObject(jsonStr, Map.class);
    }

    @Override
    public Map<String, Object> getResult(CallableStatement callableStatement, int i) throws SQLException {
        String jsonStr;
        return StringUtils.isEmpty(jsonStr = callableStatement.getString(i)) ? null : JSON.parseObject(jsonStr, Map.class);
    }
}

다음과 같이 JsonListHandler 코드는 다음과 같습니다


@MappedTypes(List.class)
public class JsonListHandler implements TypeHandler<List<Object>> {

    @Override
    public void setParameter(PreparedStatement ps, int i, List<Object> parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, CollectionUtils.isEmpty(parameter) ? JSON.toJSONString(parameter) : null);
    }

    @Override
    public List<Object> getResult(ResultSet rs, String columnName) throws SQLException {
        String jsonStr;
        return StringUtils.isNotBlank(jsonStr = rs.getString(columnName)) ? JSON.parseArray(jsonStr, Object.class) : null;
    }

    @Override
    public List<Object> getResult(ResultSet rs, int columnIndex) throws SQLException {
        String jsonStr;
        return StringUtils.isNotBlank(jsonStr = rs.getString(columnIndex)) ? JSON.parseArray(jsonStr, Object.class) : null;
    }

    @Override
    public List<Object> getResult(CallableStatement cs, int columnIndex) throws SQLException {
        String jsonStr;
        return StringUtils.isNotBlank(jsonStr = cs.getString(columnIndex)) ? JSON.parseArray(jsonStr, Object.class) : null;
    }
}
AesEncryptorHandler实现代码如下:

/**
 * Aes 加密
 **/
public class AesEncryptorHandler implements TypeHandler<String> {

    @Override
    public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, StringUtils.isBlank(parameter) ? null : DefaultAbsEncryptor.getInstance().encrypt(parameter));
    }

    @Override
    public String getResult(ResultSet rs, String columnName) throws SQLException {
        String value;
        return StringUtils.isBlank(value = rs.getString(columnName)) ? null : DefaultAbsEncryptor.getInstance().decrypt(value);
    }

    @Override
    public String getResult(ResultSet rs, int columnIndex) throws SQLException {
        String value;
        return StringUtils.isBlank(value = rs.getString(columnIndex)) ? null : DefaultAbsEncryptor.getInstance().decrypt(value);
    }

    @Override
    public String getResult(CallableStatement cs, int columnIndex) throws SQLException {
        String value;
        return StringUtils.isBlank(value = cs.getString(columnIndex)) ? null : DefaultAbsEncryptor.getInstance().decrypt(value);
    }
}
AbstractInstantDateHandler的实现代码如下:

/**
 * @Author iloveoverfly
 * @Date 2020/1/13 9:27
 **/
@Slf4j
public abstract class AbstractInstantDateHandler implements TypeHandler<Object> {

    protected static final Calendar CALENDAR = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));

    @Override
    public void setParameter(PreparedStatement ps, int columnIndex, Object millsObj, JdbcType jdbcType) throws SQLException {

        if (Objects.isNull(millsObj)) {
            return;
        }
        Long mills;
        try {
            if (millsObj instanceof String) {
                mills = Long.parseLong((String) millsObj);
            } else {
                mills = (Long) millsObj;
            }
            doSetParameter(ps, columnIndex, mills, jdbcType);
        } catch (Exception e) {

            log.warn("not match time mills {}", millsObj);
        }
    }

    protected abstract void doSetParameter(PreparedStatement ps, int columnIndex, Long mills, JdbcType jdbcType) throws SQLException;

    @Override
    public Long getResult(ResultSet rs, String columnName) throws SQLException {
        throw new RuntimeSqlException("instant cannot get by getResult(ResultSet rs, String columnName)");
    }

    @Override
    public Long getResult(ResultSet rs, int columnIndex) throws SQLException {
        throw new RuntimeSqlException("instant cannot get by getResult(ResultSet rs, int columnIndex)");
    }

    @Override
    public Long getResult(CallableStatement cs, int columnIndex) throws SQLException {
        throw new RuntimeSqlException("instant cannot get by getResult(CallableStatement cs, int columnIndex)");
    }
}

 

출시 팔 개 원래 기사 · 원의 칭찬 0 · 조회수 3849

추천

출처blog.csdn.net/new_com/article/details/103925484