【Mybatis面试常问的知识<2>ORM概念?Mybatis和Hibernate区别?全自动半自动区别?mapper文件中如何传递多个参数?模糊查询实现方式?SQL语句预编译?动态SQL?标签?】

知识回顾: 上次我们分享了关于mybatis的一些面试题目【Mybatis面试常问的知识<1>MyBatis编程步骤?框架适用场景?Mybatis是如何进行分页的?分页插件的原理是什么? Mybatis的Xml映射文件中,接口绑定等等】,接下来我们继续来学习关于mybatis的一些面试题目。

ORM框架是什么?

ORM(Object Relational Mapping),对象关系映射,是一种为了解决关系型数据库数 据与简单Java对象(POJO)的映射关系的技术。简单的说,ORM是通过使用描述对象和 数据库之间映射的元数据,将程序中的对象自动持久化到关系型数据库中。

Hibernate 和 MyBatis 的区别

相同点

都是ORM框架,都是对jdbc的封装,都是持久层的框架,都用于dao层的开发。

不同点

1.映射关系

MyBatis 是一个半自动映射的框架,配置Java对象与sql语句执行结果的对应关系,多表关联关系配置简单

Hibernate 是一个全表映射的框架,配置Java对象与数据库表的对应关系,多表关联关系配置复杂

2.SQL优化和移植性

Hibernate 对SQL语句封装,提供了日志、缓存、级联(级联比 MyBatis 强大)等特性, 此外还提供 HQL(Hibernate Query Language)操作数据库,数据库无关性支持好,但会多消耗性能。如果项目需要支持多种数据库,代码开发量少,但SQL语句优化困难。

MyBatis 需要手动编写 SQL,支持动态 SQL、处理列表、动态生成表名、支持存储过程。 开发工作量相对大些。直接使用SQL语句操作数据库,不支持数据库无关性,但sql语句优化容易。

3.开发难易程度和学习成本

Hibernate 是重量级框架,学习使用门槛高,适合于需求相对稳定,中小型的项目

MyBatis 是轻量级框架,学习使用门槛低,适合于需求变化频繁,大型的项目

半自动框架Mybatis与全自动框架Hibernate的区别在哪里?

Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时, 可以根据对象关系模型直接获取,所以它是全自动的。

而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。

在mapper中如何传递多个参数?

方法1:顺序传参法

public User selectUser(String name, int deptId);

​ #{}里面的数字代表传入参数的顺序。 ​ 这种方法不建议使用,sql层表达不直观,且一旦顺序调整容易出错。

方法2:@Param注解传参法

public User selectUser(@Param("userName") String name, int @Param("deptId") deptId);

​ #{}里面的名称对应的是注解@Param括号里面修饰的名称。 ​ 这种方法在参数不多的情况还是比较直观的,推荐使用。

方法3:Map传参法

public User selectUser(Map params);

​ #{}里面的名称对应的是Map里面的key名称。 ​ 这种方法适合传递多个参数,且参数易变能灵活传递的情况。

方法4:Java Bean传参法

public User selectUser(User user);

​ #{}里面的名称对应的是User类里面的成员属性。 ​ 这种方法直观,需要建一个实体类,扩展不容易,需要加属性,但代码可读性强,业务逻辑 处理方便,推荐使用。

模糊查询的like语句有几种实现方式?

‘%${question}%’ 可能引起SQL注入,不推荐“%”#{question}“%” 注意:因为#{…}解析成sql语句时候,会在变量外侧自动加单引 号’',所以这里 % 需要使用双引号" ",不能使用单引号 ‘’,不然会查不到任何结果。CONCAT(‘%’,#{question},‘%’) 使用CONCAT()函数,推荐使用使用bind标签

SQL语句为什么需要预编译?

JDBC 中使用对象 PreparedStatement 来抽象预编译语句,使用预编译。预编译阶段可以 优化 SQL 的执行。预编译之后的 SQL 多数情况下可以直接执行,DBMS 不需要再次编 译,越复杂的SQL,编译的复杂度将越大,预编译阶段可以合并多次操作为一个操作。同时 预编译语句对象可以重复利用。把一个 SQL 预编译后产生的 PreparedStatement 对象缓 存下来,下次对于同一个SQL,可以直接使用这个缓存的 PreparedState 对象。Mybatis 默认情况下,将对所有的 SQL 进行预编译。

Mybatis中的xml文件中,除了insert、update、delete、select标签外,还有什么你知道的标签?

还有很多其他的标签,、、、、 ,加上动态sql的9个标签,trim 、where、set、foreach、if、choose、when、otherwise、bind 等,其中为sql片段标签, 通过标签引入sql片段,为不支持自增的主键生成策略标签。

Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理吗?

Mybatis动态sql可以让我们在Xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能,Mybatis提供了9种动态sql的标签,trim 、where、set、foreach、if、choose、when、otherwise、bind

其执行原理为,使用OGNL(OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写)从sql参数对象中计算表达式的值,根据表达式的值动态拼接 sql,以此来完成动态sql的功能。

好了,【Mybatis面试常问的知识<2>ORM概念?Mybatis和Hibernate区别?全自动半自动区别?mapper文件中如何传递多个参数?模糊查询实现方式?SQL语句预编译?动态SQL?标签?】到这里就结束了,后续持续创作中。

推荐文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: