MyBatis Master Class

Java 8 & Maven 实战权威指南

核心概念与 ORM

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。

ORM vs SQL Mapper

特性 Hibernate / JPA (全自动 ORM) MyBatis (半自动 SQL Mapper)
SQL控制权 框架自动生成,难以优化复杂SQL 开发者编写SQL,优化灵活
学习曲线 陡峭,需掌握对象状态管理 平缓,只需掌握SQL和配置
性能 依赖缓存和懒加载,不可控因素多 直接执行SQL,性能可控
Java Object User.java id, name, age DB Table t_user user_id, user_name MyBatis Mapping

环境搭建 (Maven)

在 Java 8 项目中引入 MyBatis,首先需要在 pom.xml 中添加依赖。

XML pom.xml
<dependencies>
    <!-- MyBatis 核心依赖 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.13</version>
    </dependency>

    <!-- MySQL 驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>
    </dependency>
    
    <!-- Lombok (可选,简化实体类) -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.30</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

核心配置解析

mybatis-config.xml 是 MyBatis 的全局配置文件,包含了数据库连接池、事务管理器以及映射文件的位置。

<configuration> properties settings typeAliases plugins environments transactionManager dataSource mappers <mapper resource="..."/> <package name="..."/>
XML src/main/resources/mybatis-config.xml
<?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>
    <!-- 开启驼峰命名转换 -->
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <!-- 配置环境 -->
    <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"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 注册 Mapper -->
    <mappers>
        <mapper resource="mappers/UserMapper.xml"/>
    </mappers>
</configuration>

基础 CRUD 实战

MyBatis 推荐使用 Mapper 接口与 XML 映射文件绑定的方式进行开发,实现接口与 SQL 的解耦。

1. 实体类 (User.java)

public class User {
    private Long id;
    private String username;
    private String email;
    // Getters, Setters, toString...
}

2. Mapper 接口 (UserMapper.java)

public interface UserMapper {
    User selectById(Long id);
    int insertUser(User user);
}

3. XML 映射文件 (UserMapper.xml)

<mapper namespace="com.example.mapper.UserMapper">
    <!-- 查询 -->
    <select id="selectById" resultType="com.example.entity.User">
        SELECT id, username, email FROM t_user WHERE id = #{id}
    </select>

    <!-- 插入 -->
    <insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO t_user (username, email) VALUES (#{username}, #{email})
    </insert>
</mapper>

4. 测试调用

// 1. 读取配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
// 2. 构建 SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 3. 获取 SqlSession
try (SqlSession session = sqlSessionFactory.openSession()) {
    // 4. 获取 Mapper 接口代理对象
    UserMapper mapper = session.getMapper(UserMapper.class);
    
    // 5. 执行方法
    User user = mapper.selectById(1L);
    System.out.println(user);
}

高级特性:动态 SQL 与缓存

动态 SQL

MyBatis 强大的动态 SQL 功能可以让你摆脱拼接 SQL 字符串的痛苦。

Parameters (name=null) <if test="..."> OGNL Evaluation name != null ? Final SQL SELECT ...
<select id="findUser" resultType="User">
    SELECT * FROM t_user
    <where>
        <if test="username != null">
            AND username like #{username}
        </if>
        <if test="email != null">
            AND email = #{email}
        </if>
    </where>
</select>

缓存机制

MyBatis 提供了一级缓存(Session 级别,默认开启)和二级缓存(Namespace 级别)。

Namespace (L2 Cache) SqlSession A L1 Cache SqlSession B L1 Cache

Spring Boot 整合

在 Spring Boot 中,使用 mybatis-spring-boot-starter 可以极大地简化配置。

1. 依赖引入

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>3.0.3</version>
</dependency>

2. application.yml 配置

mybatis:
  mapper-locations: classpath:mappers/*.xml
  type-aliases-package: com.example.entity
  configuration:
    map-underscore-to-camel-case: true

3. 启动类注解

@SpringBootApplication
@MapperScan("com.example.mapper")
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

最佳实践

  • 不要过度使用动态 SQL:虽然强大,但过度复杂的动态 SQL 难以维护。
  • 优先使用 Mapper 接口:类型安全,IDE 支持更好。
  • 分页插件:推荐使用 PageHelper 进行物理分页。
  • 参数传递:多参数时推荐使用 @Param 注解或封装为 Map/DTO。