[MyBatis源码分析 - 类型模块 - 组件二] TypeHandlerRegistry

[MyBatis源码分析 - 类型模块 - 组件二] TypeHandlerRegistry,第1张

   TypeHandlerRegistry 类型处理器注册表注册了类型转换时需要用到的各种处理器以及与Java类型和Jdbc类型的映射关系。

功能根据传入的类型处理器类型和指定处理的Java类型,创建类型处理器实例对象。

源码与注解

   TypeHandlerRegistry 中主要有两类方法,其中一类就是根据各种入参注册处理器,类中有很多 #registry 方法的重载实现,其调用关系如下图所示:

解析

功能通过包名,批量注册类型处理器,当在 mybatis-configxml 通过包扫描的方式注册处理器时就会调用本方法处理。

源码与注解

解析

   ResolverUtil 是一个用来解析包中指定类型的工具类,解析后会保存到其对象内部的一个集合中,这里解析完之后对该集合进行了遍历,循环体内先过滤掉内部类、接口和抽象类,然后调用 #register(Class<> typeHandlerClass) 方法处理。

解析

解析

解析

  方法① 中的两个分支,最后都会调用 #register(Class<T>, TypeHandler) ,该方法中将 Java 类型的 Class 对象向上转型为 Type 对象,再转给 #register(Type, TypeHandler) 方法处理,在该方法中:

  上述的方法除了方法④ 都是入参没明确指定 Java 类型和 Jdbc 类型,下面这两个方法,对应调用关系图的右侧分支,就直接指定了。

源码与注解

解析

  将 java Class 向上转型为 java Type,再调用方法④ 。

  在右侧分支,还有两个方法。

解析

  传入的是 Java 类型和处理器类型的类权限定名,调用 ResourcesclassForName 先加载对应的 Class 对象,再调用 #register(Class, Class) 方法。

解析

  该方法主要是获取 TypeReference 中的泛型类型,然后调用 #register(Type, TypeHandler) 方法处理。

  最后在调用关系图中,还有一个独立的方法⑤。

解析很简单,直接注册到 JDBC_TYPE_HANDLER_MAP 集合中。

   TypeHandlerRegistry 另一类重要的方法就是查找处理器的 #getTypeHandler() 方法,同样该方法也提供了丰富的重载实现,其调用关系如下图所示:

解析

调用关系图中的第一种情况

调用关系图中的第二种情况

调用关系图中的第三种情况

  比较简单,都是根据参数判断注册表中是否有处理器。

  MyBatis 在初始化时会调用 TypeHandlerRegistry 的构造方法创建一个类型转换处理器注册表,该构造方法如下:

此处仅描述问题处理方法,关于mysql、mybatis的内容不在此赘述。

因为项目需要,需要在mybatis同个标签中执行多条sql语句。如下:

寻思着,在mysql中同时执行多条语句时,mysql是一条一条执行的。如果我一次性向mysql发送多条语句,它应该也会这么执行的。

我承认一开始想的太简单了,直接这样做的结果,是会在jdbc驱动层面报出语法错误异常,程序无法执行下去。

debug后发现,从mybatis拼装sql,到语句传入jdbc驱动,语句都是正常的,但是在mysql驱动验证sql合法性时,sql被截断,它认为一次性发过去的多条sql是不合法的。

看了网上很多说法,一说是mybatis本身不支持;一说是mysql驱动不支持。困扰很久,没能解决,后为了项目进度,暂时将sql分开执行了。

---------------------------------------------------------allowMultiQueries=true----------------------------------------------------------------------------------

但今天,有高人,跟我说,这样做不行,是因为你没有让mysql驱动开启批量执行sql的开关。

怎么开启呢?在拼装mysql链接的url时,为其加上allowMultiQueries参数,设置为true,如下:

加了参数后,我又将mybatis配置文件改了回去,测试一下,执行成功。

这里记录一下,希望对看到的人,有所帮助。

附MYSQL 多表更新 语句

以上就是关于[MyBatis源码分析 - 类型模块 - 组件二] TypeHandlerRegistry全部的内容,包括:[MyBatis源码分析 - 类型模块 - 组件二] TypeHandlerRegistry、Mybatis批量执行SQL、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9573088.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存