DukeDuke
主页
文档转换
关于我们
主页
文档转换
关于我们
  • Mybatis简介
  • Mybatis-Plus简介

精通 MyBatis

目录

  • 1. MyBatis 简介
  • 2. 核心概念
  • 3. 配置详解
  • 4. 动态 SQL
  • 5. 缓存机制
  • 6. 最佳实践

1. MyBatis 简介

MyBatis 是一个优秀的持久层框架,它支持自定义 SQL、存储过程和高级映射。MyBatis 消除了几乎所有的 JDBC 代码和参数的手动设置以及结果集的检索。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects)映射成数据库中的记录。

1.1 主要特点

  • 简单易学:本身就很小且简单
  • 灵活:SQL 写在 XML 里,便于统一管理和优化
  • 解除 SQL 与程序代码的耦合
  • 提供映射标签,支持对象与数据库的 ORM 字段关系映射
  • 提供对象关系映射标签,支持对象关系组建维护
  • 提供 XML 标签,支持编写动态 SQL

2. 核心概念

2.1 核心组件

2.2 工作流程

3. 配置详解

3.1 基础配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<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="password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
</configuration>

3.2 Mapper 配置示例

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
    <select id="getUserById" resultType="User">
        SELECT * FROM user WHERE id = #{id}
    </select>
</mapper>

4. 动态 SQL

4.1 常用动态 SQL 标签

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

示例:

<select id="findUsers" resultType="User">
    SELECT * FROM user
    <where>
        <if test="name != null">
            AND name LIKE CONCAT('%', #{name}, '%')
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
    </where>
</select>

5. 缓存机制

5.1 一级缓存

  • 默认开启
  • 作用域:SqlSession
  • 生命周期:SqlSession 关闭时清除

5.2 二级缓存

  • 需要手动开启
  • 作用域:namespace
  • 生命周期:应用程序结束

配置示例:

<cache
    eviction="LRU"
    flushInterval="60000"
    size="512"
    readOnly="true"/>

6. 最佳实践

6.1 性能优化建议

  1. 合理使用缓存
  2. 使用批量操作
  3. 避免 N+1 查询问题
  4. 合理使用动态 SQL
  5. 使用延迟加载

6.2 代码示例

批量插入

@Insert("<script>" +
        "INSERT INTO user (name, age) VALUES " +
        "<foreach collection='list' item='item' separator=','>" +
        "(#{item.name}, #{item.age})" +
        "</foreach>" +
        "</script>")
void batchInsert(@Param("list") List<User> users);

分页查询

@Select("SELECT * FROM user LIMIT #{offset}, #{limit}")
List<User> findByPage(@Param("offset") int offset, @Param("limit") int limit);

6.3 常见问题解决方案

  1. 解决 N+1 查询问题
<resultMap id="userWithOrders" type="User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <collection property="orders" ofType="Order">
        <id property="id" column="order_id"/>
        <result property="orderNo" column="order_no"/>
    </collection>
</resultMap>

<select id="getUserWithOrders" resultMap="userWithOrders">
    SELECT u.*, o.id as order_id, o.order_no
    FROM user u
    LEFT JOIN orders o ON u.id = o.user_id
    WHERE u.id = #{id}
</select>
  1. 使用延迟加载
<resultMap id="userWithOrders" type="User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <collection property="orders"
                select="com.example.mapper.OrderMapper.getOrdersByUserId"
                column="id"
                fetchType="lazy"/>
</resultMap>

7. 总结

MyBatis 作为一个优秀的持久层框架,通过其灵活的配置和强大的功能,能够满足各种复杂的数据库操作需求。掌握 MyBatis 的核心概念、配置方法和最佳实践,可以帮助我们更好地进行数据库开发工作。

7.1 学习资源

  • MyBatis 官方文档
  • MyBatis GitHub 仓库
  • MyBatis-Spring 集成文档
最近更新:: 2026/4/17 13:21
Contributors: Duke
Next
Mybatis-Plus简介