mysql MyBatis是什么_mysql持久层框架讲解

来源:这里教程网 时间:2026-02-28 20:44:33 作者:

MyBatis 不是 MySQL 的一部分,也不是 MySQL 自带的工具;它是一个独立的 Java 持久层框架,用来简化 Java 程序操作 MySQL(或其他关系型数据库)的过程。你用 MySQL 存数据,用 MyBatis 写代码——二者分工明确:MySQL 负责存储和查询,MyBatis 负责“怎么连、怎么发 SQL、怎么把结果变成对象”。


MyBatis 本质是 JDBC 的智能封装

原始 JDBC 每次查库都要写:

Connection
PreparedStatement
ResultSet
、手动
setString()
、循环
next()
、还要
close()
防泄漏……代码又臭又长。
MyBatis 把这些模板逻辑全包了,你只管写 SQL 和定义 Java 对象映射关系。

它不生成 SQL(不像 Hibernate),SQL 由你手写,所以能精准控制性能和兼容性 它不强制要求 POJO 字段名和数据库列名一致,靠
<resultmap></resultmap>
或命名规则(如开启
mapUnderscoreToCamelCase=true
)做自动映射
它支持 XML 配置(
UserMapper.xml
)和注解(
@Select("SELECT * FROM user")
),但生产项目推荐 XML —— SQL 复杂时更易维护、支持动态标签(
<if></if>
<foreach></foreach>
<select id="selectById" resultType="com.example.User">
  SELECT id, username, password FROM user WHERE id = #{id}
</select>

注意:

#{id}
是预编译参数占位符,等价于 JDBC 的
?
,能防 SQL 注入;别错写成
${id}
(字符串拼接,危险!)


为什么必须配 mybatis-config.xml 和 Mapper XML?

MyBatis 启动时需要两个核心配置:

mybatis-config.xml
:全局配置,定义数据库连接池、事务管理器、类型别名、加载哪些
Mapper
文件
UserMapper.xml
:SQL 映射文件,一个接口对应一个 XML,声明 SQL 语句与 Java 方法的绑定关系

常见错误:

忘记在
mybatis-config.xml
中注册
<mappers></mappers>
,导致
SqlSession.getMapper(UserMapper.class)
BindingException
XML 文件路径没放在
resources
目录下,Maven 打包后丢失,运行时报
Invalid bound statement (not found)
namespace
值写错(比如写成
com.example.UserDao
却没定义该接口),或方法名与
id
不一致
<configuration>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis_db?useSSL=false&serverTimezone=UTC"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="com/example/UserMapper.xml"/>
  </mappers>
</configuration>

MySQL 8+ 驱动和时区问题最容易翻车

用 MySQL 8.0+ 时,

mysql-connector-java
版本必须 ≥
8.0.11
,否则报
Unknown system variable 'query_cache_size'
或连接拒绝;同时 URL 必须显式加时区参数,否则
datetime
字段读写错乱。

错误写法:
jdbc:mysql://localhost:3306/mybatis_db
正确写法:
jdbc:mysql://localhost:3306/mybatis_db?useSSL=false&serverTimezone=Asia/Shanghai

另外注意驱动类名变化:

MySQL 5.x:
com.mysql.jdbc.Driver
MySQL 8.x:
com.mysql.cj.jdbc.Driver

Maven 依赖也得同步更新:

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.33</version>
</dependency>

MyBatis 的“轻”是优势,也是陷阱:它不拦着你写烂 SQL,也不自动建表或校验字段类型。真正用好它,关键不是配通,而是理解「SQL 在哪写、参数怎么传、结果怎么映、异常怎么捕」这四件事 —— 尤其是动态 SQL 和嵌套结果映射,线上出问题时,90% 都卡在这几处。

相关推荐