程序员面试必备之Java面试题:mybatis常见面试题汇总!
MyBatis常见面试题解析(Java方向)
1. MyBatis与JDBC的区别?
MyBatis是半自动化的ORM框架,相比JDBC:
- 自动化操作:自动管理连接池、事务和结果集映射
- SQL解耦:SQL写在XML/注解中,与Java代码分离
- 参数处理:自动处理参数映射和结果集转换
- 缓存机制:提供一级/二级缓存提升性能
<!-- 示例:Mapper XML配置 -->
<select id="selectUser" resultType="User">
SELECT * FROM users WHERE id = #{id}
</select>
2. #{}和${}的区别?
-
#{}(推荐使用)
预处理参数,自动防SQL注入,相当于JDBC的PreparedStatement
例:WHERE name = #{name}→ 编译为WHERE name = ? -
${}(谨慎使用)
直接字符串替换,有SQL注入风险
适用场景:动态表名/列名
例:ORDER BY ${columnName}
3. 如何解决列名与属性名不一致?
三种解决方案:
- SQL别名
SELECT user_name AS userName FROM t_user - ResultMap映射
<resultMap id="userMap" type="User"> <result column="user_name" property="userName"/> </resultMap> - 全局驼峰转换(mybatis-config.xml)
<settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings>
4. 一级缓存与二级缓存?
| 特性 | 一级缓存 | 二级缓存 |
|---|---|---|
| 作用域 | SqlSession级别 | Mapper级别 |
| 默认开启 | 是 | 需手动配置 |
| 失效场景 | 增删改操作/清空缓存 | 跨SqlSession的更新 |
| 存储位置 | 内存 | 可配置Redis等外部存储 |
5. 动态SQL常用标签
<select id="dynamicQuery">
SELECT * FROM products
<where>
<if test="name != null">
AND name LIKE #{name}
</if>
<choose>
<when test="category == 'electronics'">
AND category_id = 1
</when>
<otherwise>
AND category_id = 2
</otherwise>
</choose>
<foreach item="id" collection="ids" open="AND id IN (" separator="," close=")">
#{id}
</foreach>
</where>
</select>
6. 分页实现方式
- 逻辑分页:
RowBounds内存分页(大数据量不推荐)List<User> users = sqlSession.selectList("getUsers", null, new RowBounds(10, 20)); - 物理分页:
PageHelper插件(推荐)PageHelper.startPage(2, 10); //第2页,每页10条 List<User> users = userMapper.selectAll();
7. 如何实现多表关联查询?
- 嵌套查询(N+1问题)
<resultMap id="orderMap" type="Order"> <association property="user" column="user_id" select="selectUser"/> </resultMap> - 嵌套结果(单次查询)
<resultMap id="orderMap" type="Order"> <association property="user" javaType="User"> <id property="id" column="user_id"/> </association> </resultMap>
8. 插件开发原理
基于责任链模式的拦截器:
@Intercepts({
@Signature(type=Executor.class, method="query", args={...})
})
public class MyPlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) {
// 前置处理
Object result = invocation.proceed();
// 后置处理
return result;
}
}
在mybatis-config.xml注册:
<plugins>
<plugin interceptor="com.example.MyPlugin"/>
</plugins>
提示:面试中常问实际应用场景(如分页、审计字段自动填充等)
9. 如何批量插入数据?
// Mapper接口定义
@Insert("<script>" +
"INSERT INTO users (name) VALUES " +
"<foreach item='user' collection='list' separator=','>" +
"(#{user.name})" +
"</foreach>" +
"</script>")
void batchInsert(List<User> users);
注意:MySQL默认接受SQL长度有限制,超长需拆分批次执行
10. 延迟加载原理
通过动态代理实现关联对象的按需加载:
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
- 访问主对象时返回代理类
- 当调用关联对象方法时触发SQL查询
- 配置参数
aggressiveLazyLoading控制加载行为
另外,小编还给大家准备了一套220万字的面试题题库,希望大家能够好好学习一下。
学习目录

学习内容(59大专题)
Java企业架构体系相关

![]()
Al大模型相关

![]()
HR面试软技能

设计模式相关

并发编程相关

网络IO与Netty相关

互联网三高项目相关

亿级流量多级缓存相关

数据结构算法相关

分布式相关

分布式锁相关

分布式ID相关

核心源码相关

大厂线上故障分析相关

Docker相关

Dubbo相关

ElasticSearch相关

GoLang相关

Java基础核心

JVM核心相关

JVM调优底层相关

Kafka相关

Kubernetes相关

Linux相关

MongoDB相关

MQ相关

MySQL相关

MyBatis相关

MyBatisPlus相关

Neo4j相关

Netty相关

Nginx相关

Oracle相关

postgresql相关

RabbitMQ相关

RocketMQ相关

Redis相关

shardingSphere相关

shiro相关

skywalking相关

Solr相关

Spring相关

SpringBoot相关

SpringCloud相关

SpringMVc源码相关

springSecurity相关

Spring WebFlux相关

领域驱动设计(DDD)相关

任务调度Airflow相关

zookeeper相关

HDFS面试题

MapReduce面试题

Yarn面试题

大数据SQL面试题

Scala面试题

Spark面试题

Tomcat源码

相关网络安全相关

运维/云原生相关

结束语

已经整理成册,需要的同学查看下方名片拿走了!
更多推荐



所有评论(0)