文章目录
- 前言
- [一、MyBatis 与 Hibernate 有哪些不同?](#一、MyBatis 与 Hibernate 有哪些不同?)
- [二、MyBatis 的好处是什么?](#二、MyBatis 的好处是什么?)
- [三、简述 Mybatis 的 Xml 映射文件和 Mybatis 内部数据结构之间的映射关系?](#三、简述 Mybatis 的 Xml 映射文件和 Mybatis 内部数据结构之间的映射关系?)
- [四、什么是 MyBatis 的接口绑定,有什么好处?](#四、什么是 MyBatis 的接口绑定,有什么好处?)
- 五、接口绑定有几种实现方式,分别是怎么实现的?
- [六、什么情况下用注解绑定,什么情况下用 xml 绑定?](#六、什么情况下用注解绑定,什么情况下用 xml 绑定?)
- [七、MyBatis 实现一对一有几种方式?具体怎么操作的?](#七、MyBatis 实现一对一有几种方式?具体怎么操作的?)
- [八、Mybatis 能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别?](#八、Mybatis 能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别?)
- [九、MyBatis 里面的动态 Sql 是怎么设定的?用什么语法?](#九、MyBatis 里面的动态 Sql 是怎么设定的?用什么语法?)
- [十、Mybatis 是如何将 sql 执行结果封装为目标对象并返回的?都有哪些映射形式?](#十、Mybatis 是如何将 sql 执行结果封装为目标对象并返回的?都有哪些映射形式?)
- 总结
前言
- MyBatis 与 Hibernate 有哪些不同?
- MyBatis 的好处是什么?
- 简述 Mybatis 的 Xml 映射文件和 Mybatis 内部数据结构之间的映射关系?
- 什么是 MyBatis 的接口绑定,有什么好处?
- 接口绑定有几种实现方式,分别是怎么实现的?
- 什么情况下用注解绑定,什么情况下用 xml 绑定?
- MyBatis 实现一对一有几种方式?具体怎么操作的?
- Mybatis 能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别?
- MyBatis 里面的动态 Sql 是怎么设定的?用什么语法?
- Mybatis 是如何将 sql 执行结果封装为目标对象并返回的?都有哪些映射形式?
一、MyBatis 与 Hibernate 有哪些不同?
答:
- Mybatis 和 hibernate 不同,它不完全是一个 ORM 框架,因为 MyBatis 需要程序员自己编写 Sql 语句,不过 mybatis 可以通过 XML 或注解方式灵活配置要运行的 sql 语句,并将java 对象和 sql 语句映射生成最终执行的 sql,最后将 sql 执行的结果再映射生成 java 对象。
- Mybatis 学习门槛低,简单易学,程序员直接编写原生态 sql,可严格控制 sql 执行性
能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是 mybatis 无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套 sql 映射文件,工作量大。 - Hibernate 对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用 hibernate 开发可以节省很多代码,提高效率。但是Hibernate 的缺点是学习门槛高,要精通门槛更高,而且怎么设计 O/R 映射,在性能和对象模型之间如何权衡,以及怎样用好 Hibernate 需要具有很强的经验和能力才行。
总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。
二、MyBatis 的好处是什么?
- MyBatis 把 sql 语句从 Java 源程序中独立出来,放在单独的 XML 文件中编写,给程序的维护带来了很大便利。
- MyBatis 封装了底层 JDBC API 的调用细节,并能自动将结果集转换成 Java Bean 对象,大大简化了 Java 数据库编程的重复工作。
- 因为 MyBatis 需要程序员自己去编写 sql 语句,程序员可以结合数据库自身的特点灵活控制 sql 语句,因此能够实现比 Hibernate 等全自动 orm 框架更高的查询效率,能够完成复杂查询。
三、简述 Mybatis 的 Xml 映射文件和 Mybatis 内部数据结构之间的映射关系?
- Mybatis 将所有 Xml 配置信息都封装到 All-In-One 重量级对象 Configuration 内部。在Xml 映射文件中,parameterMap标签会被解析为 ParameterMap 对象,其每个子元素会被解析为 ParameterMapping 对象。resultMap标签会被解析为 ResultMap 对象,其每个子元素会被解析为 ResultMapping 对象。每一个select、insert、update、delete标签均会被解析为 MappedStatement 对象,标签内的 sql 会被解析为 BoundSql 对象。
四、什么是 MyBatis 的接口绑定,有什么好处?
答:接口映射就是在 MyBatis 中任意定义接口,然后把接口里面的方法和 SQL 语句绑定,我们直接调用接口方法就可以,这样比起原来了 SqlSession 提供的方法我们可以有更加灵活的选择和设置.
五、接口绑定有几种实现方式,分别是怎么实现的?
答:接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面加上
@Select@Update 等注解里面包含 Sql 语句来绑定,另外一种就是通过 xml 里面写 SQL 来绑定,在这种情况下,要指定 xml 映射文件里面的 namespace 必须为接口的全路径名.
六、什么情况下用注解绑定,什么情况下用 xml 绑定?
答:当 Sql 语句比较简单时候,用注解绑定;当 SQL 语句比较复杂时候,用 xml 绑定,一般用xml 绑定的比较多
七、MyBatis 实现一对一有几种方式?具体怎么操作的?
答:有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次,通过在 resultMap 里面配置 association 节点配置一对一的类就可以完成;嵌套查询是先查一个表,根据这个表里面的结果的外键 id,去再另外一个表里面查询数据,也是通过 association 配置,但另外一个表的查询通过 select 属性配置。
八、Mybatis 能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别?
答:能,Mybatis 不仅可以执行一对一、一对多的关联查询,还可以执行多对一,多对多的关联查询,多对一查询,其实就是一对一查询,只需要把 selectOne()修改为 selectList()即可;多对多查询,其实就是一对多查询,只需要把 selectOne()修改为 selectList()即可。
关联对象查询,有两种实现方式,一种是单独发送一个 sql 去查询关联对象,赋给主对
象,然后返回主对象。另一种是使用嵌套查询,嵌套查询的含义为使用 join 查询,一部分
列是 A 对象的属性值,另外一部分列是关联对象 B 的属性值,好处是只发一个 sql 查询,
就可以把主对象和其关联对象查出来。
九、MyBatis 里面的动态 Sql 是怎么设定的?用什么语法?
答:MyBatis 里面的动态 Sql 一般是通过 if 节点来实现,通过 OGNL 语法来实现,但是如果要写的完整,必须配合 where,trim 节点,where 节点是判断包含节点有内容就插入 where,否则不插入,trim 节点是用来判断如果动态语句是以 and 或 or 开始,那么会自动把这个 and 或者 or取掉。
十、Mybatis 是如何将 sql 执行结果封装为目标对象并返回的?都有哪些映射形式?
答:
第一种是使用resultMap标签,逐一定义列名和对象属性名之间的映射关系。
第二种是使用 sql 列的别名功能,将列别名书写为对象属性名,比如 T_NAME AS NAME,对象属性名一般是 name,小写,但是列名不区分大小写,Mybatis 会忽略列名大小写,智能找到与之对应对象属性名,你甚至可以写成 T_NAME AS NaMe,Mybatis 一样可以正常工作。
有了列名与属性名的映射关系后,Mybatis 通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。
总结
- MyBatis 与 Hibernate 有哪些不同?
- MyBatis 的好处是什么?
- 简述 Mybatis 的 Xml 映射文件和 Mybatis 内部数据结构之间的映射关系?
- 什么是 MyBatis 的接口绑定,有什么好处?
- 接口绑定有几种实现方式,分别是怎么实现的?
- 什么情况下用注解绑定,什么情况下用 xml 绑定?
- MyBatis 实现一对一有几种方式?具体怎么操作的?
- Mybatis 能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别?
- MyBatis 里面的动态 Sql 是怎么设定的?用什么语法?
- Mybatis 是如何将 sql 执行结果封装为目标对象并返回的?都有哪些映射形式?