在隨機獲取數據庫記錄時。我們的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());
最後成功的獲得了隨機記錄。
大家還有更好的方法歡迎提出來。