mybatis入门(保姆级教程)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

前言

在 Java 开发领域,数据库操作始终是核心需求之一。MyBatis 作为一款流行的关系型数据库持久化框架,凭借其灵活性和简洁性,成为开发者入门和进阶的首选工具。本文将通过循序渐进的方式,结合实际案例,帮助编程初学者和中级开发者快速掌握 MyBatis 的核心概念与实战技巧。


一、MyBatis 是什么?为什么选择它?

1.1 MyBatis 的定位与优势

MyBatis 是一个基于 Java 的持久层框架,它简化了传统 JDBC 的复杂操作,同时避免了 ORM(对象关系映射)框架(如 Hibernate)的“侵入性”问题。它的核心思想是 SQL 语句与 Java 代码的解耦,通过 XML 或注解方式将 SQL 与业务逻辑分离。

形象比喻:可以将 MyBatis 视为一位“翻译官”,它将 Java 对象(如 POJO)与数据库表之间的交互,转化为开发者定义的 SQL 语句,从而降低开发复杂度。

1.2 MyBatis 的核心优势

  • 灵活性:直接编写原生 SQL,适合复杂查询场景;
  • 学习成本低:无需掌握复杂的 ORM 机制,适合编程新手快速上手;
  • 性能可控:避免 ORM 框架的“黑箱操作”,开发者可直接优化 SQL;
  • 社区支持完善:丰富的文档和插件生态(如分页插件、缓存插件)。

二、环境搭建与快速入门

2.1 项目准备

步骤 1:创建 Maven 项目
pom.xml 文件中添加 MyBatis 依赖:

<dependency>  
    <groupId>org.mybatis</groupId>  
    <artifactId>mybatis</artifactId>  
    <version>3.5.10</version>  
</dependency>  

步骤 2:准备数据库表
以用户管理系统为例,创建 user 表:

CREATE TABLE user (  
    id BIGINT PRIMARY KEY AUTO_INCREMENT,  
    name VARCHAR(50) NOT NULL,  
    email VARCHAR(100) UNIQUE  
);  

2.2 第一个 MyBatis 程序:查询用户

步骤 1:编写配置文件
创建 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>  
  <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/mydb"/>  
        <property name="username" value="root"/>  
        <property name="password" value="123456"/>  
      </dataSource>  
    </environment>  
  </environments>  
</configuration>  

步骤 2:编写 Java 代码
通过 SqlSessionFactory 创建会话对象,并执行查询:

import org.apache.ibatis.io.Resources;  
import org.apache.ibatis.session.SqlSession;  
import org.apache.ibatis.session.SqlSessionFactory;  
import org.apache.ibatis.session.SqlSessionFactoryBuilder;  

public class MyBatisDemo {  
    public static void main(String[] args) throws Exception {  
        // 加载配置文件  
        String resource = "mybatis-config.xml";  
        InputStream inputStream = Resources.getResourceAsStream(resource);  
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);  

        try (SqlSession session = sqlSessionFactory.openSession()) {  
            // 直接执行 SQL  
            List<Map<String, Object>> users = session.selectList("selectUsers");  
            for (Map<String, Object> user : users) {  
                System.out.println("Name: " + user.get("name"));  
            }  
        }  
    }  
}  

步骤 3:定义 SQL 语句
mapper 文件中添加 SQL:

<!-- user-mapper.xml -->  
<select id="selectUsers" resultType="map">  
    SELECT id, name, email FROM user  
</select>  

三、MyBatis 核心概念详解

3.1 核心组件与工作流程

3.1.1 核心组件

  • SqlSessionFactory:数据库会话工厂,负责创建 SqlSession
  • SqlSession:单线程数据库操作接口,包含增删改查方法;
  • Mapper:接口与 SQL 的映射关系定义(XML 或注解方式)。

工作流程比喻
想象一位厨师(SqlSessionFactory)根据菜单(配置文件)准备食材(数据库连接),然后由服务员(SqlSession)根据顾客点的菜(SQL 语句)执行烹饪(数据库操作)。

3.1.2 动态 SQL

MyBatis 提供 <if><choose><foreach> 等标签,实现条件化 SQL 组合。例如:

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

3.2 与 ORM 框架的对比

特性MyBatisHibernate
SQL 控制权开发者直接编写 SQL自动生成 SQL(可少量修改)
学习曲线较低(需熟悉 SQL)较高(需理解 ORM 机制)
适用场景复杂查询、性能敏感场景快速开发、简单数据模型

四、实战:CRUD 操作与分页

4.1 基础 CRUD 操作

4.1.1 新增用户(Insert)

<!-- user-mapper.xml -->  
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">  
    INSERT INTO user (name, email)  
    VALUES (#{name}, #{email})  
</insert>  

4.1.2 更新用户(Update)

<update id="updateUser">  
    UPDATE user  
    SET name = #{name}, email = #{email}  
    WHERE id = #{id}  
</update>  

4.1.3 删除用户(Delete)

<delete id="deleteUserById">  
    DELETE FROM user WHERE id = #{id}  
</delete>  

4.2 分页查询

通过 RowBounds 对象或插件实现分页。以下为 RowBounds 的简单示例:

int offset = 0;  
int limit = 10;  
List<User> users = session.selectList("selectUsers", null, new RowBounds(offset, limit));  

五、高级特性:动态 SQL 与缓存

5.1 动态 SQL 进阶

5.1.1 <foreach> 标签

批量插入多条记录:

<insert id="insertUsers">  
    INSERT INTO user (name, email) VALUES  
    <foreach item="user" collection="list" separator=",">  
        (#{user.name}, #{user.email})  
    </foreach>  
</insert>  

5.2 二级缓存

mapper 文件中启用缓存:

<cache/>  

通过 SqlSessioncommit()close() 方法触发缓存更新。


六、常见问题与解决方案

6.1 SQL 语句未生效

可能原因:未提交事务或未关闭 SqlSession
解决方案:在 SqlSession 关闭前调用 commit()

session.commit();  

6.2 参数传递错误

常见错误#{} 占位符参数名与 POJO 字段不匹配。
解决方法:检查 selectupdate 语句中的参数名是否与对象属性一致。


结论

通过本文的讲解,读者已掌握了 MyBatis 的基础配置、核心概念、CRUD 操作及高级特性。MyBatis 的灵活性和易用性使其成为中小型项目和性能敏感场景的首选框架。建议读者通过以下步骤进一步学习:

  1. 阅读官方文档,深入理解插件机制;
  2. 尝试使用注解(@Mapper)替代 XML 配置;
  3. 结合 Spring Boot 简化 MyBatis 集成。

掌握 MyBatis 将为开发者打开数据库操作的大门,为后续学习 Spring Data JPA、数据库优化等进阶技术奠定坚实基础。

最新发布