Mybatis面试常问的知识

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

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);
 <select id="selectUser" resultMap="UserResultMap">select * from user where user_name = #{0} and dept_id = #{1} </select>

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

方法2:@Param注解传参法

public User selectUser(@Param("userName") String name, int @Param("deptId") deptId);
<select id="selectUser" resultMap="UserResultMap">4 select * from user where user_name = #{userName} and dept_id = #{deptId} </select>

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

方法3:Map传参法

public User selectUser(Map<String, Object> params);
 <select id="selectUser" parameterType="java.util.Map" resultMap="UserResultMap">select * from user where user_name = #{userName} and dept_id = #{deptId} </select>

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

方法4:Java Bean传参法

public User selectUser(User user);
<select id="selectUser" parameterType="com.pojo.User"resultMap="UserResultMap">select * from user where user_name = #{userName} and dept_id = #{deptId}</select>

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

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

  1. '%${question}%' 可能引起SQL注入,不推荐
  2. "%"#{question}"%" 注意:因为#{…}解析成sql语句时候,会在变量外侧自动加单引 号'',所以这里 % 需要使用双引号" ",不能使用单引号 '',不然会查不到任何结果。
  3. CONCAT('%',#{question},'%') 使用CONCAT()函数,推荐使用
  4. 使用bind标签
    <select id="listUserLikeUsername" resultType="com.pojo.User">
    <bind name="pattern" value="'%' + username + '%'" />
    select id,sex,age,username,password from person where username LIKE #{pattern}
    </select>
    

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的功能。

相关文章
|
5月前
|
缓存 Java 数据库连接
Mybatis缓存相关面试题有多卷
使用 MyBatis 缓存机制需要注意以下几点: 对于频繁更新和变动的数据,不适合使用缓存。 对于数据的一致性要求比较高的场景,不适合使用缓存。 如果配置了二级缓存,需要确保缓存的数据不会影响到其他业务模块的数据。 在使用缓存时,需要注意缓存的命中率和缓存的过期策略,避免缓存过期导致查询性能下降。
101 0
|
5月前
|
Java 关系型数据库 数据库连接
BATJ高频面试249道题:微服务+多线程+分布式+MyBatis +Spring
本文收集整理了各大厂常见面试题N道,你想要的这里都有内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux 等技术栈,希望大家都能找到适合自己的公司,开开心心的撸代码。
|
10天前
|
SQL Java 数据库连接
面试官问我了解Mybatis吗?我说了解,然后...........
面试官问我了解Mybatis吗?我说了解,然后...........
|
1月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
4月前
|
SQL 缓存 Java
MyBatis最经典的20道面试题,你都会了吗?
MyBatis最经典的20道面试题,你都会了吗?
59 0
|
3月前
|
SQL 缓存 Java
【面试官】Mybatis缓存有什么问题吗?
面试官:你说下对MyBatis的理解?面试官:那SqlSession知道吧?面试官:Mybatis的缓存有哪几种?面试官:那Mybatis缓存有什么问题吗?面试官:Mybatis分页插件是怎么
【面试官】Mybatis缓存有什么问题吗?
|
2月前
|
前端开发 Java 数据库连接
一天十道Java面试题----第五天(spring的事务传播机制------>mybatis的优缺点)
这篇文章总结了Java面试中的十个问题,包括Spring事务传播机制、Spring事务失效条件、Bean自动装配方式、Spring、Spring MVC和Spring Boot的区别、Spring MVC的工作流程和主要组件、Spring Boot的自动配置原理和Starter概念、嵌入式服务器的使用原因,以及MyBatis的优缺点。
|
5月前
|
SQL 缓存 Java
Mybatis面试题
Mybatis面试题
|
3月前
|
SQL Java 数据库连接
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
64 0
|
5月前
|
存储 缓存 Java
什么!?实战项目竟然撞到阿里面试的原题!???关于MyBatis Plus的缓存机制
什么!?实战项目竟然撞到阿里面试的原题!???关于MyBatis Plus的缓存机制