【Mytais系列】介绍、核心概念

MyBatis 是一款优秀的 持久层框架,它通过简化 JDBC 操作、提供灵活的 SQL 映射能力,成为 Java 开发中处理数据库交互的核心工具之一。以下是 MyBatis 的核心框架和概念解析:


一、MyBatis 框架概述

1. 核心定位
  • 作用:将 Java 对象与 SQL 语句解耦,通过 XML 或注解配置 SQL,自动完成参数映射和结果集转换。
  • 优势
    • 灵活控制 SQL:直接编写 SQL,适合复杂查询和性能优化场景。
    • 轻量级:无需依赖完整的 ORM 框架,学习成本低。
    • 与 Spring 无缝整合 :通过 mybatis-spring 模块简化集成。
2. 与其他 ORM 的对比
  • Hibernate
    • Hibernate 强调全自动 ORM(对象-表映射),适合快速开发;
    • MyBatis 更注重 SQL 灵活性,适合需要手动优化 SQL 的场景。
  • JDBC
    • MyBatis 封装了 JDBC 的冗余代码(如连接管理、结果集遍历),开发者只需关注 SQL 本身。

二、MyBatis 核心概念

1. 核心组件
  • SqlSessionFactory
    • 作用 :全局单例工厂,用于创建 SqlSession

    • 创建过程 :通过解析 mybatis-config.xml 配置文件,构建 Configuration 对象(包含所有配置信息)。

    • 代码示例

      InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
      SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

  • SqlSession

    • 作用:代表一次数据库会话,用于执行 SQL 并获取 Mapper 接口。

    • 特性非线程安全,需确保每次请求创建一个实例,用后关闭。

    • 常用方法

      User user = sqlSession.selectOne("com.example.mapper.UserMapper.selectUser", 1);
      sqlSession.commit(); // 提交事务
      sqlSession.close(); // 关闭会话

  • Mapper接口

    • 原理 :通过 动态代理 将接口方法与 XML 或注解中的 SQL 绑定。

    • 示例

      public interface UserMapper {
      @Select("SELECT * FROM user WHERE id = #{id}")
      User selectUser(int id);
      }

2. 配置文件
  • 全局配置文件( mybatis-config.xml
    • 配置数据源、事务管理器、插件、类型处理器等全局设置。

    • 示例片段

      <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/example/mapper/UserMapper.xml"/> </mappers> </configuration>
  • Mapper XML 文件

    • 定义 SQL 语句、结果映射(<resultMap>)、动态 SQL 等。

    • 示例片段

      <mapper namespace="com.example.mapper.UserMapper"> <select id="selectUser" resultType="User"> SELECT * FROM user WHERE id = #{id} </select> </mapper>

三、核心工作流程

  1. 初始化阶段
    • 解析 mybatis-config.xml 和所有 Mapper XML,构建 Configuration 对象。
    • 创建 SqlSessionFactory
  1. 执行阶段
    • 通过 SqlSessionFactory 创建 SqlSession
    • SqlSession 获取 Mapper 接口的代理对象(MapperProxy)。
    • 代理对象将方法调用转发给 SqlSession,执行对应的 SQL。
  1. SQL 执行过程
    • Executor:执行 SQL,处理缓存(一级缓存)。
    • StatementHandler :构建 PreparedStatement,设置参数。
    • ResultSetHandler:将结果集转换为 Java 对象。

四、关键特性

1. 动态 SQL
  • 作用:根据条件动态拼接 SQL,避免手动拼接字符串。

  • 常用标签

    <select id="findUsers"> SELECT * FROM users <where> <if test="name != null">AND name = #{name}</if> <if test="age != null">AND age > #{age}</if> <foreach item="id" collection="ids" open="AND id IN (" separator="," close=")"> #{id} </foreach> </where> </select>
2. 结果映射(ResultMap)
  • 作用:处理复杂对象与数据库字段的映射(如嵌套对象、集合)。

  • 示例

    <resultMap id="userResultMap" type="User"> <id property="id" column="user_id"/> <result property="name" column="user_name"/> <collection property="orders" ofType="Order"> <result property="orderId" column="order_id"/> </collection> </resultMap>
3. 缓存机制
  • 一级缓存 :默认开启,基于 SqlSession 生命周期,执行更新操作后失效。
  • 二级缓存 :需手动配置,基于 namespace 级别,跨会话共享(需序列化)。

五、适用场景

  • 复杂 SQL 需求:需要手动优化 SQL 性能的场景(如大数据量分页、多表关联查询)。
  • 遗留系统改造:已有复杂 SQL 的系统,迁移到 MyBatis 成本较低。
  • 对 SQL 可控性要求高:开发团队希望直接控制 SQL 而非依赖框架生成。

总结

MyBatis 的核心在于 平衡灵活性与开发效率 ,通过简化 JDBC 操作、提供动态 SQL 和结果映射能力,成为处理复杂数据库交互的理想选择。掌握其核心组件(如 SqlSessionMapper)、配置方式及动态 SQL 机制,是高效使用 MyBatis 的关键。

相关推荐
magic 24511 小时前
深入理解 MyBatis 代理机制
mybatis
昔我往昔1 天前
使用mybatis实例类和MySQL表的字段不一致怎么办
java·面试·mybatis
Code哈哈笑2 天前
【SpringBoot】Spring中事务的实现:声明式事务@Transactional、编程式事务
java·spring boot·后端·spring·mybatis
geekmice2 天前
通过SpringBoot+H2数据库+Mybatis实现DAO单元测试
数据库·spring boot·mybatis
凭君语未可2 天前
详解 MyBatis-Plus 框架中 QueryWrapper 类
数据库·oracle·mybatis
geekmice2 天前
SpringBoot+EasyExcel+Mybatis+H2实现导入
spring boot·后端·mybatis
冰^3 天前
深入Java JVM常见问题及解决方案
java·开发语言·jvm·spring boot·spring·mybatis·多分类
xbhog3 天前
Java大厂硬核面试:Flink流处理容错、Pomelo JVM调优、MyBatis二级缓存穿透防护与Kubernetes服务网格实战解析
websocket·flink·kubernetes·mybatis·graalvm·springcloud·java面试
多多*3 天前
SQL语句练习 自学SQL网 多表查询
数据库·数据仓库·hive·hadoop·sql·mysql·mybatis