MyBatis基础教程:Java持久层框架入门

K8s驯兽师
2025-06-29 04:13
阅读 411

🧩 一、开篇:什么是MyBatis?

🧩 一、开篇:什么是MyBatis?

MyBatis 是一个Java 的持久层框架,简单点说,它帮我们把 Java 程序和数据库连接起来。如果你在开发一个 Web 应用,需要从数据库中读取数据或者向数据库保存数据,那么 MyBatis 就是一个非常实用的工具。

✅ 为什么要学习 MyBatis?

  • 简化数据库操作:不用再手动写 JDBC(Java 数据库连接)代码。
  • 灵活控制 SQL:不像 Hibernate 那样完全屏蔽 SQL,MyBatis 允许你直接写 SQL,方便优化和调试。
  • 性能好,适合大型项目:很多一线大厂都使用它来处理高并发的数据请求。

🛠️ 二、环境准备:搭建你的第一个 MyBatis 开发环境

🛠️ 二、环境准备:搭建你的第一个 MyBatis 开发环境

🔧 1. 所需工具

工具 版本建议
JDK 1.8 或以上
Maven 最新版(3.6+)
IntelliJ IDEA 社区版即可
MySQL 5.7 或以上

如果你还没有安装这些工具,请先完成安装再继续阅读!


💡 2. 创建 Maven 项目

打开 IntelliJ IDEA,创建一个新的 Maven 项目:

File → New → Project → Maven

选好 JDK,填入 GroupId 和 ArtifactId 后点击下一步,Maven 会自动为你生成一个基础项目结构。


📦 3. 引入 MyBatis 和 MySQL 驱动依赖

找到项目的 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>
</dependencies>

🧠 三、核心概念讲解:通俗易懂地理解 MyBatis 关键术语

为了更好地理解和使用 MyBatis,我们需要了解几个关键概念:

🔑 1. SqlSessionFactory(SQL 工厂)

你可以把它想象成一个“制造 SQL 会话”的工厂。它是整个应用中最重要的对象之一,负责创建 SqlSession

👤 2. SqlSession(SQL 会话)

SqlSession 可以用来执行 SQL 命令,就像你在命令行里执行 SQL 一样。你可以通过它插入数据、查询数据、更新记录等。

🗃️ 3. Mapper 接口与 XML 映射文件

这是 MyBatis 的灵魂部分。

  • Mapper 接口:就是一个普通的 Java 接口,里面定义了方法,比如:查用户、改名字。
  • XML 映射文件:这个接口里的每个方法,都会在 XML 中映射成一条 SQL 语句。

📚 示例图示:

Mapper接口        对应         XML映射文件
   ↓                          ↓
UserMapper.java     -->     UserMapper.xml
   ↓                          ↓
selectUserById()      -->     SELECT * FROM user WHERE id = #{id}

🧪 四、实战项目:跟着我一步步完成一个简单的 CRUD 系统

现在我们来做一个简单的学生管理系统,功能包括:

  • 查询学生信息
  • 添加学生信息

📝 第一步:准备数据库

创建一个名为 student_db 的数据库,并新建一个学生表:

CREATE DATABASE student_db;

USE student_db;

CREATE TABLE student (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    age INT
);

📁 第二步:配置 MyBatis

在 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>
    <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/student_db"/>
                <property name="username" value="root"/>
                <property name="password" value="your_password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/StudentMapper.xml"/>
    </mappers>
</configuration>

⚠️ 注意替换 your_password 为你的 MySQL 密码!


🧱 第三步:创建实体类 Student

在 src/main/java 下新建包 com.example.entity,然后创建 Student.java 类:

package com.example.entity;

public class Student {
    private Integer id;
    private String name;
    private int age;

    // Getters & Setters
    public Integer getId() { return id; }
    public void setId(Integer id) { this.id = id; }

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
}

📄 第四步:创建 Mapper 接口

新建包 com.example.mapper,添加接口文件 StudentMapper.java

package com.example.mapper;

import com.example.entity.Student;
import java.util.List;

public interface StudentMapper {
    List<Student> getAllStudents();
    void insertStudent(Student student);
}

📜 第五步:编写对应的 XML 映射文件

在 resources 下新建文件夹 mapper,并创建 StudentMapper.xml 文件:

<?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.StudentMapper">
    <select id="getAllStudents" resultType="com.example.entity.Student">
        SELECT * FROM student
    </select>

    <insert id="insertStudent">
        INSERT INTO student (name, age)
        VALUES (#{name}, #{age})
    </insert>
</mapper>

🚀 第六步:编写测试类运行程序

新建测试类 TestApp.java

import com.example.entity.Student;
import com.example.mapper.StudentMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;
import java.util.List;

public class TestApp {
    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()) {
            StudentMapper mapper = session.getMapper(StudentMapper.class);

            // 查询所有学生
            List<Student> students = mapper.getAllStudents();
            for (Student s : students) {
                System.out.println(s.getName());
            }

            // 插入新学生
            Student newStu = new Student();
            newStu.setName("张三");
            newStu.setAge(20);

            mapper.insertStudent(newStu);
            session.commit(); // 提交事务
        }
    }
}

❓ 五、常见问题解答(FAQ)

Q1:运行时提示找不到数据库驱动?

答: 检查你的 mybatis-config.xml 文件中的 driver 名称是否正确:
MySQL 8.x 使用的是 com.mysql.cj.jdbc.Driver,而不再是以前版本的 com.mysql.jdbc.Driver


Q2:为什么插入数据后数据库没有变化?

答: 忘记提交事务了!记得加上 session.commit()


Q3:提示 Mapper not found?

答: 可能是因为 XML 路径没配对,检查一下 <mapper> 标签中的路径是否准确;或命名空间是否一致。


📚 六、学习建议:接下来该学什么?

你现在掌握了 MyBatis 的基础用法,可以继续学习以下内容:

✅ 进阶方向推荐:

  1. 动态 SQL
    • <if><foreach><set> 等标签的使用
  2. MyBatis 与 Spring 集成
    • 整合到企业级框架 Spring Boot 中
  3. 日志管理
    • 结合 log4j、slf4j 查看底层 SQL 日志
  4. 插件开发
    • 编写自己的 MyBatis 插件实现分页、加密等功能

🙌 总结

通过本文,你已经成功完成了:

✅ 创建了一个基于 MyBatis 的 Java 应用
✅ 实现了基本的数据库操作(查询、插入)
✅ 理解了 MyBatis 的核心概念和工作流程

坚持练习才是掌握的关键,快动手试试吧!欢迎在评论区留言提问,一起交流进步~

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝