MyBatis级联查询和缓存

级联查询

一对一和一对多

public interface UserMapper {

    List<User> findAllUsers();

    User findUserById(int id);

    UserInfo findUserInfoById(int id);

    Order findOrderById(int id);

}
<!--
        association标签:关联一对一查询,property对应成员变量名
        seLect属性: 下一条SQL语句
        coLumn属性: 下一条SQL语句需要的参数

        在resultMap中association的property代表实体类中的属性名,
        这些属性的数据由"select"对应的sql查询而来
        所执行sql的参数由column传入

        懒加载
        fetchType="eager" 默认,调用方法就运行这条Sql
        fetchType="Lazy” 需要手动设置,被用到了才会运行sgl
    -->
    <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>
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();
    }

}

MyBatis缓存

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

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

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

一般来说缓存在内存中

一级缓存

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

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

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

清除缓存

清除缓存
sqlSession.clearCache();

二级缓存

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

二级缓存关键点

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

<configuration>
	<settings>
        <!--在控制台显示SQL语句 打印日志-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <!--<setting name="mapUnderscoreToCamelCase" value="true"/>-->
        <setting name="cacheEnabled" value="true"/>
    </settings>
</configuration>
<mapper namespace="com.jwl.mapper.UserMapper">

    <cache/>
</mapper>

最后

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值