1 什么是Mybatis?
Mybatis是一个优秀的基于java的持久层框架,内部封装了jdbc,开发者只需要关心sql语句本身,而不用花费精力去处理加载驱动,创建连接,创建statement等繁杂的过程。
mybatis通过xml或者注解方式将要执行各种statement配置起来,通过java对象和statement中的sql的动态参数映射来生成最终执行的sql,最后mybatis框架执行sql,将结果映射成java对象并返回。
2 #{}和${}的区别是什么?
${}是Properties文件中的变量占位符,它可以用于标签属性值和sql
内部,属于静态文本替换,
比如${driver}会被静态替换为com.mysql.jdbc.Driver。
,#{}是sql的参数占位符,Mybatis会将sql中的#{}替换为?号,
在sql执行前会使用PreparedStatement的参数设置方法,按序给sql
的?号占位符设置参数值,
3 Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?
还有<resultMap>,<parameterMap>,<sql>,<include>,<selectKey>,包括sql片段的9个标签<where><trim><if><when><foreach><choose><otherwise><set><bind>,其中<sql>片段标签,通过<include>引入,<selectKey>为不支持自增的主键生成策略标签。
4 最佳实践中,通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?
dao接口就是通常所说的mapper接口,接口的全限名就是映射文件namespace的值,接口的方法名就是映射文件中mappedStatement的id值,方法中的参数就是传入sql的参数。mapper接口是没有实现类的,在调用时全限名+方法名作为key可定位到唯一的mappedStatement。
在mybatis中每一个insert|select|update|delete标签都会被解析成mappedStatement对象。
dao接口的方法不能重载,因为全限名+方法名的保存和寻找策略。
dao接口的工作原理的JDK动态代理。mybatis在执行时使用jdk动态代理为dao接口创建代理对象,代理对象拦截接口方法,转而执行mappedStatement代表的sql,并返回sql执行的结果。
5 Mybatis是如何进行分页的?分页插件的原理是什么?
Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集的内存分页,而非物理分页。可以在sql中直接添加物理分页的参数来完成物理分页的功能,也可以使用分页插件。
分页插件的原理: 利用Mybatis的插件接口,自定义插件,在插件接口的拦截方法中拦截待执行的sql,重写sql,根据方言,添加相应的物理分页语句和物理分页参数。
6 简述Mybatis的插件运行原理,以及如何编写一个插件
Mybatis仅可以编写针对ParameterHandler ,ResultSetHandler,StatementHandler,Executor四种接口的插件。Mybatis使用Jdk动态代理,为接口对象生成代理对象以实现接口方法拦截功能。当执行四种接口的方法时,转而执行拦截的方法,具体就是InvocationHandler的invoke()方法。当然只会执行你指定拦截的方法。
Mybatis编写插件,只需要实现Interceptor接口并复写Intercept方法,再添加注解,指定要拦截哪一个接口的哪些方法即可。注意在配置文件中配置你的插件。
7、Mybatis执行批量插入,能返回数据库主键列表吗?
能,JDBC都能,Mybatis当然也能。
8 Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不?
Mybatis动态sql,使我们在xml映射文件中,以标签的形式添加动态sql,来完成逻辑判断和动态拼接sql的功能。提供九种标签,trim|where|if|foreach|when|otherwise|set|choose|bind
其执行原理是,使用OGNL从sql参数对象计算表达式的值,根据表达式的值来动态拼接sql,从而完成动态sql的功能。
9 Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
两种映射形式
1 利用resultMap标签,为列名和属性名一一建立映射。
2 利用sql列的别名功能,将列别名书写为对象属性名。
当列别名和对象属性名建立映射后,mybatis使用反射创建对象,并通过反射给对象属性逐一赋值并返回,那些找不到映射的属性,是无法完成赋值的。
10 Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
Mybatis 仅支持association关联对象和collection关联集合对象的延迟加载 association 就是一对一,collection是一对多。在配置文件中lazyLoadingEnables=true|false.
优点:先从单表查询,需要时再去关联表进行关联查询,大大提高了数据库性能。
原理: cglib代理。
11 Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复
namespace + id 不能完全相同。
12 Mybatis中如何执行批处理?
使用BatchExecutor完成批处理。
13 Mybatis都有哪些Executor执行器?它们之间的区别是什么?
三种基本执行器 ,SimpleExecutor,ReuseExecutor,BatchExecutor.
SimpleExecutor: 每次执行update或select 时 ,开启一个statement对象,用完后立刻关闭statement对象。
ReuseExecutor: 简言之,重复使用statement对象。
BatchExecutor: 执行update(没有select,JDBC批处理不支持select),将所有sql添加到批处理(addBatch) ,等待统一执行(executeBatch),它缓存了多个statement对象。
作用范围: Executor的以上特点,全都严格限制在sqlsession的声明周期范围内。
14 Mybatis中如何指定使用哪一种Executor执行器?
1 在配置文件中指定默认的执行器类型(ExecutorType).
2 手动在defaultSqlsessionFactory创建sqlSession的方法时传递参数。
15 Mybatis是否可以映射Enum枚举类?
可以,mybatis 可以把任何对象映射到表的一列上,方法是自定义一个typeHandler,并实现其setParameter()和getResult() 的接口方法。完成javaType与jdbcType之间的类型转换。
16 Mybatis映射文件中,如果A标签通过include引用了B标签的内容,请问,B标签能否定义在A标签的后面,还是说必须定义在A标签的前面?
可以定义在后面,A会先被标记为未解析标签。
17 简述Mybatis的Xml映射文件和Mybatis内部数据结构之间的映射关系?
mybatis会将所有的xml配置信息封装到一个All-in-one重量级对象configuration。
在xml映射文件中,parameterMap标签会被解析成parameterMap对象,它的每个子元素会被解析成parameterMapping对象。resultMap类似。每个select,insert,update,delete均会解析成MappedStatement对象,标签中的sql被解析成Boundsql对象。
18 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
Hibernate是全自动orm映射工具,使用hibernate查询关联对象和关联集合对象时,可以通过对象关系模型直接获取,而mybatis需要手动写sql来完成。
网友评论