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 提供了 QueryWrapperLambdaQueryWrapper。我们可以直接在 Java 代码中通过链式调用(如 .eq().like())动态生成 SQL 条件,避免了繁琐的 XML 标签判断。
  • 自动化辅助功能

    • MP 自带了自动分页插件逻辑删除自动填充实体字段(如 create_time)等高级功能。这些在原生 MyBatis 中都需要手动写拦截器或大量的 SQL 逻辑。

7.MyBatis运用了哪些常见的设计模式?

代理模式 解决了接口调用的问题,工厂和建造者 解决了复杂对象的创建,而 装饰器和模板方法 则保障了功能的可扩展性。这就是它比原生 JDBC 优雅得多的原因。”