1、动态sql
2、缓存
1、动态sql
(1)mybatis提供了OGNL表达式动态生成sql的功能
1.if,查询开发部的角色,如果输入了角色名(参数不为空)就继续模糊查询该角色信息
mapper接口
ListqueryRolesByDepartmentAndRoleName(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标签
(2)choose,when,otherwise 相当于java中的 if, else if的逻辑
mapper接口
public ListqueryUserBySexOrUserName(@Param("userName") String userName,@Param("sex") String sex);
mapper.xml
测试
@Test
public void queryUserBySexOrUserName(){
List users = userMapper.queryUserBySexOrUserName("龙","女");
users.forEach(System.out::println);
}
(3)where标签替换之前sql语句中where 1=1
(4)set标签相当于sql中 set 关键字
在实际修改时,按照用户意图从页面传过来的字符串是空也要进行修改,此处这样写是为了练习
update tb_user where id = #{id} sex = #{sex}, user_name = #{userName},
(5)foreach标签
1.参数是数组时
mapper接口
//这里的参数必须加上@Param注解,不然在mapper.xml接收时foreach标签的collection值要写为array或者arg0 public ListqueryUserByIds(@Param("ids") int[] ids);
mapper.xml
测试
@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 ListqueryUserByIdsList(@Param("ids") List ids);
mapper.xml
测试
@Test
public void queryUserByIdsList(){
//Arrays.asList()方法使用Arrays工具类创建一个List集合
List users = userMapper.queryUserByIdsList(Arrays.asList(4,5,6));
users.forEach(System.out::println);
}
(6)trim元素的主要功能是可以在自己包含的内容前加上某些前缀,也可以在其后加上某写后缀,与之对应的属性是prefix和suffix;
可以把包含内容的首部某些内容覆盖,即忽略,也可以把尾部的某些内容覆盖,对应的属性是prefixOverrides和suffixOver。
用法一
用法二
1、缓存update tb_user sex = #{sex}, user_name = #{userName},
(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。



