开发工具与关键技术: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语句,同时两个对象不相同。
④、一级缓存小结
- 同一个SqlSession中,Mybatis 会把执行的方法和参数通过算法生成缓存的键值,将键值和结果存放在一个 Map 中, 如果后续的键值一样, 则直接从 Map 中获取数据;
- 不同的SqlSession之间的缓存是相互隔离的
- 用一个SqlSession,可以通过代码或配置在查询前清空缓存
- insert、update、delete语句会清空缓存
2、二级缓存
二级缓存指的是mybatis中SqlSessionFactory对象的缓存,由同一个SqlSessionFactory对象创建的SqlSession共享缓存。
3、缓存使用注意事项
- 由于在更新时会刷新缓存,因此需要注意使用场合:查询频率很高,更新频率很低时使用,即经常使用select,相对较少使用insert,update,delete
- 缓存是以 namespace 为单位的,不同namespace下的操作互不影响。但刷新缓存是刷新整个namespace 的缓存,也就是你 insert,update,delete 了一个,则整个缓存都刷新了。
- 最好在「只有单表操作」的表的namespace使用缓存,而且对该表的操作都在这个
namespace中。否则可能会出现数据不一致的情况。