1.与传统的JDBC相比,MyBatis的优点?
“MyBatis 是一个半自动的 ORM 框架。它在保留了传统 JDBC 性能优势的同时,通过自动化封装解决了 JDBC 繁琐的样板代码问题,实现了 SQL 逻辑与业务代码的解耦。”
-
减少样板代码(简化开发):
-
JDBC:需要手动建立连接、创建 Statement、手动处理 ResultSet 结果集映射。
-
MyBatis:自动管理连接和事务,自动将查询结果映射为 Java 对象(POJO),大幅减少代码量。
-
-
SQL 与代码解耦(易于维护):
-
JDBC:SQL 语句硬编码在 Java 代码中,修改 SQL 需要重新编译。
-
MyBatis:将 SQL 提取到独立的 XML 文件或注解中。这种配置化的方式让 DBA(数据库管理员)和开发人员能更方便地协同优化 SQL。
-
-
动态 SQL(灵活性强):
-
JDBC:拼接复杂的动态 SQL(如根据多个可选条件查询)非常痛苦且容易出错。
-
MyBatis:提供了强大的标签(如
<if>、<where>、<foreach>),能优雅地处理各种复杂逻辑。
-
-
内置连接池与缓存(性能优化):
- MyBatis:自带连接池管理,且支持一级缓存(SqlSession 级别)和二级缓存(Namespace 级别),减少了不必要的数据库开销。
2.MyBatis觉得在哪方面做的比较好?
1. SQL 与代码的极致解耦
“我觉得 MyBatis 做得最好的一点是它在灵活性和规范之间找到了平衡。 它通过 XML 或注解将 SQL 从 Java 代码中剥离出来。这使得开发者可以像在数据库工具里一样自由地编写和优化原生 SQL,同时又不失 Java 代码的整洁。这种‘半自动’的设计,既避开了 JDBC 的繁琐,又避开了全自动 ORM(如 Hibernate)难以优化复杂 SQL 的痛点。”
2. 强大的动态 SQL 引擎
“它的动态 SQL 功能非常出色。 通过 <if>、<choose>、<foreach> 等标签,MyBatis 能够根据传入参数动态生成 SQL。在处理‘多条件组合查询’这种复杂业务时,它避免了在 Java 代码中拼字符串的噩梦,不仅代码优雅,还从根本上通过预编译处理降低了 SQL 注入的风险。”
3. 精准的结果映射机制
“它的结果映射(ResultSet Mapping)做得非常智能。 无论是通过简单的 resultType 自动匹配,还是通过 resultMap 处理复杂的‘一对一’、‘一对多’关联查询,MyBatis 都能高效地将数据库扁平的数据行转换为 Java 复杂的对象树。这种自动映射极大减少了手动处理 ResultSet 的工作量。”
4. 插件机制带来的高扩展性
“MyBatis 预留了强大的拦截器插件接口。 我们可以非常轻松地在 SQL 执行的生命周期中加入自定义逻辑。比如业界常用的 PageHelper 分页插件,或者我们公司内部做的自动填充审计字段(如创建时间、更新时间)、分库分表逻辑,都是基于这个机制实现的,对业务代码零侵入。”
3.还记得JDBC连接数据库的步骤吗?
不记得
4.如果项目中要用到原生的mybatis去查询,该怎样写?

5.Mybatis里的 # 和 $ 的区别?
| 特性 | # {} (占位符) | ${} (拼接符) |
|---|---|---|
| 底层实现 | 使用 PreparedStatement 预编译 | 直接进行字符串替换 |
| 安全性 | 高,有效防御 SQL 注入 | 低,容易遭受 SQL 注入攻击 |
| 引号处理 | 自动为字符串参数加上单引号 ' ' | 不会自动加引号 |
| 性能 | 数据库会对预编译 SQL 进行缓存,效率高 | 每次拼接后都是新 SQL,增加解析负担 |
6.MybatisPlus和Mybatis的区别?
-
通用 CRUD(无 SQL 开发):
-
MyBatis:即使是简单的增删改查,也要在 XML 中写 SQL。
-
MP:内置了
BaseMapper。只要接口继承它,就自动拥有了基础的增删改查能力,单表操作完全不需要写任何 SQL 或 XML。
-
-
条件构造器 (Wrapper):
- MP 提供了
QueryWrapper或LambdaQueryWrapper。我们可以直接在 Java 代码中通过链式调用(如.eq().like())动态生成 SQL 条件,避免了繁琐的 XML 标签判断。
- MP 提供了
-
自动化辅助功能:
- MP 自带了自动分页插件、逻辑删除、自动填充实体字段(如
create_time)等高级功能。这些在原生 MyBatis 中都需要手动写拦截器或大量的 SQL 逻辑。
- MP 自带了自动分页插件、逻辑删除、自动填充实体字段(如
7.MyBatis运用了哪些常见的设计模式?
代理模式 解决了接口调用的问题,工厂和建造者 解决了复杂对象的创建,而 装饰器和模板方法 则保障了功能的可扩展性。这就是它比原生 JDBC 优雅得多的原因。”