栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

学习日志day55(2021-09-26)(1、动态sql 2、缓存)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

学习日志day55(2021-09-26)(1、动态sql 2、缓存)

学习内容:学习MyBatis框架(Day55)

1、动态sql
2、缓存


1、动态sql

(1)mybatis提供了OGNL表达式动态生成sql的功能
1.if,查询开发部的角色,如果输入了角色名(参数不为空)就继续模糊查询该角色信息
mapper接口

List queryRolesByDepartmentAndRoleName(String RoleName);

mapper.xml


    
    



    select * from tb_role where department = '开发部'
    
    
        and role_name like #{RoleName}
    

测试

@Test
public void queryRolesByDepartmentAndRoleName(){
    List roleList = roleMapper.queryRolesByDepartmentAndRoleName("%者%");
    roleList.forEach(System.out::println);
}

2.可以使用多个if标签


    select * from tb_user where 1=1
    
        
        
            and sex = #{sex}
        
        
            and user_name like concat('%',#{userName},'%')
        
        
        
    

测试

@Test
public void queryUserBySexOrUserName(){
    List users = userMapper.queryUserBySexOrUserName("龙","女");
    users.forEach(System.out::println);
}

(3)where标签替换之前sql语句中where 1=1


    select * from tb_user where id in
    
    
        #{id}
    

测试

@Test
public void queryUserByIds(){
    List users = userMapper.queryUserByIds(new int[]{4,5,6});
    users.forEach(System.out::println);
}

2.参数是集合时
mapper接口

 //这里的参数必须加上@Param注解,不然在mapper.xml接收时foreach标签的collection值要写为arg0或list或collection
public List queryUserByIdsList(@Param("ids") List ids);

mapper.xml


    select * from tb_user
    
        
            and sex = #{sex}
        
        
            and user_name like concat('%',#{userName},'%')
        
    

用法二


    update tb_user
    
        
            sex = #{sex},
        
        
            user_name = #{userName},
        
    
1、缓存

(1)Mybatis的一级缓存的作用域是session,当openSession()后, 如果执行相同的SQL (相同语句和参数),Mybatis不进行执行SQL,而是从缓存中命中返回。
原理:Mybatis执行查询时首先去缓存区命中,如果命中直接返回,没有命中则执行SQL,从数据库中查询。
在mybatis中,一级缓存默认是开启的,并且一直无法关闭(我们没法去管理一级缓存)
一级缓存满足条件:1.同一个session中 2.相同的SQL和参数。
sqlSession.clearCache();用来清空缓存

@Test
public void queryUserByIds(){
    //会发送sql语句,到数据库中查询
    List users = userMapper.queryUserByIds(new int[]{4,5,6});
    users.forEach(System.out::println);
    sqlSession.clearCache();//清空缓存
    //不发送sql语句,但会从缓存中读取数据,缓存中没有再发送sql语句去数据库查询
    List users2 = userMapper.queryUserByIds(new int[]{4,5,6});
    users.forEach(System.out::println);
}

执行update,delete,insert语句的时候 都会清空缓存 然后刷新

(2)mybatis 的二级缓存的作用域是一个mapper的namespace ,同一个namespace中查询sql可以从缓存中命中。二级缓存是跨session的。
在mapper.xml文件中的mapper元素中第一行添加

需要将实体类序列化

public class User implements Serializable {
    private Integer id;
    private String userName;
    private String sex;
}

测试

@Test //测试方法
public void queryUserByLike() {
    List users = userMapper.queryUserByLike("龙","");
    users.forEach(System.out::println);
    
    sqlSession.close();//sqlSession关闭
    sqlSession = sqlSessionFactory.openSession();//开启新的sqlSession
    userMapper = sqlSession.getMapper(UserMapper.class);
    List users2 = userMapper.queryUserByLike("龙","");//会从二级缓存中命中
    users2.forEach(System.out::println);
}

在全局的mybatis-config.xml 中去关闭二级缓存


    

二级缓存cache元素的一些属性

这个更高级的配置创建了一个FIFO(先进先出)缓存并每隔60秒刷新,存数结果对象或列表的512个引用,而且返回的对象被认为是只读的,因此在不同线程中的调用者之间修改它们会导致冲突。

可用的收回策略有:
●LRU -最近最少使用的:移除最长时间不被使用的对象。
●FIFO -先进先出:按对象进入缓存的顺序来移除它们。
●SOFT -软引用:移除基于垃圾回收器状态和软引用规则的对象。
●WEAR -弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
默认是LRU。

fushInterval(刷新间隔)可以被设置为任意的正整数,而且它们代表一个合理的毫秒形式的时间段。默认情况是不设置也就是没有刷新间隔缓存仅仅调用语句时刷新。
size(引用数目可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的可用内存资源数目。默认值是1024。
readonly(只读)属性可以被设置为true或false。只读的缓存会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存会返回缓存对象的拷贝(通过序列化)。这会慢-一些,但是安全,因此默认是false。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/271878.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号