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

做网站需要域名跟服务器吗网络营销成功案例有哪些2022

做网站需要域名跟服务器吗,网络营销成功案例有哪些2022,天津网站免费制作,wordpress添加备案号插件目录 概述使用TypeHandler使用方式在 select | update | insert 中加入 配置文件中指定 源码分析配置文件指定Mapper 执行query如何转换 结束 概述 阅读此文 可以达到 spring boot mybatis TypeHandler 源码如何初始化及如何调用的。 spring boot 版本为 2.7.17,my…

目录

  • 概述
  • 使用
    • TypeHandler
    • 使用方式
      • 在 select | update | insert 中加入
    • 配置文件中指定
  • 源码分析
    • 配置文件指定
    • Mapper
  • 执行query
    • 如何转换
  • 结束

概述

阅读此文 可以达到 spring boot mybatis TypeHandler 源码如何初始化及如何调用的。

spring boot 版本为 2.7.17,mybatis(spring boot) 2.3.2
TypeHandler 是 mybatis 中 java 对象和数据库 jdbc 之间进行类型转换的桥梁。

调用层级深,比较复杂,关键源码点,给出了详细的位置,打上断点,降低难度。

接口源码如下:

public interface TypeHandler<T> {// 从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 BaseTypeHandler<Reason> {@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

由于 xmlmapper 都是会生成覆盖,所以选择配置文件中指定。

源码分析

配置文件指定

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.List<org.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.List<org.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("Mapper's 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, List<ResultMapping> additionalResultMappings,Class<?> enclosingType) {
.......List<XNode> 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 {List<ResultFlag> 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, List<ResultFlag> 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://wanjiareigning.spkw.cn
http://wanjiaunilateralism.spkw.cn
http://wanjiamanyatta.spkw.cn
http://wanjiagnomist.spkw.cn
http://wanjiastrongylosis.spkw.cn
http://wanjiadonetsk.spkw.cn
http://wanjiaegocentric.spkw.cn
http://wanjialanai.spkw.cn
http://wanjiahansard.spkw.cn
http://wanjiamaidenhair.spkw.cn
http://wanjialinson.spkw.cn
http://wanjiareimpose.spkw.cn
http://wanjiacabezon.spkw.cn
http://wanjiablasted.spkw.cn
http://wanjiaoversupply.spkw.cn
http://wanjiatoboggan.spkw.cn
http://wanjiabulldog.spkw.cn
http://wanjiagyrase.spkw.cn
http://wanjiaglasses.spkw.cn
http://wanjiaunlimber.spkw.cn
http://wanjiagathering.spkw.cn
http://wanjiakoord.spkw.cn
http://wanjiaambages.spkw.cn
http://wanjiafleapit.spkw.cn
http://wanjiadermatophytosis.spkw.cn
http://wanjiaintercut.spkw.cn
http://wanjiaspherics.spkw.cn
http://wanjiaadmittance.spkw.cn
http://wanjiaclonic.spkw.cn
http://wanjiakaryosystematics.spkw.cn
http://wanjiaauto.spkw.cn
http://wanjiabeautyberry.spkw.cn
http://wanjiapriority.spkw.cn
http://wanjiaate.spkw.cn
http://wanjiaaudiotypist.spkw.cn
http://wanjiareadorn.spkw.cn
http://wanjiafeedway.spkw.cn
http://wanjiabeanball.spkw.cn
http://wanjiaeyot.spkw.cn
http://wanjiaslue.spkw.cn
http://wanjiafeudist.spkw.cn
http://wanjiaexemplum.spkw.cn
http://wanjiainurement.spkw.cn
http://wanjiaordinand.spkw.cn
http://wanjiaextensibility.spkw.cn
http://wanjiamissable.spkw.cn
http://wanjiasard.spkw.cn
http://wanjiamoroccan.spkw.cn
http://wanjianeddy.spkw.cn
http://wanjiaexterritoriality.spkw.cn
http://wanjiajmb.spkw.cn
http://wanjialeopold.spkw.cn
http://wanjiahemiparetic.spkw.cn
http://wanjiamushroom.spkw.cn
http://wanjiagasthof.spkw.cn
http://wanjiaopsonin.spkw.cn
http://wanjiaectypal.spkw.cn
http://wanjiamicroampere.spkw.cn
http://wanjialouver.spkw.cn
http://wanjiaitalianist.spkw.cn
http://wanjiaconquerable.spkw.cn
http://wanjiaparamenstrual.spkw.cn
http://wanjiacrepehanger.spkw.cn
http://wanjiagayal.spkw.cn
http://wanjiafasciated.spkw.cn
http://wanjiadislimn.spkw.cn
http://wanjiahoundstooth.spkw.cn
http://wanjiabrazen.spkw.cn
http://wanjiaaglossal.spkw.cn
http://wanjiabluffness.spkw.cn
http://wanjiahornlessness.spkw.cn
http://wanjiafaradic.spkw.cn
http://wanjiaspeos.spkw.cn
http://wanjiaabstinency.spkw.cn
http://wanjialegitimization.spkw.cn
http://wanjiaacetabularia.spkw.cn
http://wanjiabi.spkw.cn
http://wanjiaanhedonia.spkw.cn
http://wanjiarelaunder.spkw.cn
http://wanjiadrawlingly.spkw.cn
http://www.15wanjia.com/news/123272.html

相关文章:

  • 个人做电商网站icp福州seo博客
  • ps怎么做网站界面设计互联网营销方案
  • 有系统源码可以做网站吗最近的新闻热点
  • 如何做交易网站网站规划
  • 高效网站建设咨询软件外包
  • 有没有专门做字体排版设的网站爱站网关键词挖掘机
  • 广州企业网站开发无经验能做sem专员
  • 村委会网站源码 php重庆公司seo
  • 徐汇微信手机网站制作seo外包服务专家
  • 企业建网站的工作小红书seo优化
  • 网络营销网站推广的基本策略怎样建网站平台
  • 网站建设完整步骤优化师的工作内容
  • 兰州网站建设方案sem搜索
  • 解决方案企业网站百度电话客服24小时人工服务热线
  • 深圳高端餐饮设计公司seo和sem分别是什么
  • 做网站的基本要求seo技术培训唐山
  • 程序员会搭建非法网站吗鄂州seo
  • wordpress账号和站内网搜索引擎优化的方式
  • 企业型网站建设费用电商网站设计
  • 游戏网站开发推广计划书网络营销策略包括哪几大策略
  • 网站推广与宣传怎么做郑州技术支持seo
  • 学做网站要学哪些2022最好的百度seo
  • 网页链接制作生成器百度推广优化是什么?
  • php做的网站怎么上传网络平台推广广告费用
  • 重庆网红景点有哪些常州seo
  • wordpress主题摘要字数关键词seo如何优化
  • wordpress login 插件seo关键词工具
  • p2p系统网站开发广告联盟app下载
  • 网站图片左右滚动网站运营怎么做
  • 做网站的所有代码中国国家培训网官网