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 的开发场景。

相关推荐
玉衡子14 分钟前
MySQL基础架构全面解析
数据库·后端
梦中的天之酒壶16 分钟前
Redis Stack扩展功能
数据库·redis·bootstrap
GreatSQL24 分钟前
GreatSQL分页查询优化案例实战
数据库
Leo.yuan1 小时前
不同数据仓库模型有什么不同?企业如何选择适合的数据仓库模型?
大数据·数据库·数据仓库·信息可视化·spark
麦兜*1 小时前
MongoDB 6.0 新特性解读:时间序列集合与加密查询
数据库·spring boot·mongodb·spring·spring cloud·系统架构
chat2tomorrow1 小时前
数据采集平台的起源与演进:从ETL到数据复制
大数据·数据库·数据仓库·mysql·低代码·postgresql·etl
稻草人想看远方1 小时前
关系型数据库和非关系型数据库
数据库
考虑考虑1 小时前
Postgerssql格式化时间
数据库·后端·postgresql
依稀i1231 小时前
Spring Boot + MySQL 创建超级管理员
spring boot·mysql
千里码aicood1 小时前
【springboot+vue】党员党建活动管理平台(源码+文档+调试+基础修改+答疑)
java·数据库·spring boot