MyBatis复习笔记

  • #{}和${}表达式区别: 前者是预编译处理,后者是字符串替换;#{},Mybatis会将其替换为?,通过PreparedStatement设置,可以很有效防止SQL注入问题;对于${}就是变量直接替换;
  • MyBatis的二级缓存(两个HashMap):一级缓存:是sqlSession级别的缓存,缓存的是对象,默认开启;其对于一个sqlSession生命周期内的相同查询语句,会返回缓存对象;sqlSession的生命周期是指一段数据库操作到提交的一整个过程;提交之后,sqlSession也随之死亡,缓存清除;二级缓存:是Mapper-Namespace级别的缓存,因为是mapper级别的缓存,所以对于所有sqlSession共享,需要手动开启;默认1小时生命周期;
    • 读取顺序:二级->一级->数据库;当执行sql语句时,会创建一个sqlsession对象并执行,如果命中二级缓存(默认不开启),直接取出返回;如果没有执行sql,同时将查询结果放入到LoaclCache中
  • MyBatis的动态SQL:这个是MyBatis的最大的特性之一;基于OGNL表达式,来实现;Mybatis会根据特定标签,以及条件选择性的生成对应的sql语句;比如ifwherechooseforeach等等;
    • <if test="条件">:再满足条件时,才会添加标签内容;
    • <where>:sql语句的where,只有再标签内容不为空的情况下,才会生效;会自动去除无效的and或or
    • <choose> <when test=""> <otherwise> :也就是switch语句;
    • <foreach collection="list" item="item" separator="," close=")" open="(" >:循环添加语句;
    • 官方网站https://mybatis.net.cn/dynamic-sql.html
  • MyBatis的分页功能:MyBatis并没有提供分页功能(plus提供了),是依赖一个PageHelper的分页插件实现;MyBatis可以自定义插件,插件可以拦截sql,在这里可以对sql进行修改;PageHelper就是基于这个实现,通过分页信息,修改sql语句,达到分页的效果;(dialect方言,指不同数据库直接的语法差异);具体可以参考官网https://pagehelper.github.io/docs/howtouse/
  • ResultMap: 查询结果映射,可以自定义的采用key-vlaue的形式将Java实体对象的属性值与数据库字段进行一一映射;可以快速处理一对一(一个实体对象对应一个实体对象,User对应Address对象),一对多(一个实体对象对应多个实体对象,User->Order),多对多数据表关系(Student<=>Teacher;一个学生可以有多个老师,一个老师也可以有多个学生)【注意:这个关系强调的是实体对象间的关系】;
    • association标签:用于解决一对一的数据关系;可以在这里指定联表后查询到的数据结果映射;通常是主键查找;
    • collection标签:解决一对多的数据关系;这里有一个ofType属性,指定集合类型;通常是外键查找;
    • 参考官网:https://mybatis.net.cn/sqlmap-xml.html
  • ResultType:和ResultMap类似,也是用来指定实体类与数据库字段的映射关系的;如果实体类字段与数据表字段是简单一致对应的,可以直接使用ResultType直接指定;
  • 延迟加载:MyBatis再进行联表查询时,会根据需要来执行子查询,就比如Stu学生表联合Class班级表查找,如果没有调用getClassInfo(),MyBatis是不会执行ClassInfo的sql语句;【前提是,联合查询的select语句是分开的,如果是合并一起的,是无法懒加载的】
posted @ 2024-06-27 23:50  乐可乐  阅读(27)  评论(0)    收藏  举报