mybatis要实现自定义拦截器,必须实现Interceptor接口。 对象首先执行plugin(objecttarget )方法,根据类上的@Intercepts注释确定是否阻止。 如果需要监听,请调用intercept(invocationinvocation )方法。
1 .准备工作
要监听的sql :
需要侦听的映射器对象:
invocation对象:
invocation对象
您可以看到invocation的args参数是@Intercepts的args参数。
2 .映射语句对象
1. invocation对象如何获取映射语句对象:
映射语句对象对应于映射器配置文件中的select/update/insert/delete节点,并主要编写sql语句。
MappedStatement.png
2 .映射语句对象详细信息:
其中真正表示SQL的字段是名为SqlSource的对象。
SqlSource接口很简单,只有一个getBoundsql方法。
sqlSource有许多实现,需要重点关注StaticSqlSource、RawSqlSource和DynamicSqlSource。 上述实现允许您将特定于mybatis的sql格式转换为可以直接在PrepareStatement中运行的sql。
映射语句—— boundsql对象:
上述方法主要是动态标签分析,获取完全可行的sql。 #{ }是否要分析字符并将其替换为? 最后,PrepareStatement将其包装在域表达式中以进行调用。
已解析的sql存储在sql对象中;
请求参数存储在参数对象中;
#{ }key属性及其相应的参数映射(如javaType、jdbcType等)存储在BoundSql的参数映射属性中。 用于最后一个域表达式对象PrepareStatement赋值。
BoundSql .png
BoundSql—已解析的sql对象:
BoundSql对象中的sql对象是动态标签解析后完全可执行的sql。
boundsql -参数对象:
此对象是sql执行的参数。 也就是我们传递的参数。 由于使用了@param注释,因此有两种方法可以获取value的值。
parameterObject.png
注: ParameterObject是一个Object对象,上载不同的参数时,该对象的类型会不同。
上传参数对象时:该参数的类型;
上传多个参数对象时:对于ParamMap对象,您使用了@Param注释,因此可以使用注释中的key,也可以使用param1检索变量。
如果上载了Criteria对象(如下图所示),则也是该对象的类型,但获取对象的方式不同。
Criteria对象. png
注意:如果实际传递的参数是在TypeHandlerRegistry对象中声明的,则实际传递的参数将用作实际变量名称。
也就是说,虽然Mapper界面写为delete(integerid ),但在Mapper.xml中定义的变量#{var}可以自由命名,并由mybatis正确处理。
boundsql -参数映射对象:
如果以#{var}的形式引用变量,则变量在分析Mapper.xml文件中的语句时会显示占位符“? 中描述的场景,使用以下步骤创建明细表,以便在概念设计中分析体量的体积。 当相应的语句实际执行时,返回真正的参数。 根据参数映射信息为参数语句设置参数。
Criteria对象的ParameterMapping对象. png
常规对象的ParameterMapping对象. png
请注意,property参数是#{var}的var。
boundsql -附加参数对象
在使用Criteria对象时的sql中,additionalParameters具有值,可以执行以下操作:
Criteria对象的附加参数. png
boundsql -元对象
MetaObject类相当于工具类,Mybatis常用于sql参数化和结果集映射。
MetaObject.png
映射语句3354配置对象
mybatis在启动时读取所有配置文件并将其加载到内存中。 Configuration对象是承载整个配置的类。
配置- typehandlerregistry对象
类型处理器注册对象。 生成TypeHandlerRegistry对象时,将注册类型。
类型处理器TypeHandlerRegistry的简单之处是用于处理javaType和jdbcType之间类型转换的处理器,Mybatis对许多Java类型和数据库类型进行匹配处理。
类型处理器格式: