mybatis一二级缓存

0x00:项目工程图

1.jpg

0x01:mybati.xml全局配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--全局配置文件-->
    <properties resource="jdbc.properties"/>
    <settings>
        <setting name="logImpl" value="LOG4J"/>
        <setting name="defaultStatementTimeout" value="3"></setting><!--3秒没响应就放弃,锁超时-->
        <!--<setting name="localCacheScope" value="STATEMENT"/>--><!--全局取消一级缓存-->
    </settings>
    <typeAliases>
        <package name="com.it.peach.model"></package><!--包别名-->
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/User.xml"/>
    </mappers>
</configuration>
  • <setting name="localCacheScope" value="STATEMENT"/>全局取消一级缓存

0x02:user.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.it.peach.dao.IUserDao"><!--namespace名称空间,必须唯一-->
    <!--设置全局的二级缓存-->
    <cache eviction="FIFO"
           flushInterval="10000"
           size="100"
           readOnly="true"/>

    <!--下面写增删改查sql语句-->
    <!--增加-->
    <insert id="insertUser" parameterType="User">
        insert into user(name,age,sex) values (#{name},#{age},#{sex})
    </insert>
    <!--删除-->
    <delete id="delUser" parameterType="int">
        delete from user where nid=#{nid}
    </delete>
    <!--修改-->
    <update id="updateUser" parameterType="User">
        update user
        <set>
            <if test="name !=null">name=#{name},</if>
            <if test="age !=null">age=#{age},</if>
            <if test="sex !=null">sex=#{sex},</if>
        </set>
        where nid=#{nid}
    </update>
    <!--查询-->
    /*flushCache="true"  局部取消一级缓存*/
    <select flushCache="true"  id="equrysUser" parameterType="User" resultType="User">
        select nid,name,age,sex from user
        <where>
            <if test="name != null">and name like CONCAT('%',#{name},'%')</if>
            <if test="age !=null">and age=#{age},</if>
            <if test="sex !=null">and sex=#{sex},</if>
        </where>
    </select>
</mapper>
    <cache eviction="FIFO"
           flushInterval="10000"
           size="100"
           readOnly="true"/>
  • readOnly设置为false会报错,序列化异常
  • flushCache="true" 局部取消一级缓存

0x04:IUserDao

package com.it.peach.dao;

import com.it.peach.model.User;

import java.util.List;

/**
 * 接口路径名必须与xml的namespace相同
 * 方法名称必须与xml的id相同
 * 方法的参数类型必须与xml中的parameType相同
 * 方法的返回值必须和xml的resultType或者resultMap相同
 * */
public interface IUserDao {
    /*返回值 方法名(参数类型)*/
    int insertUser(User user);
    int delUser(int id);
    int updateUser(User user);
    List<User> equrysUser(User user);
}
  • 接口路径名必须与xml的namespace相同
  • 方法名称必须与xml的id相同
  • 方法的参数类型必须与xml中的parameType相同
  • 方法的返回值必须和xml的resultType或者resultMap相同

0x05:UserTest.java

public class UserTest {
        SqlSessionFactory sqlSessionFactory = null;

        @Before
        public void init() throws IOException {
            String resourse = "mybatis.xml";
            InputStream resourceAsStream = Resources.getResourceAsStream(resourse);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        }

        @Test
        public void testAdd() {/*增加数据*/
            try (SqlSession session = sqlSessionFactory.openSession()) {//打开一个链接
                User user = new User(null, "王五2", 17, "女");
                // getMapper会通过反射代理生成一个实现类
                IUserDao userDao = session.getMapper(IUserDao.class);
                int rows = userDao.insertUser(user);
                System.out.println("受影响的行数"+rows);
                session.commit();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Test
        public void testDel() {/*删除数据*/
            try (SqlSession session = sqlSessionFactory.openSession()) {//打开一个链接
                IUserDao userDao = session.getMapper(IUserDao.class);
                int rows = userDao.delUser(3);
                System.out.println("删除书籍的行数"+rows);
                session.commit();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Test
        public void testUpdate() {/*修改数据*/
            try (SqlSession session = sqlSessionFactory.openSession()) {//打开一个链接
                User user = new User(2, "李四1", 16, "女");
                IUserDao userDao = session.getMapper(IUserDao.class);
                int rows = userDao.updateUser(user);
                session.commit();
                System.out.println("受影响的行数"+rows);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Test
        public void testFirstLevelCache() {/*一级缓存查询数据*/
            try (SqlSession session = sqlSessionFactory.openSession()) {//打开一个链接
                User user1 = new User(null, "李", null, null);
                IUserDao userDao = session.getMapper(IUserDao.class);
                List<User> list=userDao.equrysUser(user1);
                list.forEach(us -> System.out.println(us));
                System.out.println("分割线=================");
                User user2 = new User(null, "李", null, null);
                userDao = session.getMapper(IUserDao.class);
                List<User> list1=userDao.equrysUser(user2);
                list1.forEach(us -> System.out.println(us));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    @Test
    public void testSecondLevelCache() {/*一级缓存查询数据*/
            SqlSession session1 = sqlSessionFactory.openSession();//打开一个链接
            User user1 = new User(null, "李", null, null);
            IUserDao userDao = session1.getMapper(IUserDao.class);
            List<User> list=userDao.equrysUser(user1);
            list.forEach(us -> System.out.println(us));
            session1.close();// 只有session关闭的时候会把数据同步刷新到二级缓存
            System.out.println("分割线=================");
            SqlSession session2 = sqlSessionFactory.openSession();
            User user2 = new User(null, "李", null, null);
            userDao = session2.getMapper(IUserDao.class);
            List<User> list1=userDao.equrysUser(user2);
            list1.forEach(us -> System.out.println(us));
    }
}
  • session1.close();// 只有session关闭的时候会把数据同步刷新到二级缓存

0x06:mybatis有关缓存的详细说明

https://mybatis.org/mybatis-3/zh/sqlmap-xml.html#cache
mybatis官网:
https://mybatis.org/mybatis-3/zh/index.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • 在对数据库进行噼里啪啦的查询时,可能存在多次使用相同的SQL语句去查询数据库,并且结果可能还一样,这时,如果不采取...
    听风逝夜h阅读 197评论 0 0
  • 本文将阐述mybatis中的延迟加载。 1、环境约束 win10 64位操作系统 idea2018.1.5 jdk...
    张力的程序园阅读 309评论 0 0
  • 《小吴同学的Mybatis学习之路》点击此处查看完整项目 1.Mybatis_01_HelloWorld接口式编程...
    吴里庆庆阅读 325评论 0 0
  • 已经很久了,没有在我的笔下写过您,久远得我已经无法从容的说出日期,却突然从别人的文字里剥离出您,我的父亲。一时之间...
    冰暖阅读 265评论 0 3
  • 中洗拓客 新员工刚来的时候没有什么客户,就一定要勤快一点,积极一点,只要客户进门的那一刻美容师就要很热情的去接待 ...
    jl敏敏阅读 1,676评论 0 11