中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mybatis相同的sql查詢第二次查不出結果怎么辦

發布時間:2022-01-21 17:01:16 來源:億速云 閱讀:314 作者:iii 欄目:開發技術

這篇文章主要講解了“mybatis相同的sql查詢第二次查不出結果怎么辦”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“mybatis相同的sql查詢第二次查不出結果怎么辦”吧!

相同的sql查詢第二次查不出結果問題

問題分析

今天在做公司業務,大致是用戶傳來訂單號(買卡)和手機號對其進行卡綁定,其中如果已經操作過則返回操作后的狀態,問題出現在如果是項目啟動第一次訪問,會正常返回結果,第二次訪問時會報找不到卡信息的錯誤,但是代碼是同一個,查詢語句也一樣,為什么會出現這種情況?找遍百度,未果,自己摸索著尋找問題。

問題探索

首先對查詢方法進行了排除,未果;然后尋找代碼中問題,發現遍歷卡信息(可找到多張卡)時,對于已經操作過的會進行remove()操作,注釋掉這行,程序有結果,但是會重新更新卡信息,不是需要的結果;最后發現是對list進行remove()操作時都會出錯,于是聯想到了MyBatis的緩存。

MyBatis緩存介紹

一級緩存:即session緩存,作用域為 Session,當 Session flush 或 close 之后,該Session中的所有 Cache 就將清空,默認開啟。注意:集成spring(使用mybatis-spring)時:

每次查詢spring會重新創建SqlSession,所以一級緩存是不生效的;

而當開啟事務時,spring會使用同一個SqlSession做查詢,所以這個情況下一級緩存是生效的。

二級緩存:即全局緩存,其作用域為 Mapper(Namespace),默認關閉。

問題原因

上述提到了MyBatis的緩存機制,查看項目配置后發現問題在于第一次查詢到結果會放到緩存中,程序對查到的結果list進行了remove操作,所以緩存中的list會發生變化,第二次查詢時會從緩存中將操作過的list查找出來(mybatis返回的實體類的內存地址是相同的),故而產生了我們不需要的結果,之前項目中使用的是與Spring集成的,使用的session是SqlSessionTemplate,這里是默認關閉了一級緩存,而今天項目中沒有與Spring集成,創建session使用的是SqlsessionFactory的openSession()方法,這里查找時默認會先從緩存中查詢,綜上,第二次我們查到的只是緩存中的數據[2]。

解決方案

既然第二次會從緩存中讀數據,不可能修改項目配置關閉一級緩存,所以可以通過刷新緩存來達到我們所需要的目的

方案一:通過SqlSessionUtils.getSqlSession(sqlSessionFactory).clearCache()方法刷新緩存

方案二:在mapper.xml對應的查找語句中添加flushCache="true"

<select id="selectCardInfoByOrderId" resultType="xxx" parameterType="java.util.Map" flushCache="true"></select>

mybatis條件查詢容易遇見的錯誤

在使用mybatis的條件查詢時,

一不小心就容易出現這個錯誤

19-Dec-2017 16:04:38.742 嚴重 [http-nio-8090-exec-6] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [SpringMVC] in context with path [] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'endoscopeType' in 'class java.lang.String'] with root cause org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'endoscopeType' in 'class java.lang.String'at org.apache.ibatis.reflection.Reflector.getGetInvoker(Reflector.java:380)at org.apache.ibatis.reflection.MetaClass.getGetInvoker(MetaClass.java:170)at org.apache.ibatis.reflection.wrapper.BeanWrapper.getBeanProperty(BeanWrapper.java:152)at org.apache.ibatis.reflection.wrapper.BeanWrapper.get(BeanWrapper.java:48)

這是mapper.xml文件:

<select id="findByEndoscopeType" resultMap="BaseResultMap" parameterType="java.lang.String">
    SELECT *
    FROM endoscope
    <where>
        <if test="endoscopeType != null">
            endoscope_type = #{endoscopeType,jdbcType=VARCHAR}
        </if>
    </where>
</select>

出錯的原因是因為加上 <if> 標簽時,endoscope屬性沒有包含在String endoscopeType中

兩種解決方法

1.將<if>標簽去掉;

2.傳入參數放在對象中傳進來;

<select id="findByEndoscopeType" resultMap="BaseResultMap" parameterType="com.iel.endoscope.entity.Endoscope">
    SELECT *
    FROM endoscope
    <where>
        <if test="endoscopeType != null">
            endoscope_type = #{endoscopeType,jdbcType=VARCHAR}
        </if>
    </where>
</select>

感謝各位的閱讀,以上就是“mybatis相同的sql查詢第二次查不出結果怎么辦”的內容了,經過本文的學習后,相信大家對mybatis相同的sql查詢第二次查不出結果怎么辦這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宕昌县| 漳州市| 罗平县| 陆良县| 酒泉市| 鹤峰县| 天津市| 乌恰县| 长宁区| 泽库县| 三门县| 平安县| 锦州市| 砀山县| 五指山市| 崇阳县| 文登市| 曲靖市| 体育| 望江县| 太原市| 寿阳县| 大兴区| 讷河市| 铜鼓县| 溆浦县| 鹤壁市| 浮梁县| 怀来县| 棋牌| 八宿县| 柘荣县| 北京市| 通海县| 德惠市| 吉安市| 甘谷县| 原阳县| 板桥市| 泗水县| 澄江县|