1、#{}与${}:#{}是预编译处理,会讲sql中的#{}替换为?号,调用PreparedStatement的set来赋值;${}是字符串替换,直接替换成值
*使用#{}可以有效的防止上去了注入,提高系统安全性
2、Dao接口的工作原理:JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象proxy会拦截接口方法,转而执行MappedStatement所代表的sql,然后将sql执行结果返回
3、Dao接口方法能否方法重载:不能重载,因为是全限定名+方法名的保存和寻找策略。
4、Mybatis如何分页:Mybatis使用RowBounds对象进行分页,他是针对ResultSet结果执行内存分页,而非无理分页,通常我们可以用sql内直接书写物理分页参数来完成物理分页,也可以使用分页插件来完成物理分页
5、分页插件原理:基本原理是使用Mybatis提供的插件接口,实现自定义插件,并在其拦截方法内拦截执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。
6、XML映射文件常见的标签:select|insert|update|delete|;
除此外还有:trim|where|set|foreach|if|choose|when|otherwise|bind等
7、Mybatis插件运行原理:
*可编写的插件:Mybatis仅仅可以编写针对ParameterHandler、ResultSetHandler、StatementHandler、Executor这4种接口的插件;
Mybatis使用JDK动态代理,为需要拦截的接口生成代理对象来实现接口方法拦截功能,具体就是InvocationHandler的invoke()方法,拦截那些指定的需要拦截的方法,实现Mybatis的Interceptor接口并复写intercept()方法,然后给插件编写注解,指定需要拦截的那个接口的那些方法(需要配置文件中配置自己编写的插件)
8、mybatis四大对象指的是:executor,statementHandler,parameterHandler和resultHandler对象,自定义插件拦截的四大对象。
1)、 Executor
sqlSession 首先会调用executor.query方法执行查询。
Executor有以下四种(均继承了BaseExecutor,可在spring文件bean中配置):
SimpleExecutor-简单的Executor,所有的数据库操作均委托给StatementHandler处理
BatchExecutor - 批量更新的Executor,使用jdbc的batchupdate方法,使用此Executor,需要手动执行SqlSession的flushStatements,立即执行sql。
ReuseExecutor-大体上与SimpleExecutor相同,只是根据sql缓存了jdbc的statement,遇到相同的sql时,省去了statement的创建,提高效率,但需要手动执行SqlSession的flushStatements,清除缓存
CachingExecutor - 在mapper中配置cache,对查询结果做缓存,其中缓存的key根据以下代码存数生成,建议最好不要用mybatis这个层次的缓存,一般业务层的缓存更实用,而且更容易控制
2)、StatementHandler
Executor在doQuery时生成StatementHandler对象
在MyBatis实现了statementHandler的有四个类:
RoutingStatementHandler,这是一个封装类,它不提供具体的实现,只是根据Executor的类型,创建不同的类型StatementHandler。
SimpleStatementHandler,这个类对应于JDBC的Statement对象,用于没有预编译参数的SQL的运行。
PreparedStatementHandler 这个用于预编译参数SQL的运行。
CallableStatementHandler 它将实现存储过程的调度。
statementHandler的主要方法:
prepare:编译sql
parameterize:prepare后设置参数
query/update:sql执行
基于StatementHandler对象定义的插件:
修改sql语句则在预编译SQL(prepare方法前)操作。
修改参数则在调用parameterize方法前修改逻辑。或者使用ParameterHandler来改造设置参数。
组装结果集则在query方法前后加入逻辑,或者使用ResultHandler来改造组装结果。