• MyBatis级联查询和缓存


    级联查询

    一对一和一对多

    public interface UserMapper {
    
        List<User> findAllUsers();
    
        User findUserById(int id);
    
        UserInfo findUserInfoById(int id);
    
        Order findOrderById(int id);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    
        <resultMap id="UserMap" type="User">
            <id column="id" property="id" />
            <result column="username" property="username" />
            <result column="birthday" property="birthday" />
            <result column="sex" property="sex" />
            <result column="address" property="address" />
            <association property="info" select="findUserInfoById" column="id" fetchType="eager"/>
            <collection property="order" select="findOrderById" column="id" fetchType="lazy"/>
        resultMap>
    
        <resultMap id="OrderMap" type="Order">
            <id column="oid" property="oId"/>
            <result column="user_id" property="userId"/>
            <result column="create_time" property="createTime"/>
        resultMap>
    
        <select id="findUserById" resultMap="UserMap">
            select * from user where id = #{id};
        select>
    
        <select id="findUserInfoById" resultType="com.jwl.pojo.UserInfo">
            select * from user_info where id = #{id};
        select>
    
        <select id="findOrderById"  resultMap="OrderMap">
            select * from tb_order where user_id = #{id};
        select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    public class TestStore {
        @Test
        public void test1() throws IOException {
    
            SqlSession sqlSession = MyBatisUtil.getSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            User userById = mapper.findUserById(1);
            System.out.println(userById);
            sqlSession.commit();
            //关闭资源,只需要关闭sqlSession
            sqlSession.close();
        }
    
        @Test
        public void test2() throws IOException {
    
            SqlSession sqlSession = MyBatisUtil.getSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            User user = mapper.findUserById(1);
            System.out.println(user);
            sqlSession.commit();
            //关闭资源,只需要关闭sqlSession
            sqlSession.close();
        }
    
        @Test
        public void test3() throws IOException {
            //懒加载
            SqlSession sqlSession = MyBatisUtil.getSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            User user = mapper.findUserById(1);
            System.out.println(user.getUsername());
            System.out.println("------------------");
            user.getOrder().forEach(System.out::println);
            sqlSession.commit();
            //关闭资源,只需要关闭sqlSession
            sqlSession.close();
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    MyBatis缓存

    现在我们每次执行相同的SQL语句都是去数据库中查询,存在效率问题。

    MyBatis框架提供了缓存策略,通过缓存策略可以减少查询数据库的次数,提升系统性能。

    在MyBatis框架中缓存分为一级缓存和二级缓存。

    一般来说缓存在内存中

    一级缓存

    一级缓存是sqlSession范围的缓存,只能在同一个sqlSession内部有效。它本身已经存在,一级缓存不需要手动处理,可以直接使用。

    第一次查询数据时,会将查询的数据放入一级缓存中。后面的相同查询直接从缓存中获取。

    一级缓存是 SqlSession 范围缓存。当调用 SqlSession 的修改、添加、删除、提交、关闭等方法时,一级缓存会被清空。

    清除缓存

    清除缓存
    sqlSession.clearCache();

    二级缓存

    二级缓存是mapper映射级别缓存,作用范围跨越SqlSession,即可以在多个SqlSession之间共享二级缓存数据。

    二级缓存关键点

    1.实体类需要实现Serializable接口
    2.在myBatis全局配置文件中配置
    3.在mapper.xml文件中配置

    <configuration>
    	<settings>
            
            <setting name="logImpl" value="STDOUT_LOGGING"/>
            
            <setting name="cacheEnabled" value="true"/>
        settings>
    configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    <mapper namespace="com.jwl.mapper.UserMapper">
    
        <cache/>
    mapper>
    
    • 1
    • 2
    • 3
    • 4

    最后

    如果你对本文有疑问,你可以在文章下方对我留言,敬请指正,对于每个留言我都会认真查看。

  • 相关阅读:
    排序:败者树和置换选择排序(解决外部排序中的优化问题)
    LabVIEW异步和同步通信详细分析及比较
    二叉树的中序遍历三种解法(递归+迭代+线索化)
    docker-MySQL 8 主从搭建
    每日刷题记录 (三十一)
    java毕业设计宠物咖啡馆平台系统mybatis+源码+调试部署+系统+数据库+lw
    虚拟机安装openEuler/MobaXterm工具登录系统
    最长偶串的长度
    Java I/O在Android中应用
    Docker(八)—— Dockerfile制作Tomcat镜像
  • 原文地址:https://blog.csdn.net/weixin_47543906/article/details/128069143