当前位置: 首页 > news >正文

北京专业网站制作公司西安公司招聘

北京专业网站制作公司,西安公司招聘,网站设计 站,默认开启评论 wordpress目录 概述使用TypeHandler使用方式在 select | update | insert 中加入 配置文件中指定 源码分析配置文件指定Mapper 执行query如何转换 结束 概述 阅读此文 可以达到 spring boot mybatis TypeHandler 源码如何初始化及如何调用的。 spring boot 版本为 2.7.17#xff0c;my… 目录 概述使用TypeHandler使用方式在 select | update | insert 中加入 配置文件中指定 源码分析配置文件指定Mapper 执行query如何转换 结束 概述 阅读此文 可以达到 spring boot mybatis TypeHandler 源码如何初始化及如何调用的。 spring boot 版本为 2.7.17mybatis(spring boot) 2.3.2 TypeHandler 是 mybatis 中 java 对象和数据库 jdbc 之间进行类型转换的桥梁。 调用层级深比较复杂关键源码点给出了详细的位置打上断点降低难度。 接口源码如下 public interface TypeHandlerT {// 从java对象到数据库类型的转换void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;// 下面三个是从数据库到java对象的转换T getResult(ResultSet rs, String columnName) throws SQLException;T getResult(ResultSet rs, int columnIndex) throws SQLException;T getResult(CallableStatement cs, int columnIndex) throws SQLException; }使用 TypeHandler 实现 TypeHandler 接口也可以实现抽象类 BaseTypeHandler 代码如下 MappedJdbcTypes(JdbcType.VARCHAR) MappedTypes(Reason.class) public class ResonJsonTypeHandler extends BaseTypeHandlerReason {Overridepublic void setNonNullParameter(PreparedStatement ps, int i, Reason parameter, JdbcType jdbcType) throws SQLException {// 将java对象转换成jdbc中的类型ps.setString(i, JSON.toJSONString(parameter));}Overridepublic Reason getNullableResult(ResultSet rs, String columnName) throws SQLException {return JSON.parseObject(rs.getString(columnName), Reason.class);}Overridepublic Reason getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return JSON.parseObject(rs.getString(columnIndex), Reason.class);}Overridepublic Reason getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {return JSON.parseObject(cs.getString(columnIndex), Reason.class);} }注意 MappedJdbcTypes 代表对应的数据库中字段的类型json本质上也是字符串MappedTypes 代表要转换的 JavaBean 对象java对象与json格式的互相转换需要 JSON 来完成 使用方式 在 select | update | insert 中加入 写在 xml 只有对应的 sql 会被转换 org.apache.ibatis.mapping.ResultMapping.Builder#resolveTypeHandler 配置文件中指定 如下配置任何使用 Reason 的地方都会进行转换。 mybatis:type-handlers-package: com.fun.demo.mybatis.type.handler由于 xml 与 mapper 都是会生成覆盖所以选择配置文件中指定。 源码分析 配置文件指定 protected SqlSessionFactory buildSqlSessionFactory() throws Exception {final Configuration targetConfiguration;XMLConfigBuilder xmlConfigBuilder null; ....if (hasLength(this.typeHandlersPackage)) {scanClasses(this.typeHandlersPackage, TypeHandler.class).stream().filter(clazz - !clazz.isAnonymousClass()).filter(clazz - !clazz.isInterface()).filter(clazz - !Modifier.isAbstract(clazz.getModifiers())).forEach(targetConfiguration.getTypeHandlerRegistry()::register);}if (!isEmpty(this.typeHandlers)) {Stream.of(this.typeHandlers).forEach(typeHandler - {targetConfiguration.getTypeHandlerRegistry().register(typeHandler);LOGGER.debug(() - Registered type handler: typeHandler );});}....scanClasses 方法进行加载自定义的 typeHandler org.mybatis.spring.SqlSessionFactoryBean#scanClasses org.apache.ibatis.mapping.ResultMapping.Builder#resolveTypeHandler Mapper 在 Mapper 中自定义时依然也是在 SqlSessionFactoryBean 的 buildSqlSessionFactory 方法。 org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration#sqlSessionFactory org.mybatis.spring.SqlSessionFactoryBean#afterPropertiesSet org.apache.ibatis.builder.xml.XMLMapperBuilder#parse org.apache.ibatis.builder.xml.XMLMapperBuilder#configurationElement org.apache.ibatis.builder.xml.XMLMapperBuilder#resultMapElements org.apache.ibatis.builder.xml.XMLMapperBuilder#resultMapElement(org.apache.ibatis.parsing.XNode) org.apache.ibatis.builder.xml.XMLMapperBuilder#resultMapElement(org.apache.ibatis.parsing.XNode, java.util.Listorg.apache.ibatis.mapping.ResultMapping, java.lang.Class?) org.apache.ibatis.builder.MapperBuilderAssistant#buildResultMapping(java.lang.Class?, java.lang.String, java.lang.String, java.lang.Class?, org.apache.ibatis.type.JdbcType, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.Class? extends org.apache.ibatis.type.TypeHandler?, java.util.Listorg.apache.ibatis.mapping.ResultFlag, java.lang.String, java.lang.String, boolean) org.apache.ibatis.builder.BaseBuilder#resolveTypeHandler(java.lang.Class?, java.lang.Class? extends org.apache.ibatis.type.TypeHandler?)public void parse() {if (!configuration.isResourceLoaded(resource)) {configurationElement(parser.evalNode(/mapper));configuration.addLoadedResource(resource);bindMapperForNamespace();}parsePendingResultMaps();parsePendingCacheRefs();parsePendingStatements(); }具体的解析 /mapper 元素 private void configurationElement(XNode context) {try {String namespace context.getStringAttribute(namespace);if (namespace null || namespace.isEmpty()) {throw new BuilderException(Mappers namespace cannot be empty);}builderAssistant.setCurrentNamespace(namespace);cacheRefElement(context.evalNode(cache-ref));cacheElement(context.evalNode(cache));parameterMapElement(context.evalNodes(/mapper/parameterMap));resultMapElements(context.evalNodes(/mapper/resultMap));sqlElement(context.evalNodes(/mapper/sql));buildStatementFromContext(context.evalNodes(select|insert|update|delete));} catch (Exception e) {throw new BuilderException(Error parsing Mapper XML. The XML location is resource . Cause: e, e);} }private ResultMap resultMapElement(XNode resultMapNode, ListResultMapping additionalResultMappings,Class? enclosingType) { .......ListXNode resultChildren resultMapNode.getChildren();for (XNode resultChild : resultChildren) {if (constructor.equals(resultChild.getName())) {processConstructorElement(resultChild, typeClass, resultMappings);} else if (discriminator.equals(resultChild.getName())) {discriminator processDiscriminatorElement(resultChild, typeClass, resultMappings);} else {ListResultFlag flags new ArrayList();if (id.equals(resultChild.getName())) {flags.add(ResultFlag.ID);}resultMappings.add(buildResultMappingFromContext(resultChild, typeClass, flags));}} .....}buildResultMappingFromContext private ResultMapping buildResultMappingFromContext(XNode context, Class? resultType, ListResultFlag flags) {String property;if (flags.contains(ResultFlag.CONSTRUCTOR)) {property context.getStringAttribute(name);} else {property context.getStringAttribute(property);}......String nestedResultMap context.getStringAttribute(resultMap,() - processNestedResultMappings(context, Collections.emptyList(), resultType));....String typeHandler context.getStringAttribute(typeHandler);String resultSet context.getStringAttribute(resultSet);String foreignColumn context.getStringAttribute(foreignColumn);.....}String typeHandler context.getStringAttribute(“typeHandler”); 执行query 如何转换 org.apache.ibatis.executor.SimpleExecutor#doQuery org.apache.ibatis.session.Configuration#newStatementHandler org.apache.ibatis.executor.statement.RoutingStatementHandler#RoutingStatementHandler org.apache.ibatis.executor.statement.PreparedStatementHandler org.apache.ibatis.executor.statement.BaseStatementHandler#BaseStatementHandler org.apache.ibatis.executor.statement.RoutingStatementHandler#query org.apache.ibatis.logging.jdbc.PreparedStatementLogger#invoke org.apache.ibatis.executor.resultset.ResultSetHandler#handleResultSets org.apache.ibatis.executor.resultset.DefaultResultSetHandler#handleResultSet org.apache.ibatis.executor.resultset.DefaultResultSetHandler#handleRowValues org.apache.ibatis.executor.resultset.DefaultResultSetHandler#handleRowValuesForSimpleResultMap org.apache.ibatis.executor.resultset.DefaultResultSetHandler#applyPropertyMappings org.apache.ibatis.executor.resultset.DefaultResultSetHandler#getPropertyMappingValue com.fun.demo.mybatis.type.handler.ResonJsonTypeHandler#getNullableResult(java.sql.ResultSet, java.lang.String)执行结果 结束 spring boot mybatis TypeHandler 如何初始化及如何调用就解释的非常明白了如有疑问欢迎评论区留言。
http://www.huolong8.cn/news/440521/

相关文章:

  • 免费手机网站源码天元建设集团有限公司路桥工程公司
  • 凡客建站网宁波网站设计价格
  • 如何做授权网站上海企业建站网站的意义
  • 长春网站优化策略早8晚5双休的工作
  • 黑河做网站的网络计划的优化
  • 无锡阿里巴巴做网站网站开发行业工作交接交接哪些
  • 做网站如何避免商标侵权棋牌论坛网站怎么做
  • 视频网站开发研究背景优化大师是什么软件
  • 河南省建设厅证件证件查询网站单纯做seo能否提升网站流量
  • 找人做网站需要什么条件专业设计企业网站
  • 制作网站如何赚钱如何做电商设计
  • 如何制作网站教程视频泰兴市住房和城乡建设局网站
  • 网络推广吧国内专业seo公司
  • wordpress 直接拖拽式建站wordpress添加前台漂亮注册页面
  • 网站模板有哪些内容南京高新区建设规划局网站
  • 网站建设用啥系统好建设网站成都
  • 德阳高端网站建设有织梦后台系统怎么做网站
  • google 网站 提交导航网站怎么做点击
  • 网站建设初步规划方案网站开发概要设计书模板
  • 南宁网站建设哪家公司实力强青岛网站建设公司正
  • 郑州app开发哪家好安卓优化大师老版本下载
  • 秦皇岛住房建设网站Vantage wordpress主题
  • 帝国做的网站怎么上传图片平台网站建设哪家有
  • 诸城市做网站国外网站打不开怎么解决
  • 代网站备案费用吗哪个网站银锭专业做银锭的
  • 网站建设如何找本地客户局域网网站开发
  • 河北9市最新消息北京seo人员
  • 如何做免费的公司网站做影视网站风险大吗
  • 织梦模板添加网站地图网站开发技术合作协议书
  • 企业网站建设目的网站没有经过我司审核通过白名单