常用组件
[toc]
常用组件
1. mybatis
1.1 ${}
和#{}
的区别
${}
: 属于静态文本替换, 将${}
替换为变量值,存在SQL注入安全问题#{}
: sql参数占位符, 会将#{}
替换为?, sql执行前会使用PreparedStatement设置方法,按序给sql的?占位符设置参数值
1.2 常用标签
select
,insert
,update
,delete
,resultMap
,parameterMap
,sql
,include
,selectKey
,trim
,where
,set
,foreach
,if
,choose
,when
,otherwise
,bind
等
1.3 参数不同时, 方法能否重载
Mapper接口通过接口多的全限定名加接口的方法名拼接作为key值, 去查找XML中namespace加id拼接的对象.
mybatis dao可以有多个重载方法, 但是mybatis接口对应的隐射只有一个
dao方法重载时,需要满足以下条件:
- 仅有一个无参方法和一个有参方法
- 多个有参方法时, 参数数量必须一致, 且使用相同的@Param, 或者使用
param1
这种
1.3 分页
- 使用RowBounds对象分页, 针对ResultSet结果集执行内存分页.
- 使用sql编写物理分页参数完成物理分页
- 使用分页插件来完成分页. (分页插件原理: 利用Mybatis提供接口, 实现自定义插件, 在拦截方法内拦截待执行的sql, 重写sql, 根据方言, 添加对应的物理分页语句和物理分页参数)
1.4 插件实现
仅针对ParameterHandler
, ResultSetHandler
, StatementHandler
,Executor
4种接口插件, mybatis使用JDK动态代理, 为需要拦截的接口生成代理对象以实现接口方法拦截功能. 没当执行这4种接口对象的方法时, 就会进入拦截方法. 具体时InvocationHandler
的invoke()方法. 实现Interceptor接口并复写intercept()
方法
1.5 如何封装结果并返沪
- 使用resultMap标签, 列名和对象属性名之间映射
- 使用sql列别名功能, 根据返回别名匹配对象属性名, 不分区大小写
列民, 属性名映射后, 反射创建对象,并给对象属性一一赋值并返回,找不到映射关系属性,无法赋值
1.6 延迟加载原理
支持association关联对象(一对一)和collection(一对多), 在配置文件中, 配置是否启用延迟加载lazyLoadingEnable=true/false
使用CGLIB创建目标对象的代理对象, 当调用目标方法时, 进入拦截器方法, 调用事先定义的关联查询sql,查询出结果后, 就有值了.
1.7 Executor执行器种类
SimpleExecutor: 每执行一次update或者delete, 开启一个Statement对象, 用完立即关闭Statement对象
ReuseExecutor: 执行update或者delete, 用sql作为key查找Statement, 存在就使用, 不存在就创建, 使用完后, 不关闭Statement对象, 而是缓存供下一次使用, 重复使用Statement对象
BatchExecutor: 执行update, 将所有sql都添加到批处理中(addBatch()), 等待统一执行(executeBatch()), 缓存多个Statement对象, 每个Statement对象都是addBatch完毕后, 等待逐一执行executeBatch()
在mybatis配置文件中, 指定默认ExecutorType
1.8 include处理
标签定义可以在任何地方.
当解析到A依赖B标签, 而B还未解析到, 则将A设置为未解析状态, 继续解析剩余标签. 待所有标签解析完毕, 重新解析标记为未解析标签. 此时再解析A标签时, B已解析, A就可以正常解析了
1.9 XML映射文件与内部数据结构
- 所有配置信息都被封装到Configuration内部,
- 映射文件中
<paramterMap>
解析未ParameterMap对象, 子元素会被解析为ParameterMapping对象 <resultMap>
解析为ResultMap对象, 每个子元素解析为ResultMapping对象<select>
,<insert>
,<update>
,<delete>
会被解析为MappedStatement对象, 内部sql会被解析为BoundSql对象