11.平凡之路-緩存

MyBatis緩存介紹

正如大多數(shù)持久層框架一樣翎朱,MyBatis 同樣提供了一級(jí)緩存和二級(jí)緩存的支持

  1. 一級(jí)緩存基于PerpetualCache 的 HashMap本地緩存者疤,其存儲(chǔ)作用域?yàn)?Session,當(dāng) Session flush 或 close 之后,該Session中的所有 Cache 就將清空。
  2. 二級(jí)緩存與一級(jí)緩存其機(jī)制相同吩抓,默認(rèn)也是采用 PerpetualCache歧焦,HashMap存儲(chǔ)肠套,不同在于其存儲(chǔ)作用域?yàn)?Mapper(Namespace)入宦,并且可自定義存儲(chǔ)源巢钓,如 Ehcache破婆。
  3. 對(duì)于緩存數(shù)據(jù)更新機(jī)制狡门,當(dāng)某一個(gè)作用域(一級(jí)緩存Session/二級(jí)緩存Namespaces)的進(jìn)行了 Create/Update/Delete 操作后,默認(rèn)該作用域下所有 select 中的緩存將被clear锅很。

Mybatis的一級(jí)緩存

映射文件

<mapper namespace="com.shxt.dao.UserDao">
   
     <resultMap type="com.shxt.model.User" id="BaseResultMapper">
        <id column="user_id" property="user_id"/>
        <result column="account" property="account"/>
        <result column="password" property="password"/>
        <result column="user_name" property="user_name"/>
        <result column="status" property="status"/>
        <result column="login_time" property="login_time"/>
        <result column="ip" property="ip"/>
        <result column="fk_role_id" property="fk_role_id"/>
    </resultMap>
    
    <sql id="sys_user_columns">
        user_id,account,password,user_name,status,login_time,ip,fk_role_id
    </sql>
    
    <select id="load" parameterType="int" resultMap="BaseResultMapper">
        SELECT
            <include refid="sys_user_columns"/>
        FROM
            sys_user
        WHERE user_id=#{user_id}
    </select>
   
</mapper>

查詢(xún) | 一級(jí)緩存測(cè)試

    @Test
    public void 查詢(xún)_一級(jí)緩存測(cè)試(){
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.getSqlSession();

            User u1 = sqlSession.selectOne(UserDao.class.getName()+".load",-999);
            System.out.println("第一次查詢(xún):"+u1);

            User u2 = sqlSession.selectOne(UserDao.class.getName()+".load",-999);
            System.out.println("第二次查詢(xún):"+u2);

        } finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }

    }

控制臺(tái)運(yùn)行結(jié)果說(shuō)明

DEBUG [main] - ==>  Preparing: SELECT user_id,account,password,user_name,status,login_time,ip,fk_role_id FROM sys_user WHERE user_id=? 
DEBUG [main] - ==> Parameters: -999(Integer)
TRACE [main] - <==    Columns: user_id, account, password, user_name, status, login_time, ip, fk_role_id
TRACE [main] - <==        Row: -999, super, super, 劉文銘, 1, 2017-07-30 09:50:18.0, , -100
DEBUG [main] - <==      Total: 1
第一次查詢(xún):User [user_id=-999, account=super, password=super, user_name=劉文銘, status=1, login_time=Sun Jul 30 09:50:18 CST 2017, ip=, fk_role_id=-100]
第二次查詢(xún):User [user_id=-999, account=super, password=super, user_name=劉文銘, status=1, login_time=Sun Jul 30 09:50:18 CST 2017, ip=, fk_role_id=-100]

從以上結(jié)果中可以看出其馏,兩次調(diào)用load方法,但是只有一次查詢(xún)數(shù)據(jù)庫(kù)的過(guò)程爆安,這種現(xiàn)象產(chǎn)生的原因就是mybatis的一級(jí)緩存叛复,并且一級(jí)緩存是默認(rèn)開(kāi)啟的。

查詢(xún)-變更-查詢(xún) | 一級(jí)緩存測(cè)試

    @Test
    public void 查詢(xún)_變更_一級(jí)緩存測(cè)試(){
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.getSqlSession();

            User u1 = sqlSession.selectOne(UserDao.class.getName()+".load",-999);
            System.out.println("第一次查詢(xún):"+u1);

            User u2 = new User();
            u2.setUser_id(-999);
            u2.setStatus(2);
            //變更數(shù)據(jù)庫(kù)
            sqlSession.update(UserDao.class.getName()+".update", u2);

            User u3 = sqlSession.selectOne(UserDao.class.getName()+".load",-999);
            System.out.println("第二次查詢(xún):"+u3);

            //這里一定要提交扔仓,不然數(shù)據(jù)進(jìn)不去數(shù)據(jù)庫(kù)中
            sqlSession.commit();
        }catch (Exception ex) {
            ex.printStackTrace();
        }finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }

    }

如果中間過(guò)程中涉及到CUD操作,那么緩存自動(dòng)消失,重新查詢(xún)

控制臺(tái)運(yùn)行結(jié)果說(shuō)明

DEBUG [main] - ==>  Preparing: SELECT user_id,account,password,user_name,status,login_time,ip,fk_role_id FROM sys_user WHERE user_id=? 
DEBUG [main] - ==> Parameters: -999(Integer)
TRACE [main] - <==    Columns: user_id, account, password, user_name, status, login_time, ip, fk_role_id
TRACE [main] - <==        Row: -999, super, super, 劉文銘, 1, 2017-07-30 09:50:18.0, , -100
DEBUG [main] - <==      Total: 1
第一次查詢(xún):User [user_id=-999, account=super, password=super, user_name=劉文銘, status=1, login_time=Sun Jul 30 09:50:18 CST 2017, ip=, fk_role_id=-100]
DEBUG [main] - ==>  Preparing: UPDATE sys_user SET status = ? WHERE user_id=? 
DEBUG [main] - ==> Parameters: 2(Integer), -999(Integer)
DEBUG [main] - <==    Updates: 1
DEBUG [main] - ==>  Preparing: SELECT user_id,account,password,user_name,status,login_time,ip,fk_role_id FROM sys_user WHERE user_id=? 
DEBUG [main] - ==> Parameters: -999(Integer)
TRACE [main] - <==    Columns: user_id, account, password, user_name, status, login_time, ip, fk_role_id
TRACE [main] - <==        Row: -999, super, super, 劉文銘, 2, 2017-07-30 09:50:18.0, , -100
DEBUG [main] - <==      Total: 1
第二次查詢(xún):User [user_id=-999, account=super, password=super, user_name=劉文銘, status=2, login_time=Sun Jul 30 09:50:18 CST 2017, ip=, fk_role_id=-100]

Mybatis的二級(jí)緩存

默認(rèn)情況下是沒(méi)有開(kāi)啟Mybatis二級(jí)緩存的,那么我測(cè)試一下如下代碼,看看運(yùn)行效果

    @Test
    public void 查詢(xún)_沒(méi)有二級(jí)緩存測(cè)試(){
        //第一個(gè)SqlSession
        SqlSession sqlSession1 = null;
        //第二個(gè)SqlSession
        SqlSession sqlSession2 = null;
        try {
            sqlSession1 = MyBatisUtils.getSqlSession();

            sqlSession2 = MyBatisUtils.getSqlSession();

            User u1 = sqlSession1.selectOne(UserDao.class.getName()+".load",-999);
            System.out.println("sqlSession1 查詢(xún):"+u1);

            User u2 = sqlSession2.selectOne(UserDao.class.getName()+".load",-999);
            System.out.println("sqlSession2 查詢(xún):"+u2);

        } finally {
            MyBatisUtils.closeSqlSession(sqlSession1);
            MyBatisUtils.closeSqlSession(sqlSession2);
        }

    }

控制臺(tái)運(yùn)行結(jié)果說(shuō)明

DEBUG [main] - ==>  Preparing: SELECT user_id,account,password,user_name,status,login_time,ip,fk_role_id FROM sys_user WHERE user_id=? 
DEBUG [main] - ==> Parameters: -999(Integer)
TRACE [main] - <==    Columns: user_id, account, password, user_name, status, login_time, ip, fk_role_id
TRACE [main] - <==        Row: -999, super, super, 劉文銘, 2, 2017-07-30 09:50:18.0, , -100
DEBUG [main] - <==      Total: 1
sqlSession1 查詢(xún):User [user_id=-999, account=super, password=super, user_name=劉文銘, status=2, login_time=Sun Jul 30 09:50:18 CST 2017, ip=, fk_role_id=-100]
Tue Sep 05 16:20:42 CST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
DEBUG [main] - ==>  Preparing: SELECT user_id,account,password,user_name,status,login_time,ip,fk_role_id FROM sys_user WHERE user_id=? 
DEBUG [main] - ==> Parameters: -999(Integer)
TRACE [main] - <==    Columns: user_id, account, password, user_name, status, login_time, ip, fk_role_id
TRACE [main] - <==        Row: -999, super, super, 劉文銘, 2, 2017-07-30 09:50:18.0, , -100
DEBUG [main] - <==      Total: 1
sqlSession2 查詢(xún):User [user_id=-999, account=super, password=super, user_name=劉文銘, status=2, login_time=Sun Jul 30 09:50:18 CST 2017, ip=, fk_role_id=-100]

兩個(gè)session褐奥,分別查詢(xún)id為-999 的 User ,那么mybatis與數(shù)據(jù)庫(kù)交互了兩次翘簇,這樣說(shuō)明mybatis現(xiàn)在沒(méi)有開(kāi)啟二級(jí)緩存撬码,需要我們手動(dòng)的開(kāi)啟。

第一步:序列化持久化類(lèi)

User.java類(lèi)去實(shí)現(xiàn)Serializable接口,不然MyBatis的二級(jí)緩存不好用

public class User implements java.io.Serializable{
    private static final long serialVersionUID = 1L;
}

第二步:手動(dòng)開(kāi)啟二級(jí)緩存

這里的原則是版保,如果開(kāi)啟了二級(jí)緩存呜笑,那么在關(guān)閉sqlsession后,會(huì)把該sqlsession一級(jí)緩存中的數(shù)據(jù)添加到namespace的二級(jí)緩存中彻犁。

mybatis-config.xml配置信息

    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>

cacheEnabled的默認(rèn)值就是true,所以可以忽略

UserMapper.xml開(kāi)始二級(jí)緩存標(biāo)簽

<mapper namespace="com.shxt.dao.UserDao">
    <!-- 開(kāi)啟二級(jí)緩存 -->
    <cache></cache>
   <!-- 省略的部分代碼  -->
</mapper>

第三步:測(cè)試代碼

        @Test
    public void 查詢(xún)_二級(jí)緩存測(cè)試() {
        // 第一個(gè)SqlSession
        SqlSession sqlSession1 = null;
        // 第二個(gè)SqlSession
        SqlSession sqlSession2 = null;

        sqlSession1 = MyBatisUtils.getSqlSession();

        sqlSession2 = MyBatisUtils.getSqlSession();

        User u1 = sqlSession1.selectOne(UserDao.class.getName() + ".load", -999);
        System.out.println("sqlSession1 查詢(xún):" + u1);
        MyBatisUtils.closeSqlSession(sqlSession1);// 關(guān)閉

        User u2 = sqlSession2.selectOne(UserDao.class.getName() + ".load", -999);
        System.out.println("sqlSession2 查詢(xún):" + u2);
        MyBatisUtils.closeSqlSession(sqlSession2);

    }

控制臺(tái)運(yùn)行結(jié)果說(shuō)明

DEBUG [main] - Cache Hit Ratio [com.shxt.dao.UserDao]: 0.0
DEBUG [main] - ==>  Preparing: SELECT user_id,account,password,user_name,status,login_time,ip,fk_role_id FROM sys_user WHERE user_id=? 
DEBUG [main] - ==> Parameters: -999(Integer)
TRACE [main] - <==    Columns: user_id, account, password, user_name, status, login_time, ip, fk_role_id
TRACE [main] - <==        Row: -999, super, super, 劉文銘, 2, 2017-07-30 09:50:18.0, , -100
DEBUG [main] - <==      Total: 1
sqlSession1 查詢(xún):User [user_id=-999, account=super, password=super, user_name=劉文銘, status=2, login_time=Sun Jul 30 09:50:18 CST 2017, ip=, fk_role_id=-100]
DEBUG [main] - Cache Hit Ratio [com.shxt.dao.UserDao]: 0.5
sqlSession2 查詢(xún):User [user_id=-999, account=super, password=super, user_name=劉文銘, status=2, login_time=Sun Jul 30 09:50:18 CST 2017, ip=, fk_role_id=-100]

在默認(rèn)情況下叫胁,當(dāng)sqlsession執(zhí)行commit后會(huì)刷新緩存,這樣的寫(xiě)法等價(jià)上面的寫(xiě)法

    @Test
    public void 查詢(xún)_二級(jí)緩存測(cè)試(){
        //第一個(gè)SqlSession
        SqlSession sqlSession1 = null;
        //第二個(gè)SqlSession
        SqlSession sqlSession2 = null;
        try {
            sqlSession1 = MyBatisUtils.getSqlSession();

            sqlSession2 = MyBatisUtils.getSqlSession();

            User u1 = sqlSession1.selectOne(UserDao.class.getName()+".load",-999);
            System.out.println("sqlSession1 查詢(xún):"+u1);
            sqlSession1.commit();//強(qiáng)制刷新

            User u2 = sqlSession2.selectOne(UserDao.class.getName()+".load",-999);
            System.out.println("sqlSession2 查詢(xún):"+u2);

        } finally {
            MyBatisUtils.closeSqlSession(sqlSession1);
            MyBatisUtils.closeSqlSession(sqlSession2);
        }

    }

當(dāng)為select語(yǔ)句時(shí):

  • flushCache默認(rèn)為false,表示任何時(shí)候語(yǔ)句被調(diào)用汞幢,都不會(huì)去清空本地緩存和二級(jí)緩存驼鹅。
  • useCache默認(rèn)為true,表示會(huì)將本條語(yǔ)句的結(jié)果進(jìn)行二級(jí)緩存森篷。

修改映射文件如下

<mapper namespace="com.shxt.dao.UserDao">
    <!-- 開(kāi)啟二級(jí)緩存 -->
    <cache></cache>
    
   
     <resultMap type="com.shxt.model.User" id="BaseResultMapper">
        <id column="user_id" property="user_id"/>
        <result column="account" property="account"/>
        <result column="password" property="password"/>
        <result column="user_name" property="user_name"/>
        <result column="status" property="status"/>
        <result column="login_time" property="login_time"/>
        <result column="ip" property="ip"/>
        <result column="fk_role_id" property="fk_role_id"/>
    </resultMap>
    
    <sql id="sys_user_columns">
        user_id,account,password,user_name,status,login_time,ip,fk_role_id
    </sql>
    <!-- 
    flushCache="true" 強(qiáng)制刷新
    
     -->
    <select id="load" parameterType="int" resultMap="BaseResultMapper" flushCache="true">
        SELECT
            <include refid="sys_user_columns"/>
        FROM
            sys_user
        WHERE user_id=#{user_id}
    </select>
</mapper>

再次運(yùn)行之前commit的提交的測(cè)試方法 , 運(yùn)行結(jié)果為:

DEBUG [main] - Cache Hit Ratio [com.shxt.dao.UserDao]: 0.0
DEBUG [main] - ==>  Preparing: SELECT user_id,account,password,user_name,status,login_time,ip,fk_role_id FROM sys_user WHERE user_id=? 
DEBUG [main] - ==> Parameters: -999(Integer)
TRACE [main] - <==    Columns: user_id, account, password, user_name, status, login_time, ip, fk_role_id
TRACE [main] - <==        Row: -999, super, super, 劉文銘, 2, 2017-07-30 09:50:18.0, , -100
DEBUG [main] - <==      Total: 1
sqlSession1 查詢(xún):User [user_id=-999, account=super, password=super, user_name=劉文銘, status=2, login_time=Sun Jul 30 09:50:18 CST 2017, ip=, fk_role_id=-100]
DEBUG [main] - Cache Hit Ratio [com.shxt.dao.UserDao]: 0.5
DEBUG [main] - ==>  Preparing: SELECT user_id,account,password,user_name,status,login_time,ip,fk_role_id FROM sys_user WHERE user_id=? 
DEBUG [main] - ==> Parameters: -999(Integer)
TRACE [main] - <==    Columns: user_id, account, password, user_name, status, login_time, ip, fk_role_id
TRACE [main] - <==        Row: -999, super, super, 劉文銘, 2, 2017-07-30 09:50:18.0, , -100
DEBUG [main] - <==      Total: 1
sqlSession2 查詢(xún):User [user_id=-999, account=super, password=super, user_name=劉文銘, status=2, login_time=Sun Jul 30 09:50:18 CST 2017, ip=, fk_role_id=-100]

當(dāng)為insert输钩、update、delete語(yǔ)句時(shí):

  • flushCache默認(rèn)為true疾宏,表示任何時(shí)候語(yǔ)句被調(diào)用张足,都會(huì)導(dǎo)致本地緩存和二級(jí)緩存被清空触创。
  • useCache屬性在該情況下沒(méi)有

總結(jié)

一級(jí)緩存

  1. 默認(rèn)開(kāi)啟
  2. 必須同一個(gè)session坎藐,如果session對(duì)象已經(jīng)close()過(guò)了就不能用了
  3. 查詢(xún)條件必須一致
  4. 沒(méi)有執(zhí)行過(guò)session.cleanCache();清理緩存
  5. 沒(méi)有執(zhí)行過(guò)增刪改操作(這些操作都會(huì)清理緩存)

二級(jí)緩存

1.mybatis-config.xml 中默認(rèn)配置

<settings> 
        <setting name="cacheEnabled" value="true" /> 
</settings>

2.必須手動(dòng)開(kāi)啟在Mapper.xml中添加

<mapper namespace="com.shxt.dao.UserDao">
    <!-- 開(kāi)啟二級(jí)緩存 -->
    <cache></cache>
     <resultMap type="com.shxt.model.User" id="BaseResultMapper">
        <id column="user_id" property="user_id"/>
        <result column="account" property="account"/>
        <result column="password" property="password"/>
        <result column="user_name" property="user_name"/>
        <result column="status" property="status"/>
        <result column="login_time" property="login_time"/>
        <result column="ip" property="ip"/>
        <result column="fk_role_id" property="fk_role_id"/>
    </resultMap>
    
    <sql id="sys_user_columns">
        user_id,account,password,user_name,status,login_time,ip,fk_role_id
    </sql>
    <!-- 
    flushCache="true" 強(qiáng)制刷新
    
     -->
    <select id="load" parameterType="int" resultMap="BaseResultMapper">
        SELECT
            <include refid="sys_user_columns"/>
        FROM
            sys_user
        WHERE user_id=#{user_id}
    </select>
</mapper>

3.映射語(yǔ)句文件中的所有select語(yǔ)句將會(huì)被緩存。
4.映射語(yǔ)句文件中的所有insert哼绑,update和delete語(yǔ)句會(huì)刷新緩存岩馍。
5.緩存會(huì)使用Least Recently Used(LRU,最近最少使用的)算法來(lái)收回抖韩。
6.緩存會(huì)根據(jù)指定的時(shí)間間隔來(lái)刷新蛀恩。
7.緩存會(huì)存儲(chǔ)1024個(gè)對(duì)象

<cache 
eviction="FIFO"  //回收策略為先進(jìn)先出
flushInterval="60000" //自動(dòng)刷新時(shí)間60s
size="512" //最多緩存512個(gè)引用對(duì)象
readOnly="true"/> //只讀

說(shuō)在后面的話,個(gè)人感覺(jué)MyBatis的緩存意義不大:
A. 面對(duì)一定規(guī)模的數(shù)據(jù)量,內(nèi)置的cache方式就派不上用場(chǎng)了;
B. 對(duì)查詢(xún)結(jié)果集做緩存并不是MyBatis框架擅長(zhǎng)的茂浮,它專(zhuān)心做的應(yīng)該是sql mapper双谆。采用此框架的Application去構(gòu)建緩存更合理壳咕,比如采用OSCache、Memcached啥的顽馋。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谓厘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子寸谜,更是在濱河造成了極大的恐慌竟稳,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熊痴,死亡現(xiàn)場(chǎng)離奇詭異他爸,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)果善,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)诊笤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人岭埠,你說(shuō)我怎么就攤上這事盏混。” “怎么了惜论?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵许赃,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我馆类,道長(zhǎng)混聊,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任乾巧,我火速辦了婚禮句喜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沟于。我一直安慰自己咳胃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布旷太。 她就那樣靜靜地躺著展懈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪供璧。 梳的紋絲不亂的頭發(fā)上存崖,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音睡毒,去河邊找鬼来惧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛演顾,可吹牛的內(nèi)容都是我干的供搀。 我是一名探鬼主播隅居,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼葛虐!你這毒婦竟也來(lái)了军浆?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤挡闰,失蹤者是張志新(化名)和其女友劉穎乒融,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體摄悯,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赞季,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了奢驯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片申钩。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瘪阁,靈堂內(nèi)的尸體忽然破棺而出撒遣,到底是詐尸還是另有隱情,我是刑警寧澤管跺,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布义黎,位于F島的核電站,受9級(jí)特大地震影響豁跑,放射性物質(zhì)發(fā)生泄漏廉涕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一艇拍、第九天 我趴在偏房一處隱蔽的房頂上張望狐蜕。 院中可真熱鬧,春花似錦卸夕、人聲如沸层释。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)贡羔。三九已至,卻和暖如春碍讨,著一層夾襖步出監(jiān)牢的瞬間治力,已是汗流浹背蒙秒。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工勃黍, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晕讲。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓覆获,卻偏偏與公主長(zhǎng)得像马澈,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子弄息,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 前言 主題是Mybatis一級(jí)和二級(jí)緩存的應(yīng)用及源碼分析痊班。希望在本場(chǎng)chat結(jié)束后,能夠幫助讀者朋友明白以下三點(diǎn)摹量。...
    余平的余_余平的平閱讀 1,323評(píng)論 0 12
  • 1. 簡(jiǎn)介 1.1 什么是 MyBatis 涤伐? MyBatis 是支持定制化 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射的優(yōu)秀的...
    笨鳥(niǎo)慢飛閱讀 5,464評(píng)論 0 4
  • 本文已授權(quán)Gitchat獨(dú)家發(fā)布器净,未經(jīng)Gitchat許可,不得轉(zhuǎn)載当凡。 我山害,后端Java工程師,現(xiàn)在美團(tuán)點(diǎn)評(píng)工作沿量。愛(ài)...
    凱倫說(shuō)閱讀 42,659評(píng)論 25 146
  • 1 緩存介紹# MyBatis支持聲明式數(shù)據(jù)緩存(declarative data caching)浪慌。當(dāng)一條SQL...
    七寸知架構(gòu)閱讀 2,111評(píng)論 2 51
  • 悲觀的講,人生只有一種結(jié)果朴则,那就是死去眷射,然而死去并不是說(shuō)的那么容易,卻也總是很脆弱佛掖。 來(lái)到這個(gè)世間里妖碉,萬(wàn)事萬(wàn)物的誘...
    九歲V閱讀 919評(píng)論 0 0