Mysql隨機記錄獲取注意事項

在隨機獲取數據庫記錄時。我們的sql語句一般都是確定的。因此對於使用了Mybatis的項目中來說,mysql的隨機數據會被Mybatis緩存下來,因此導致每次Dao獲取的數據都是一樣的,也就失去了隨機的意義。這裏需要配合mapper文件裏的以下標籤使用,刷新(清空)緩存。

 mapper標籤:flushCache="true"


舉例:
 <select id="getRandomVideo" resultType="com.XXX.XXX.beans.XXXVideo" flushCache="true">
      SELECT * FROM video ORDER BY RAND() LIMIT 1
 </select>

獲取隨機行數的sql語句:

SELECT * FROM video ORDER BY RAND() LIMIT 1

LIMIT 1 :代表返回一條隨機結果。想獲取X條隨機記錄,那麼改爲 LIMIT X 即可。

ORDER BY RAND() :代表隨機排序

 

Mybatis分兩級緩存。

     在此條select標籤中使用flushCache,表示每次此查詢執行時,都會清空緩存並且去數據庫運行此條語句。這樣我們的隨機sql 語句纔會在數據庫被執行。

還有一相關Mybatis標籤是:

useCache="false"

 代表不使用二級緩存。true的時候表示使用二級緩存。

注意:

一級緩存是sqlsession級別的緩存。在Mybatis中無法關閉,因此當調用隨機獲取記錄的sql語句時,如果一直是同一個sql會話,而且sql中沒有添加隨機數時(不更改mapper配置文件的情景下,防止Mybatis緩存sql執行結果的方式,下一段介紹),那麼還會返回相同的數據。因爲在標籤裏配置 useCache="false" 只是禁言二級緩存,使用flushCache="true"纔是有效的

補充:

添加隨機數的方式避免Mybatis緩存數據

此方法不用修改Mybatis相關配置,比如在上面獲取隨機行數的sql語句中添加一些不影響隨機的參數:

SELECT * FROM video WHERE #{random}=#{random} ORDER BY RAND() LIMIT 1

 當然在調用方法中要添加對應的參數。

比如之前的Dao或Mapper類中,方法是如下無參的:

     getRandomVideo();

     那麼現在需要變爲:getRandomVideo(String random);

在製作隨機參數的時候也有需要注意的地方,比如調用此方法時需要注意不要使用時間戳的方式獲取隨機數,如下:

     當service層調用 getRandomVideo(String random); 方法時

     getRandomVideo(new Date().toString());是不行的。

在這裏博主是使用生成UUID的方式來獲取隨機數:

      getRandomVideo(new UUID().toString());

最後成功的獲得了隨機記錄。

大家還有更好的方法歡迎提出來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章