mybatis详解

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射,能够将 Java 对象与数据库记录进行灵活映射,简化数据库操作的开发流程。下面从多个方面详细介绍 MyBatis:

一、MyBatis 的基本概念

  • 定位:持久层框架(专注于将 Java 程序中的数据持久化到数据库,或从数据库读取数据并封装为 Java 对象)。
  • 核心思想:通过 XML 或注解的方式配置 SQL 语句,避免硬编码 SQL,同时提供强大的结果映射能力,减少手动处理 JDBC 代码的工作量。
  • 对比 JDBC:JDBC 需要手动编写连接获取、Statement 创建、结果集处理等重复代码,而 MyBatis 封装了这些操作,开发者只需关注 SQL 本身。

二、MyBatis 的核心组件

  1. SqlSessionFactory

    • 是 MyBatis 的核心工厂类,负责创建 SqlSession(数据库会话)。
    • 通常通过 SqlSessionFactoryBuilder 读取配置文件(如 mybatis-config.xml)构建,且建议全局只创建一个实例(单例模式)。
  2. SqlSession

    • 代表与数据库的一次会话,提供了执行 SQL 语句的方法(如 selectOneinsertupdate 等)。
    • 是非线程安全的,建议在方法体内创建,使用后及时关闭。
  3. Mapper 接口

    • 定义数据库操作的方法(如查询、新增等),方法名与 SQL 语句的 ID 对应。
    • 无需实现类,MyBatis 通过动态代理自动生成实现。
  4. SQL 映射文件(Mapper XML)

    • 存放 SQL 语句,通过 namespace 与 Mapper 接口关联。
    • 包含 <select><insert><update><delete> 等标签,分别对应查询、新增、更新、删除操作。

三、MyBatis 的工作流程

  1. 读取 MyBatis 核心配置文件(mybatis-config.xml),配置数据库连接信息、Mapper 映射文件路径等。
  2. 通过 SqlSessionFactoryBuilder 构建 SqlSessionFactory
  3. SqlSessionFactory 中获取 SqlSession
  4. 通过 SqlSession 获取 Mapper 接口的代理对象。
  5. 调用 Mapper 接口的方法,执行对应的 SQL 语句。
  6. 提交事务(如需),关闭 SqlSession

四、MyBatis 的核心特性

  1. 灵活的 SQL 编写

    • 支持手写 SQL,适用于复杂查询场景(如多表关联、子查询等),比 JPA 等 ORM 框架更灵活。
  2. 结果映射(ResultMap)

    • 解决 Java 对象与数据库表字段名不一致的问题,支持复杂对象(如嵌套对象、集合)的映射。

    • 示例: xml

      复制代码
      <resultMap id="userMap" type="User">
        <id column="user_id" property="id"/>
        <result column="user_name" property="name"/>
      </resultMap>
  3. 动态 SQL

    • 通过 <if><where><foreach> 等标签,根据条件动态生成 SQL,避免拼接 SQL 字符串的麻烦。

    • 示例: xml

      复制代码
      <select id="findUser" parameterType="User" resultMap="userMap">
        SELECT * FROM user
        <where>
          <if test="name != null">AND name LIKE CONCAT('%', #{name}, '%')</if>
          <if test="age != null">AND age = #{age}</if>
        </where>
      </select>
  4. 缓存机制

    • 一级缓存 :默认开启,基于 SqlSession 级别,同一会话中多次查询相同 SQL 会缓存结果。
    • 二级缓存 :需手动开启,基于 Mapper 接口级别,不同会话可共享缓存。
  5. 参数传递

    • 支持多种参数类型(基本类型、对象、Map 等),通过 #{}${} 接收参数(#{} 更安全,可防止 SQL 注入)。

五、MyBatis 与其他框架的对比

框架 特点 适用场景
MyBatis 手写 SQL,灵活度高,学习成本低 复杂查询、需要优化 SQL 的场景
Hibernate/JPA 全自动 ORM,无需手写 SQL,简化开发 简单 CRUD 操作,快速开发的场景
Spring JDBC 轻量封装 JDBC,需手动处理结果映射 对性能要求极高,需完全控制 SQL 时

六、MyBatis 的应用场景

  • 中小型项目,需要平衡开发效率与 SQL 灵活性。
  • 复杂查询场景(如报表生成、多表关联查询)。
  • 团队中熟悉 SQL 的开发者较多时,能充分发挥其优势。

七、扩展知识

  • MyBatis-Plus:基于 MyBatis 的增强工具,提供 CRUD 接口自动生成、分页插件等功能,进一步简化开发。
  • 集成 Spring :通过 MyBatis-Spring 插件可与 Spring 框架无缝集成,由 Spring 管理 SqlSession 等组件。

总之,MyBatis 以其灵活性和易用性成为 Java 持久层框架的主流选择,尤其适合需要精细控制 SQL 的开发场景。

相关推荐
火星校尉15 小时前
一场数据基建与消费场景的跨界实验
java·前端·数据库·python·php
平安的平安15 小时前
从“云端排队“到“边缘上岗“:DolphinDB 云边协同如何重塑工业现场的实时智能
数据库
懒鸟一枚16 小时前
为什么 useradd -rs /bin/false service 创建的用户无法用 su 切换?
linux·服务器·数据库
爱喝热水的呀哈喽16 小时前
hypermesh两个网格参数解析
服务器·数据库·mysql
万亿少女的梦16816 小时前
基于Spring Boot的楚雄旅游景区门票售卖系统设计与实现
java·spring boot·mysql·vue·系统设计
IvorySQL16 小时前
PG 技术日报|2026-07-03
数据库·postgresql·开源
长孙豪翔17 小时前
引发事件的问题
java·linux·数据库
吴声子夜歌17 小时前
SQL进阶——HAVING子句
数据库·sql
折哥的程序人生 · 物流技术专研17 小时前
Java面试通关⑩:MyBatis核心源码全集
mybatis·校招·java面试·orm框架·源码解析·数据库交互·社招
talenteddriver17 小时前
MySQL的ABC联合索引
mysql