개발, 데이터베이스에 저장된 변환 데이터 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)");
}
}