Java框架-mybatis
1、什么是 MyBatis?
- mybatis是一个数据库持久化框架,是对jdbc的进一步封装。提供自定义动态sql、高级映射、sql执行拦截、缓存等功能,简化开发过程的数据库操作。
2、讲下 MyBatis 的缓存
- mybatis缓存session级别的一级缓存、以及namgspace级别的二级缓存,默认开启一级缓存。在分布式架构下,mybatis可能会导致数据不一致的情况,所以一般不开启二级缓存
3、Mybatis 是如何进行分页的?分页插件的原理是什么
- mybatis提供RowBound的分页方式,另外可以自己追加分页sql,或者编写或使用第三方分页插件。分页插件的原理是通过拦截sql执行,改写sql的进行物理分页
4、简述 Mybatis 的插件运行原理,以及如何编写一个插件?
- mybatis的插件有四种类型parameterHandler、statementHandler、executor、ResultSetHandler,在创建这四种类型的对象时通过jdk动态代理为需要拦截的接口生成动态代理对象实现拦截功能;实现mybatis的Interceptor接口并注释创建类型,然后注册到mybatis配置即可
5、Mybatis 动态 sql 是做什么的?都有哪些动态 sql?能简述一下动态 sql 的执行原理不?
- 动态sql是以xml的形式可以让开发者在xml文件中实现sql的拼接、判断的功能。有9中动态sql:trim、where、sql、set、foreach、if、choose、when、otherwise、bind;原理是使用OGNL从sql参数中计算表达式的值,再根据该值拼接sql。
6、#{}和${}的区别是什么?
#是预编译处理,$是占位符拼接
7、为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?
- 自动ORM映射可以根据对象关系模型直接获取映射、而mybatis需要开发者关注sql编写,所以并非全自动的orm
8、Mybatis 是否支持延迟加载?如果支持,它的实现原理是什么?
- mybatis支持一对一和一对多的延迟加载。原理是通过动态代理生成代理对象,当访问延迟属性的方法时,就会触发加载属性值加载
9、MyBatis 与 Hibernate 有哪些不同?
10、MyBatis 的好处是什么?
- sql抽离程序;封装jdbc细节,自动处理结果集为java对象;
11、简述 Mybatis 的 Xml 映射文件和 Mybatis 内部数据结构之间的映射关系?
- 映射文件主要包含三个类型数据:参数、sql、结果集,分别转换成parameterMapping、MappedStatement、ResultMapping对象,这些对象都保存在Configuration对象中
12、什么是 MyBatis 的接口绑定,有什么好处?
- 接口绑定是指xml或注解中的sql和java接口的方法一一对应起来,开发者可以直接使用java接口执行sql,用起来更加灵活
13、接口绑定有几种实现方式,分别是怎么实现的?
- 两种方式:一种是通过在接口方法添加注解;另外一种是通过命名空间和xml片段id进行一对一关联。
14、什么情况下用注解绑定,什么情况下用 xml 绑定?
- 简单是sql直接用注解即可,复杂的sql使用xml
15、MyBatis 实现一对一有几种方式?具体怎么操作的?
- 一对一关联可以通过join联合查询或者resultMap中进行映射的嵌套查询,其实主要工作都是在结果集处理,后者还可以实现延迟加载
17、MyBatis 里面的动态 Sql 是怎么设定的?用什么语法?
- 动态sql是通过if、else、choose、otherwise、foreach等标签设置
18、Mybatis 是如何将 sql 执行结果封装为目标对象并返回的?都有哪些映射形式?
- 结果集对象封装映射一种是通过resultMap实现属性映射创建对象、另外一种是sql的别名;mybatis可以设置驼峰下划线转换的写法,同时列名和属性名不区分大小写。返回的对象时根据这些属性映射通过反射创建对象,可以通过构造器、getset、变量名进行赋值
19、Xml 映射文件中,除了常见的 select|insert|updae|delete 标签之外,还有哪些标签?
- sql、if、else、foreach、choose、incloude
20、当实体类中的属性名和表中的字段名不一样,如果将查询的结果封装到指定 pojo?
- sql别名、resultMap映射匹配、pojo添加set方法
21、模糊查询 like 语句该怎么写
- sql拼接;java拼接通配符
22、通常一个 Xml 映射文件,都会写一个 Dao 接口与之对应, Dao 的工作原理,是否可以重载?
- 不能重载;sql的id是等于全类名+方法名,重载会出现重复。接口原理是通过jdk动态代理生成代理对象、在对里对象中根据id执行相应的sql
23、Mybatis 映射文件中,如果 A 标签通过 include 引用了 B 标签的内容,请问,B 标签能否定义在 A 标签的后面,还是说必须定义在 A 标签的前面?
- 可以,不分顺序;解析标签是若遇到还没未定义的标签,则会被标记,待第一遍解析结束后在处理被标记的标签
24、Mybatis 的 Xml 映射文件中,不同的 Xml 映射文件,id 是否可以重复?
- 若有namespace,则可以重复
25、Mybatis 中如何执行批处理?
- 使用BatchExecutor执行,执行原理是使用prepare处理,执行sql执行一次时,先不提交持有这个对象,等处理完了,在提交。
26、Mybatis 都有哪些 Executor 执行器?它们之间的区别是什么?
- 有三种,SimpleExecutor、ResumeExecutor、BatchExecutor;simple每次执行sql都创建statement,Resume以sql作为key可以重用statement,Batch则是支持批量处理
27、Mybatis 中如何指定使用哪一种 Executor 执行器?
- 配置文件指定全局ExecutorType;创建sqlSession是指定ExecutorType
28、Mybatis 执行批量插入,能返回数据库主键列表吗?
- 可以返回,jdbc支持
29、Mybatis 是否可以映射 Enum 枚举类?
- 可以,通过typeHandler可以实现java对象到sql列的映射
30、如何获取自动生成的(主)键值?
- 配置文件设置 useGeneratedKeys 为 true
31、在 mapper 中如何传递多个参数?
- 接口方法中定义多个参数,sql中使用#、$获取;使用param注解
32、resultType resultMap 的区别?
- resultType是自动的类型映射、resultMap是手动指定的结果集映射。其实最终都是生成属性映射