1、Mybatis
1.1#{}和${}的区别是什么?
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
Mybatis在处理 0 时,就是把 0时,就是把 0时,就是把{}替换成变量的值。
有了#{}为什么还需要${}?
#{}会被预编译处理,可以有效的防止SQL注入,提高系统安全性。
对于需要动态构建SQL的场景 , 比如条件查询,${}可以用来拼接SQL片段 , 构建动态的表名、列名等。
1.2 Mybatis和ORM(Object Relation Mapping hibernate(jpa)区别
mybatis和hibernate都同处于持久层的框架。
mybatis是粗粒度的封装
hibernate是细粒度的封装
Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBG,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程,直接编写原生态sql
Hibernate对象/关系映射能力强,让使用者直接面向对象编程,不用关心sql
1.3 Mybatis怎么封装动态SQL(常见的动态sql的标签)
Mybatis提供了9种动态sql标签: where | set foreach | if | choose| when | otherwise|trim
1.4 Mybatis怎么实现分页 (利用插件pagehelper)
分页插件原理:使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sqI,然后重写sql,添加对应的物理分页语句和物理分页参数
1.5 插件原理
在MyBatis中插件是通过拦截器来实现的,那么既然是通过拦截器来实现的,就会有一个问题,哪些对象才允许被拦截呢?
四大对象:Executor , StatementHandler,ParameterHandler,ResultSetHandler
Mybatis只能针对上面的四大对象进行拦截
上面4个创建好之后并没有直接返回,而是都调用executor = interceptorChain.pluginAll(executor);
将上面4个对象都放到pluginAll 做了一个处理,又返回了一个该对象
里面用了对原对象进行的动态代理,代理的时候,加入了拦截器的执行
但是并不是这四大对象中的所有方法都能被拦截,下面就是官网提供的可拦截的对象和方法汇总: