プロセッサtypeHandlers MyBatisの変換データベース・データのタイプに基づいて、ビジネス・オブジェクトを実装します

開発では、データベースに格納されている変換データの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)");
    }
}

 

リリース8元の記事 ウォンの賞賛0 ビュー3849

おすすめ

転載: blog.csdn.net/new_com/article/details/103925484