经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
(六)加密的字段类型入库
来源:cnblogs  作者:张q  时间:2018/10/12 9:49:16  对本文有异议

(一)敏感信息混淆中处理了加密字段,但如果要把这个加密字段使用mybatis入库,则会报以下错误:

  1. Caused by: java.lang.IllegalStateException: Type handler was null on parameter mapping for property 'secret'. It was either not specified and/or could not be found for the javaType (github.zhangq.secretstringtest.config.SecretString) : jdbcType (null) combination.
  2. at org.apache.ibatis.mapping.ParameterMapping$Builder.validate(ParameterMapping.java:119)
  3. at org.apache.ibatis.mapping.ParameterMapping$Builder.build(ParameterMapping.java:104)
  4. at org.apache.ibatis.builder.SqlSourceBuilder$ParameterMappingTokenHandler.buildParameterMapping(SqlSourceBuilder.java:123)
  5. at org.apache.ibatis.builder.SqlSourceBuilder$ParameterMappingTokenHandler.handleToken(SqlSourceBuilder.java:67)
  6. at org.apache.ibatis.parsing.GenericTokenParser.parse(GenericTokenParser.java:78)
  7. at org.apache.ibatis.builder.SqlSourceBuilder.parse(SqlSourceBuilder.java:45)
  8. at org.apache.ibatis.scripting.defaults.RawSqlSource.<init>(RawSqlSource.java:46)
  9. at org.apache.ibatis.scripting.defaults.RawSqlSource.<init>(RawSqlSource.java:40)
  10. at org.apache.ibatis.scripting.xmltags.XMLScriptBuilder.parseScriptNode(XMLScriptBuilder.java:72)
  11. at org.apache.ibatis.scripting.xmltags.XMLLanguageDriver.createSqlSource(XMLLanguageDriver.java:44)
  12. at org.apache.ibatis.builder.xml.XMLStatementBuilder.parseStatementNode(XMLStatementBuilder.java:94)
  13. at org.apache.ibatis.builder.xml.XMLMapperBuilder.buildStatementFromContext(XMLMapperBuilder.java:135)
  14. at org.apache.ibatis.builder.xml.XMLMapperBuilder.buildStatementFromContext(XMLMapperBuilder.java:128)
  15. at org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement(XMLMapperBuilder.java:118)
  16. ... 82 more

简单看就是自定义的类型识别不了,这个时候我们就可以用到mybatis的TypeHandler了,TypeHandler有4个参数:

  1. public interface TypeHandler<T> {
  2. void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;
  3. T getResult(ResultSet rs, String columnName) throws SQLException;
  4. T getResult(ResultSet rs, int columnIndex) throws SQLException;
  5. T getResult(CallableStatement cs, int columnIndex) throws SQLException;
  6. }
View Code

看参数命名,可以很简单的理解到方法的意思,那么我们定义一个TypeHandler,分别实现这4个方法,如下:

  1. /**
  2. * @author zhangqiuyang
  3. * Created on 2018/8/17.
  4. */
  5. @MappedTypes(value = {SecretString.class})
  6. public class SecretStringTypeHandler implements TypeHandler<SecretString> {
  7. /**
  8. * @param rs
  9. * @param columnName
  10. * @return
  11. * @throws SQLException
  12. */
  13. @Override
  14. public SecretString getResult(ResultSet rs, String columnName) throws SQLException {
  15. String value = rs.getString(columnName);
  16. if (value != null) {
  17. return new SecretString(value);
  18. }
  19. return null;
  20. }
  21. /**
  22. * @param rs
  23. * @param columnIndex
  24. * @return
  25. * @throws SQLException
  26. */
  27. @Override
  28. public SecretString getResult(ResultSet rs, int columnIndex) throws SQLException {
  29. String value = rs.getString(columnIndex);
  30. if (value != null) {
  31. return new SecretString(value);
  32. }
  33. return null;
  34. }
  35. /**
  36. * @param cs
  37. * @param columnIndex
  38. * @return
  39. * @throws SQLException
  40. */
  41. @Override
  42. public SecretString getResult(CallableStatement cs, int columnIndex) throws SQLException {
  43. String value = cs.getString(columnIndex);
  44. if (value != null) {
  45. return new SecretString(value);
  46. }
  47. return null;
  48. }
  49. /**
  50. * @param ps
  51. * @param i
  52. * @param parameter
  53. * @param arg3
  54. * @throws SQLException
  55. */
  56. @Override
  57. public void setParameter(PreparedStatement ps, int i, SecretString parameter, JdbcType arg3) throws SQLException {
  58. String value = "";
  59. if (parameter != null) {
  60. value = parameter.toString();
  61. }
  62. ps.setString(i, value);
  63. }
  64. }
View Code

实现完成后,需要指定下配置,让mybatis扫描到这个TypeHandler,在application.yml增加mybatis.type-handlers-package:typehandler所在的包名。如果想从代码中注入配置,则需要在注入SqlSessionFactory的时候setVfs

  1. @Bean(name = "sqlSessionFactory")
  2. @Primary
  3. public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource") DataSource dataSource,
  4. @Qualifier("configuration") org.apache.ibatis.session.Configuration configuration) throws Exception {
  5. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
  6. bean.setVfs(SpringBootVFS.class);
  7. bean.setTypeHandlersPackage("xxxxxx");
  8. bean.setDataSource(dataSource);
  9. bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapping/*.xml"));
  10. bean.setConfiguration(configuration);return bean.getObject();
  11. }

 github:https://github.com/zqyx5201/SecretStringTest

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号