#{}和${}表达式区别: 前者是预编译处理,后者是字符串替换;#{},Mybatis会将其替换为?,通过PreparedStatement设置,可以很有效防止SQL注入问题;对于${}就是变量直接替换;
- MyBatis的二级缓存(两个HashMap):一级缓存:是
sqlSession级别的缓存,缓存的是对象,默认开启;其对于一个sqlSession生命周期内的相同查询语句,会返回缓存对象;sqlSession的生命周期是指一段数据库操作到提交的一整个过程;提交之后,sqlSession也随之死亡,缓存清除;二级缓存:是Mapper-Namespace级别的缓存,因为是mapper级别的缓存,所以对于所有sqlSession共享,需要手动开启;默认1小时生命周期;
- 读取顺序:二级->一级->数据库;当执行sql语句时,会创建一个sqlsession对象并执行,如果命中二级缓存(默认不开启),直接取出返回;如果没有执行sql,同时将查询结果放入到LoaclCache中
- MyBatis的动态SQL:这个是MyBatis的最大的特性之一;基于OGNL表达式,来实现;Mybatis会根据特定标签,以及条件选择性的生成对应的sql语句;比如
if,where,choose,foreach等等;
<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;一个学生可以有多个老师,一个老师也可以有多个学生)【注意:这个关系强调的是实体对象间的关系】;
- ResultType:和ResultMap类似,也是用来指定实体类与数据库字段的映射关系的;如果实体类字段与数据表字段是简单一致对应的,可以直接使用ResultType直接指定;
- 延迟加载:MyBatis再进行联表查询时,会根据需要来执行子查询,就比如Stu学生表联合Class班级表查找,如果没有调用getClassInfo(),MyBatis是不会执行ClassInfo的sql语句;【前提是,联合查询的select语句是分开的,如果是合并一起的,是无法懒加载的】
posted @
2024-06-27 23:50
乐可乐
阅读(
27)
评论()
收藏
举报