MyBatis:简介、优势和常见问题解答

MyBatis:简介、优势和常见问题解答

说说什么是 Mybatis 吧

MyBatis 是一种优秀的持久层框架,它是一个基于 Java 的 半ORM(对象关系映射)框架,可以使用简单的 XML 或注解配置来映射原始类型、Map 和 Java 对象(POJO)到数据库表中的记录

MyBatis 支持自定义 SQL、存储过程和高级映射,可以将复杂的 JDBC 代码封装起来,使开发者只需要关注 SQL 语句的编写和映射关系的配置,从而大大简化了数据库访问的开发工作。

MyBatis 的主要优点包括:易于使用、灵活性强、可以自定义 SQL、支持多种数据库、性能优秀等。

缺点是:对于复杂的 SQL 还是需要自己手动编写,这就对码农的 SQL 功底有着较高的要求了,而且它的 SQL 语句非常依赖数据库,这就使得可能这个数据库可以用的 SQL 换一个数据库就不行了。

你刚刚说了 ORM 框架,能不能告诉我什么是 ORM?为什么说 Mybatis 是半自动的 ORM 框架呢?

ORM 说白了就是建立数据库字段和 Java对象(POJO) 的一种映射关系技术,

Mybatis 由于建立这种映射需要我们手动编写 SQL, 所以说它是半自动的。

我们已经有 JDBC 了,为什么需要 Mybatis 呢?

因为 JDBC 有下面几个缺点:

  1. 建立连接麻烦。
  2. SQL 写在代码里面不好维护。
  3. 传参也很麻烦。
  4. 处理结果也很麻烦。

一句话就是,JDBC 使用起来麻烦,不如 Mybatis 方便。

#{} 和 ${} 的区别是什么?

在 MyBatis 中,$# 是两种不同类型的占位符,用于在 SQL 语句中引用参数或表达式,但它们的行为有一些重要区别:

  1. $ 占位符(String Substitution):
    • $ 用于字符串替换,直接将参数的值嵌入 SQL 语句中,不使用预编译机制
    • $ 不提供参数安全性,可能会导致 SQL 注入风险。
    • 通常在需要动态生成列名、表名等情况下使用 $
    • 例如,select * from ${tableName}${tableName} 会被替换成实际的表名。
  2. # 占位符(Parameterized):
    • # 用于预编译参数,会将参数值传递给数据库的预编译语句,提供参数安全性。
    • # 通常在查询条件、插入、更新或删除操作时使用。
    • 例如,select * from table where column = #{value}#{value} 会被替换成参数值,并使用预编译机制传递给数据库。

Hibernate 和 MyBatis 的区别是什么?

Hibernate 和 MyBatis 都是 Java 中常用的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到数据库表中。

虽然它们都可以用于实现数据库访问,但是它们有一些区别:

  1. 映射方式不同:
    • Hibernate 是一种全自动 ORM 框架,它使用 Java 对象映射到数据库表,
    • 而 MyBatis 则是一种半自动 ORM 框架,它使用 SQL 映射文件来指定如何将 Java 对象映射到数据库表。
  2. 性能不同:
    • MyBatis 的性能通常比 Hibernate 更好,因为它可以更好地控制 SQL 语句的生成和执行,可以更好地优化 SQL 语句。
    • 而 Hibernate 对 SQL 的生成和优化是自动的,可能会导致性能问题。
  3. 配置方式不同:
    • Hibernate 配置相对比较复杂,需要编写映射文件和配置文件,
    • MyBatis 配置相对简单,只需要编写 SQL 映射文件和配置文件即可。
  4. 支持的数据库不同:
    • Hibernate 支持多种数据库,包括 MySQL、Oracle、SQL Server 等,
    • MyBatis 对数据库的支持相对较少,主要支持 MySQL、Oracle、SQL Server、PostgreSQL 等常用数据库。
  5. 对象关系维护不同:
    • Hibernate 可以自动维护对象之间的关系,包括一对一、一对多、多对多等关系,
    • MyBatis 不支持自动维护对象之间的关系,需要手动编写 SQL 语句来实现。

综合来说:

  1. 如果需要快速开发,可以选择 Hibernate,
  2. 如果需要更好的性能和更灵活的 SQL 控制,可以选择 MyBatis。

xml 映射文件中,除了常见的 select、insert、update、delete 标签之外,还有哪些标签?

还有很多其他的标签,

加上动态 sql 的 9 个标签,trim|where|set|foreach|if|choose|when|otherwise|bind 等,

  • 其中 为 sql 片段标签,通过 标签引入 sql 片段,
  • 是不支持【自增的主键生成策略】标签。

Dao 接口的工作原理是什么?

在最佳实践中,通常一个 xml 映射文件,都会写一个 Dao 接口与之对应。( xml <–> Mapper

Dao 接口就是人们常说的 Mapper 接口

  • 接口的全限名,就是映射文件中的 namespace 的值
  • 接口的方法名,就是映射文件中 MappedStatement 的 id 值
  • 接口方法内的参数,就是传递给 sql 的参数

Mapper 接口是没有实现类的,当调用接口方法时,【接口全限名 + 方法名】拼接字符串作为 key 值,可唯一定位一个 MappedStatement

举例:com.mybatis3.mappers.StudentDao.findStudentById,可以唯一找到 namespace 为 com.mybatis3.mappers.StudentDao 下面 id = findStudentByIdMappedStatement

在 MyBatis 中,每一个