一、背景
同事在同一個mapper.xml (namespace相同),復制了一個sql沒有修改id,正常啟動項目。但是我以前使用mybatis的時候如果在namespace相同情況下,id重復,項目會報錯無法正常啟動,后來看代碼發現,是mybatisplus處理了id重復,項目也能正常啟動。
二、mybatis 解析crud sql 的流程
mybatis啟動流程,springboot啟動時,加載MybatisAutoConfiguration類,創建sqlSessionFactoryBean類,執行流程sqlSessionFactoryBean -> afterPropertiesSet ->
xmlMapperBuilder.parse()->
this.configurationElement(this.parser.evalNode(“/mapper”))->
buildStatementFromContext->
parseStatementNode->
builderAssistant.addMappedStatement->
configuration.addMappedStatement(statement)
關鍵就在configuration中的addMappedStatement方法,如下圖是mybatis中截圖,mappedStatements是map集合,以id為key MappedStatement為值,mybatisplus就在這加的判斷。
集合是在configuration初始化完成賦值成StrictMap類型。
繼續看StrictMap中的put方法,可以看出,如果namesapce一直,id重復會拋錯。
三、mybatisplus中流程
1、springboot啟動時,加載MybatisplusAutoConfiguration類時,此類中創建了mybatis重寫的sqlSessionFactoryBean類,此類中加入了自己的MybatisConfiguretion類重寫了Configuretion類,拓展了crud等功能。
2、解析xml 中crud流程和mybatis大致一樣,不同地方在MybatisConfiguretion類addMappedStatement方法中添加了判斷,如果重復打印錯誤執行return跳過mybatis中的addMappedStatement方法。