
级联
级联主要用于获取存在关联关系的数据,级联过多会增加系统复杂度、同时降低系统性能,导致系统耦合、复杂和难以维护。
mybatis中的级联分为三种:
鉴别器(discriminator):根据条件决定采用具体实现类级联的方案。
一对一(association)
一对多(collection)
mybatis中没有多对多级联,通过两个一对多级联进行替换。
一对一(association)及一对多(collection)
| 配置属性 | 作用 |
| property | 映射至pojo的哪个属性上 |
| column | 数据库列名 |
| select | 命名空间+SQL ID的方式,指向对应映射器的执行SQL |
鉴别器(discriminator)
| 配置属性 | 作用 |
| column | 根据哪个字段的值进行鉴别 |
| case | 鉴别条件 |
| value | 鉴别值 |
| resultMap | 使用哪个resultMap进行结果映射 |
N+1问题
在配置了级联后,对所有的级联项配置相关数据进行查询。在我们执行查询时,将我们不需要关注的数据同时进行了关联查询,执行了多条无关的无意义的查询SQL,导致数据库资源损耗和系统性能下降。通常通过延迟加载功能来解决N+1问题。
延迟加载
我们希望一次性把常用的级联数据通过SQL直接查询出来,对于不常用的级联数据不要取出,等待使用时进行取出,这些不常用的数据可采用延迟加载功能。
| 配置项 | 作用 | 配置项值 | 默认值 |
| lazyLoadingEnabled | 延迟加载全局开关。开启(true),所有关联对象延迟加载。可通过设置fetchType覆盖该配置项 | true|false | false |
| aggressiveLazyLoading | 启用时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载,反之按需加载 | true|false | 3.4.1之前true;之后false |
缓存
mybatis中缓存分为一级缓存和二级缓存。
| 名称 | 作用域 | 配置 |
| 一级缓存 | SqlSession | 无需配置,默认开启 |
| 二级缓存 | SqlSessionFactory | 映射器中配置<cache/> |
二级缓存配置项
| 配置属性 | 作用 | 配置值/默认值 |
| blocking | 是否使用阻塞性缓存 | true|false/false |
| readOnly | 缓存内容是否只读 | true|false/false |
| eviction | 缓存策略,分为: LRU:移除最长时间不被使用对象 FIFO:按对象进入缓存顺序移除 SOFT:移除基于垃圾回收器状态和软引用规则的对象 WEAK:更积极移除基于垃圾回收器状态和弱引用规则的对象 | LRU |
| flushInterval | 缓存刷新时间,只有在执行写操作时有效 | 正整数 |
| type | 自定义缓存类 | |
| size | 缓存对象个数 | 默认1024 |
存储过程
存储过程在数据库中预编译好,具备性能高、可重复使用的特性。存储过程中定义了三种类型的参数:输入参数、输出参数、输入输出参数。
| 参数类型 | 参数作用 |
| 输入参数 | 程序输入到存储过程的参数 |
| 输出参数 | 存储过程经过计算返回给程序的结果参数 |
| 输入输出参数 | 一开始作为输入参数传递给存储过程、经过计算后由存储过程返回的参数 |
存储过程配置与调用
select元素中将statementType值设置为CALLABLE,parameterType可以为存储过程参数自定义Pojo。
调用存储过程中放入对应参数及属性,在属性上通过设置mode属性值设置该参数为输入|输出参数;指定对应的jdbcType设置数据类型,mybatis找对应的typeHandler进行对应的数据类型转换工作。




