改mybatis到mybatis-plus的擎天巨坑

兄弟們!mybatis-plus是號稱對mybatis本身無侵入的一種加強版。
但是當你引入它的時候,可能會廣泛踩坑。接下來給大家看看我的踩坑歷史。

第一坑:當你選擇的是mybatis-spring-boot-starter+mybatis-plus引入時
pom依賴如下:

  <!--mybatis的基礎(chǔ)依賴-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>
        <!--mybatis-plus依賴-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>3.3.1.tmp</version>
        </dependency>

這樣。其實,你的mybatis還是你曾經(jīng)的mybatis,只是附加了一些功能。但是,當你開始配置yml文件的時候,諸多小白(如我),可能會直接將一些屬性配置直接替換到mybatis-plus之下。
如:

mybatis-plus:
  #mapper路徑
  mapper-locations: classpath*:/mapper/*.xml
  configuration:
    # 是否開啟自動駝峰命名規(guī)則(camel case)映射,即從經(jīng)典數(shù)據(jù)庫列名 A_COLUMN(下劃線命名) 到經(jīng)典 Java 屬性名 aColumn(駝峰命名) 的類似映射
    map-underscore-to-camel-case: true
    # 全局地開啟或關(guān)閉配置文件中的所有映射器已經(jīng)配置的任何緩存,默認為 true
    cache-enabled: false
    #懶加載
    #aggressive-lazy-loading: true
    #NONE:不啟用自動映射 PARTIAL:只對非嵌套的 resultMap 進行自動映射 FULL:對所有的 resultMap 都進行自動映射
    #auto-mapping-behavior: partial
    #NONE:不做任何處理 (默認值)WARNING:以日志的形式打印相關(guān)警告信息 FAILING:當作映射失敗處理,并拋出異常和詳細信息
    #auto-mapping-unknown-column-behavior: none
    #如果查詢結(jié)果中包含空值的列,則 MyBatis 在映射的時候,不會映射這個字段
    call-setters-on-nulls: true
    # 這個配置會將執(zhí)行的sql打印出來,在開發(fā)或測試的時候可以用
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      #表名下劃線命名默認true
      table-underline: true
      #id類型
      id-type: auto
      #是否開啟大寫命名,默認不開啟
      #capital-mode: false
      #邏輯已刪除值,(邏輯刪除下有效) 需要注入邏輯策略LogicSqlInjector 以@Bean方式注入
      logic-not-delete-value: 0
      #邏輯未刪除值,(邏輯刪除下有效)
      logic-delete-value: 1

血淚的教訓?。?!
其實,yml已經(jīng)很好心地提醒了你,比如打mybatis-plus之后沒有屬性提示信息,屬性高亮黃色等等,但是你的配置很可能就是直接CL復制過來的,所以完全不會注意到。

不帶高亮的就是可配置的,高亮的把鼠標放上去會提示非可用配置

那么此時請記住,現(xiàn)在你的mybatis-plus是沒有mybatis基礎(chǔ)文件的大哥們!?。∧銈兪莾蓚€包?。?!你不是直接引入的mybatis-plus-boot-starter的!??!
因此,該配置在mybatis下的,一個都不能少。比如,駝峰映射。
如果你像我這么配置,明明打開了駝峰映射map-underscore-to-camel-case: true但是鑒于它不是有效的配置,所以它是不會生效的。
當你糾結(jié)為啥你獲取到的參數(shù)都是null的時候,花費了N個小時之后,終于覺得可能是駝峰映射的問題的時候,一個斷點打進來。
喲嚯,發(fā)現(xiàn)了!這個配置是關(guān)閉的哦!

MetaClass.class

所以需要在mybatis下保留其基礎(chǔ)配置。
如下:

mybatis:
  mapper-locations: classpath*:/mapper/*.xml
  configuration:
    map-underscore-to-camel-case: true
    #如果查詢結(jié)果中包含空值的列,則 MyBatis 在映射的時候,不會映射這個字段
    call-setters-on-nulls: true

但這樣就沒法直接在yml中操作mybatis-plus了。

第二坑:當你覺得附和兩個包太過麻煩,而且無法配置mybatis-plus的屬性打算直接引入mybatis-plus-boot-starter
請記住一定要排除掉mybatis-spring-boot-starter這個包,不然很可能會有jar包版本沖突。
mybatis造成的啟動時版本沖突bug示例
因此,我們直接這樣導入包即可

 <!--mybatis-plus-starter依賴-->
        <!--有了這個依賴之后不要在增加mybatis依賴了,會沖突-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.1.tmp</version>
        </dependency>

然后配置文件就可以全部轉(zhuǎn)到mybatis-plus
如下:

mybatis-plus:
  #mapper路徑
  mapper-locations: classpath*:/mapper/*.xml
  configuration:
    # 是否開啟自動駝峰命名規(guī)則(camel case)映射,即從經(jīng)典數(shù)據(jù)庫列名 A_COLUMN(下劃線命名) 到經(jīng)典 Java 屬性名 aColumn(駝峰命名) 的類似映射
    map-underscore-to-camel-case: true
    # 全局地開啟或關(guān)閉配置文件中的所有映射器已經(jīng)配置的任何緩存,默認為 true
    cache-enabled: false
    #懶加載
    #aggressive-lazy-loading: true
    #NONE:不啟用自動映射 PARTIAL:只對非嵌套的 resultMap 進行自動映射 FULL:對所有的 resultMap 都進行自動映射
    #auto-mapping-behavior: partial
    #NONE:不做任何處理 (默認值)WARNING:以日志的形式打印相關(guān)警告信息 FAILING:當作映射失敗處理,并拋出異常和詳細信息
    #auto-mapping-unknown-column-behavior: none
    #如果查詢結(jié)果中包含空值的列,則 MyBatis 在映射的時候,不會映射這個字段
    call-setters-on-nulls: true
    # 這個配置會將執(zhí)行的sql打印出來,在開發(fā)或測試的時候可以用
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      #表名下劃線命名默認true
      table-underline: true
      #id類型
      id-type: auto
      #是否開啟大寫命名,默認不開啟
      #capital-mode: false
      #邏輯已刪除值,(邏輯刪除下有效) 需要注入邏輯策略LogicSqlInjector 以@Bean方式注入
      logic-not-delete-value: 0
      #邏輯未刪除值,(邏輯刪除下有效)
      logic-delete-value: 1

其實yml真的已經(jīng)盡力了!如果你真的已經(jīng)引入了starter包,它的提示就是會生效的配置!


提示信息
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容