<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          詭異!MyBatis的Insert方法一直返回"-2147482646"?

          共 2390字,需瀏覽 5分鐘

           ·

          2021-04-19 11:30

          不點藍字,我們哪來故事?

          每天 11 點更新文章,餓了點外賣,點擊 ??《無門檻外賣優(yōu)惠券,每天免費領!》

          作者:占小狼的博客
          來源:https://sourl.cn/8frSmG

          前幾天在做項目demo的時候,發(fā)現(xiàn)有一個很奇怪的現(xiàn)象,就是MyBatis發(fā)現(xiàn)更新和插入返回值一直為"-2147482646",無論怎么改,這個值一直不變...

          實在摸不著頭腦,百度和谷歌了一下,有這樣的說法原來:是由defaultExecutorType設置引起的,如果設置為BATCH,更新返回值就會丟失。

          If the BATCH executor is in use, the update counts are being lost.

          # 操作


          也就是說在spring的配置文件中,只要把constructor-arg中的executorType改為SIMPLE(以前的值是BATCH就會引發(fā)這個問題)或者直接注釋掉就可以了

          <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">    <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>    <!-- 執(zhí)行類型 -->    <constructor-arg name="executorType" value="SIMPLE"></constructor-arg></bean>

          這么一改果然好使,但是為啥會返回這個奇怪的數(shù)字呢?背后有啥原因?
          本篇就來研究一下為什么會返回這個數(shù)字,打開我們的idea,又到了跟蹤源碼的時候了,走起。

          1、打開配置文件中的變量,看到SqlSessionTemplate這個類有個構造參數(shù)類型ExecutorType了,也就是我們配置的值,當它為BATCH的時候又會怎么樣呢?


          2、ExecutorType的參數(shù),打開這個類發(fā)現(xiàn)它是個枚舉類型,也就是說它僅僅只有3種配置的值,SIMPLE、RESUME、BATCH,在配置文件中我們也只能配這三種其中的一個


          3、程序執(zhí)行,可見最終操作的是SqlSession的insert方法,我們就來打開這個方法的源碼:
          Reader config = Resources.getResourceAsReader("conf.xml"); SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(config); SqlSession sqlSession = sessionFactory.openSession(); String sql = "com.mlxs.mybatis.test.userMapper.insertUser";
          int res= sqlSession.insert(sql, "1");//

          4、SqlSession.insert()方法:
          public interface SqlSession extends Closeable {
          int insert(String var1);
          int insert(String var1, Object var2);
          }

          SqlSession是一個接口,里面有insert方法,我們再來看一下這個接口的實現(xiàn)類:


          一般在源碼中,如果沒有特殊配置肯定是采用的Default的設置,我們就來看看DefaultSqlSession的源碼:


          再找this.insert方法:


          可以看到,它調用的是this.update方法,再來找一個update方法:


          看到本質上它調用的是executor的update方法,我們再點進去看update方法:


          可以看到它是一個接口,那么肯定要找實現(xiàn)類了:


          這里就可以看出端倪了,如果沒有配置緩存的話,肯定用的是BaseExecutor,那么我們在配置文件中配置的是Batch,毋庸置疑它肯定是選擇BatchExecutor這個類中的update方法了:


          千呼萬喚始出來,這個奇怪的數(shù)字原來在這里出來的,其中可以看到它是固定返回的,沒有任何判斷邏輯...這樣就證明了一點,只要你的insert方法在配置文件中配置的是batch,那么它肯定返回這個值!

          5、當配置為simple返回的是什么?

          根據(jù)上面的經驗,這里我們直接看SimpleExecutor方法就行了:


          接著再看StatementHandler就知道了:


          我找到了SimpleStatementHandler的update方法,可以看到它返回是statement.getUpdateCount返回的數(shù)字,也就是實際影響的行數(shù),那么就是正常的數(shù)值。

          # 總結


          本篇博客記錄了一次源碼追蹤的過程,從而解釋了為什么配置BATCH返回的是這個數(shù)字的原因,在實際的編程中,可能會遇到很多奇怪的問題,這時候就要敢于翻源碼,答案一定在源碼中,才能從根本上知道產生問題的原因。

          往期推薦

          總結一下,我在國企當程序員!

          如何設計API接口,實現(xiàn)統(tǒng)一格式返回?

          快來搶紅包!

          token多平臺身份認證架構設計思路

          下方二維碼關注我

          技術草根堅持分享 編程,算法,架構

          看完文章,餓了點外賣,點擊 ??《無門檻外賣優(yōu)惠券,每天免費領!》

          朋友,助攻一把!點個在看
          瀏覽 24
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩操逼大片 | 人操人摸| 最近最新中文字幕无码 | 国内精品在线观看小视频 | 精品国产黄色电影 |