欢迎来到皮皮网网站!

【接码平台源码整套】【在线查看android源码】【秒余额源码2016】sql排序源码_sql排序代码

时间:2024-12-22 20:41:05 来源:麻将程序源码

1.MyBatis源码之MyBatis中SQL语句执行过程
2.Mybatis拼接sql出错及源码解析

sql排序源码_sql排序代码

MyBatis源码之MyBatis中SQL语句执行过程

       MyBatis源码之MyBatis中SQL语句执行过程

       MyBatis编程时主要有两种方式执行SQL语句。排排序

       方式一,序源通过SqlSession接口的代码selectList方法调用,进入DefaultSqlSession的排排序实现,最终调用executor的序源query方法,使用MappedStatement封装SQL语句。代码接码平台源码整套

       方式二,排排序调用SqlSession接口的序源getMapper(Class type)方法,通过工厂创建接口的代码代理对象,调用MapperProxy的排排序invoke方法,进一步执行MappedStatement,序源调用sqlSession的代码方法。

       创建动态代理类会执行MapperProxy类中的排排序invoke方法,判断方法是序源否是Object的方法,如果是代码在线查看android源码直接调用,否则执行cachedInvoker()方法,获取缓存中的MapperMethodInvoker,如果没有则创建一个,内部封装了MethodHandler。当cacheInvoker返回了PalinMethodInvoker实例后,调用其invoke方法,执行execute()方法,秒余额源码2016调用sqlSession的方法。

       查询SQL执行流程:调用关系明确,主要步骤包括调用关系。

       增删改SQL执行流程:主要步骤清晰,最后执行的都是update方法,因为insert、update、java的arraylist源码delete都对数据库数据进行改变。执行流程为:

       具体的执行流程图如下所示。

Mybatis拼接sql出错及源码解析

       结论是,Mybatis在拼接SQL时出现意外条件添加,可能是由于别名与参数名冲突导致的。作者猜测,当在foreach循环中设置了别名exemptNo,iapp聊天源码Mybatis可能误将这个别名与参数关联,即使exemptNo值为空,也会在SQL中添加条件。这个行为实际上是一个潜在的bug,源于Mybatis在处理一次性使用的别名时的内存管理问题。

       深入分析,当在org.apache.ibatis.scripting.xmltags.DynamicSqlSource的getBoundSql方法中设置断点,可以看到exemptNo的空值状态表明该条件不应被添加。进一步在rootSqlNode.apply(context)的applyItem方法中,问题集中在DynamicContext对象的ContextMap上。它在遍历时将别名作为键存储,然而在操作结束后没有及时清理,导致了不必要的参数混淆。

       Mybatis的ContextMap设计用于存储SQL参数和临时键值对,但这里的问题在于,别名被永久性地存储在map中,而不是作为一次性使用的变量。因此,为了避免这类问题,应确保SQL的别名与实际参数名不冲突,以防止Mybatis的内存管理不当。

       总结来说,Mybatis在处理别名时的临时性考虑不足,导致了这个bug,提醒我们在使用Mybatis时,要注意别名的命名规则,以避免意外的SQL拼接错误。

更多相关资讯请点击【娱乐】频道>>>