映射器:接口+xml文件(或注解)。
在映射器中可以配置参数,各类的SQL语句,存储过程,缓存,联级等,并通过建议的映射规则指定的POJO或者其他对象上。
虽然映射器可以用注解完成,但是应用不广,原因有3:
1.面对复杂性,SQL会显得无力,尤其长SQL
2.注解的可读性较差
3.功能上,求是了xml上下文相互引用的功能
一.映射器的四种引入方式
1.用文件路径引入映射器
2.用包名引入映射器
3.用类注册引入映射器
4.用userMapper.xml引入映射器
二.映射器配置元素
select | 查询语句 | 可自定义参数,返回结果集等 |
insert | 插入语句 | 执行后返回整数,代表插入的条数 |
update | 更新语句 | 执行后返回整数,代表更新的条数 |
delete | 删除语句 | 执行后返回整数,代表删除的条数 |
sql | 定义一部分SQL,其他地方引用 | 复用 |
resultMap | 用来描述家在对象 | 提供映射规则 |
cache | 给定命名空间的缓存配置 | |
cache-ref | 其他命名空间缓存配置的引用 |
三.select
常用的有id,parameterType,resultType,resultMap,缓存flushCache,useCache
四.insert
主键回填(userGeneratedKeys="true" keyProperty="用来匹配主键的属性")
insert into t_role(role_name,note) values(#{roleName},#{note})
自定义主键(selectKey元素),例:角色表为空,id=1;角色表不为空,id=id+3
select if (max(id))=null,1,max(id)+3) from t_role
insert into t_role(id,role_name,note) values(${id},#{roleName},#{note})
五.update
执行完返回整数,表示影响的数量
六.delete
执行完返回整数,表示影响的数量
七.sql
定义一条SQL的一部分,方便其他SQL引用,代码复用。例如:列名
id,name,addr,age
八.resultMap
resultMap定义映射规则,级联的更新,定制类型转换器等。但是目前Mybatis只支持resultMap的查询,不支持更新,保存,级联。
(一)级联
级联分为三种,一对一,一对多,鉴别器。级联不是必须的,好处:获取关联数据方便快捷;缺点:级联过多会增加系统的复杂度,降低性能。当级联超过3层,就不使用级联!
<--一对一级联
task和另一张表task_id级联
-->
<--一对多级联
employeeTaskList表和另一张表的task_id级联
-->
<--鉴别器
column代表使用哪个字段进行鉴别
-->
(二)级联的N+1问题
N+1:现有N个关系完成级联,再加一个关联关系,成了N+1,所有都被执行,但是有很多不需要的被查找,造成浪费、
延迟加载:一次性把常用的级联查询出来,不常用的级联数据不查找,等需要时再取出
---------------------
部分引用:https://blog.csdn.net/Malsako/article/details/78252104