MyBatis(二)

开发工具与关键技术:IDEA与java语言
作者:陈鑫鹏
撰写时间:2021年8月27日

动态SQL:
MyBatis 的强大特性之一便是它的动态 SQL。动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半的元素就可以了。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。
1、if
if经常用在动态拼接查询SQL的动态条件,新增或修改的SQL的只新增或修改不为空的属性。if在MyBatis中经常使用的
1)、1、Dao层接口SysUserMapper的方法:
在这里插入图片描述

2)、SysUserMapper.xml中对应的代码:
在这里插入图片描述

3)、测试方法:
在这里插入图片描述

2、where
where 元素知道只有在一个以上的if条件有值的情况下才去插入“WHERE”子句。而且,若最后的内容是“AND”或“OR”开头的,where 元素也知道如何将他们去掉
1)、Dao层接口SysUserMapper的方法:
在这里插入图片描述

2)、SysUserMapper.xml中对应的代码:
在这里插入图片描述

3)、测试方法:
在这里插入图片描述

3、choose,when,otherwise
有些时候,我们不想用到所有的条件语句,而只想从中择其一二,针对这种情况,MyBatis提供了choose 元素,它有点像 Java 中的 switch 语句/if…else if…else。
1)、Dao层接口SysUserMapper的方法:
在这里插入图片描述

2)、SysUserMapper.xml中对应的代码:
在这里插入图片描述

3)、测试方法:
在这里插入图片描述

4、trim
trim标签一般用于去除sql语句中多余的and关键字,逗号,或者给sql语句前拼接 “where“、“set“以及“values(“ 等前缀,或者添加“)“等后缀,可用于选择性插入、更新、删除或者条件查询等操作
在这里插入图片描述

5、set
当在 update 语句中使用if标签时,如果前面的if没有执行,则或导致逗号多余错误。使用set标签可以将动态的配置 SET 关键字,并剔除追加到条件末尾的任何不相关的逗号。使用 if+set 标签修改后,如果某项为 null 则不进行更新,而是保持数据库原值
6、foreach
动态 SQL 的另外一个常用的必要操作是需要对一个集合进行遍历,通常是在构建 IN 条件语句的时候

自动映射:
在简单的场景下,MyBatis 可以为你自动映射查询结果。
当自动映射查询结果时,MyBatis 会获取结果中返回的列名并在 Java 类中查找相同名字的属性(忽略大小写)。这意味着如果发现了ID 列和id 属性,MyBatis 会将列ID 的值赋给id 属性。
通常数据库列使用大写字母组成的单词命名,单词间用下划线分隔;而 Java 属性一般遵循驼峰命名法约定。为了在这两种命名方式之间启用自动映射,需要将 mapUnderscoreToCamelCase 设置为true

MyBatis缓存
我们为什么要使用缓存呢?对于一些我们经常查询的并且不经常改变的数据,如果每次查询都要与数据库进行交互,那么大大降低了效率,因为我们使用缓存,将一些对结果影响不大且经常查询的数据存放在内存中,从而减少与数据库的交互来提高效率,这就是缓存的优势。
MyBatis缓存的分类:
①、一级缓存:同一个 SqlSession 对象,在参数和 SQL 完全一样的情况下,只执行一 次SQL 语句(前提缓存没有过期)
②、二级缓存:Mybatis的二级缓存是指mapper映射文件。二级缓存的作用域是同一个 namespace下的mapper映射文件内容,多个SqlSession共享。

1、一级缓存
同一个SqlSession对象,在参数和 SQL 完全一样的情况下,只执行一次SQL语句(前提缓存没有过期)

①、同一个SqlSession
在这里插入图片描述

在日志和输出中:
第一次查询发送了 SQL 语句, 后返回了结果;
第二次查询没有发送 SQL 语句, 直接从缓存中获取了结果。
第一次的对象和第二次的对象是相同的。

②、不同的 SqlSession
在这里插入图片描述

两次查询都从数据库中取出了数据。虽然结果相同,但是是两个不同的对象。

③、清空缓存
刷新缓存是清空这个 SqlSession 的所有缓存, 不单单是某个键
在这里插入图片描述

两次都发送了SQL语句,同时两个对象不相同。

④、一级缓存小结

  1. 同一个SqlSession中,Mybatis 会把执行的方法和参数通过算法生成缓存的键值,将键值和结果存放在一个 Map 中, 如果后续的键值一样, 则直接从 Map 中获取数据;
  2. 不同的SqlSession之间的缓存是相互隔离的
  3. 用一个SqlSession,可以通过代码或配置在查询前清空缓存
  4. insert、update、delete语句会清空缓存

2、二级缓存
二级缓存指的是mybatis中SqlSessionFactory对象的缓存,由同一个SqlSessionFactory对象创建的SqlSession共享缓存。

3、缓存使用注意事项

  1. 由于在更新时会刷新缓存,因此需要注意使用场合:查询频率很高,更新频率很低时使用,即经常使用select,相对较少使用insert,update,delete
  2. 缓存是以 namespace 为单位的,不同namespace下的操作互不影响。但刷新缓存是刷新整个namespace 的缓存,也就是你 insert,update,delete 了一个,则整个缓存都刷新了。
  3. 最好在「只有单表操作」的表的namespace使用缓存,而且对该表的操作都在这个
    namespace中。否则可能会出现数据不一致的情况。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值