開発では、データベースに格納されている変換データのJSON形式にニーズを満たすマップまたはリストコレクション内のJavaオブジェクトのコレクションは、あなたがに対処する方法はありますか?電話番号データベース、IDカードは、対称は、あなたがどのように扱われるか出て暗号化されたデータを復号していますか?データベースの日付形式のため、以前のバックエンド日のタイムスタンプを変換する場合、どのようにそれを処理したのか?
開発では、主流の使用は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)");
}
}