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

云边有个仓库
2025-06-30 05:39
阅读 652

一、MyBatis是什么?能做什么?

一、MyBatis是什么?能做什么?

在我们学习Java编程时,经常要和数据库打交道。比如你写了一个博客系统,用户的数据(如用户名、密码)通常是要存储在数据库里的。

但问题来了:Java程序怎么操作数据库?

最原始的方式是使用JDBC(Java Database Connectivity),它允许Java代码直接调用SQL语句来查询、插入、更新数据。虽然功能强大,但JDBC的代码繁琐重复,开发效率不高。

这时候就出现了像MyBatis这样的工具 —— 它是一个 Java持久层框架,帮助我们简化数据库操作。

那么MyBatis到底能做什么呢?

  • 把Java对象和数据库中的记录对应起来(例如一个User类对应一张user表)
  • 可以执行SQL语句,自动把结果转换成Java对象
  • 提供了更好的方式管理SQL语句,提升可维护性
  • 支持连接池、事务管理等功能

换句话说,它就是帮你更方便地操作数据库!

✅ 简单说一句:MyBatis = 更容易写的数据库操作代码 + 更灵活的SQL控制能力


二、环境准备(超详细)

二、环境准备(超详细)

为了使用MyBatis,你需要准备好以下开发环境:

1. Java开发环境

  • JDK 8或以上(推荐JDK 17)
  • IDE:可以使用 IntelliJ IDEA 或 Eclipse(本文以IDEA为例)

2. 数据库环境

建议使用 MySQL(免费好用),安装步骤如下:

  1. 访问官网 https://dev.mysql.com/downloads/mysql/
  2. 下载适合你系统的版本并安装
  3. 安装后运行 mysql -u root -p 登录数据库(默认账号root,密码自己设置)

📌 小提示:如果对命令行不太熟悉,也可以安装一个图形化工具,比如 Navicat 或 DBeaver 来查看和操作数据库。

3. 创建测试数据库

我们先创建一个简单的数据库和一张表用于后续练习:

-- 创建数据库 blog_db
CREATE DATABASE blog_db;

-- 切换到这个数据库
USE blog_db;

-- 创建表 user
CREATE TABLE user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    email VARCHAR(100)
);

然后插入一条测试数据:

INSERT INTO user (name, email) VALUES ('张三', 'zhangsan@example.com');

三、MyBatis核心概念通俗讲解

三、MyBatis核心概念通俗讲解

刚开始学MyBatis会遇到几个陌生的概念,别慌,下面我用生活化的例子解释这些术语。

1. Mapper接口(映射接口)

你可以把它看作一个“请求接口”,就像点外卖的时候你要告诉服务员你要什么菜一样。

在MyBatis中,我们写一个接口,声明一些方法,告诉MyBatis:“我想查某个用户”、“我想插入一个新的用户”。

举个例子:

public interface UserMapper {
    User selectUserById(int id);
}

👉 表示你要根据id查找一个用户。

2. XML文件(SQL配置文件)

这是存放具体SQL的地方。有点像是菜单,接口是点餐的内容,XML里才是具体的菜怎么做。

<!-- UserMapper.xml -->
<select id="selectUserById" resultType="User">
    SELECT * FROM user WHERE id = #{id}
</select>

这段XML说明了上面那个 selectUserById 方法对应的SQL语句。

⚠️ 注意:

  • #{id} 是参数占位符,不是拼接字符串,防止SQL注入
  • resultType 表示返回值类型,这里就是User类

3. Configuration 文件(配置文件)

这相当于你的餐厅介绍页,告诉顾客这家餐厅的基本信息:

  • 数据库的地址、用户名、密码
  • 哪些Mapper需要加载进来
<!-- mybatis-config.xml -->
<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/blog_db"/>
                <property name="username" value="root"/>
                <property name="password" value="your_password"/>
            </dataSource>
        </environment>
    </environments>
    
    <!-- 加载 Mapper 文件 -->
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
</configuration>

4. SqlSession(会话)

可以理解为一次“用餐过程”。你通过这个会话去执行SQL、获取结果。

简单用法如下:

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession session = factory.openSession();

try {
    UserMapper mapper = session.getMapper(UserMapper.class);
    User user = mapper.selectUserById(1);
    System.out.println(user.getName());
} finally {
    session.close();
}

四、从零开始实战项目:用户查询系统

现在我们来一起完成一个小项目 —— 实现一个可以通过ID查询用户的简单系统。

目标:输入用户ID,输出该用户的名字和邮箱。

步骤1:新建Maven项目

  1. 打开IntelliJ IDEA → New Project → Maven
  2. 给项目命名,例如叫 mybatis-demo
  3. 等待下载依赖

步骤2:添加MyBatis依赖

编辑项目的 pom.xml 文件,在 <dependencies> 标签中添加:

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

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.30</version>
</dependency>

✅ 注意:确保版本号正确,目前MyBatis最新稳定版是3.5.x系列。

步骤3:创建实体类 User.java

src/main/java 包下新建 model.User 类:

package model;

public class User {
    private int id;
    private String name;
    private String email;

    // Getter & Setter
    public int getId() { return id; }
    public void setId(int id) { this.id = id; }

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

    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

步骤4:创建Mapper接口 UserMapper.java

同样在这个包下新建 mapper.UserMapper 接口:

package mapper;

import model.User;

public interface UserMapper {
    User selectUserById(int id);
}

步骤5:创建Mapper XML文件 UserMapper.xml

resources/mapper 路径下新建 UserMapper.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="mapper.UserMapper">
    <select id="selectUserById" resultType="model.User">
        SELECT * FROM user WHERE id = #{id}
    </select>
</mapper>

📌 注意:

  • namespace 要与你的Mapper接口类名一致
  • resultType 指定返回的Java类路径

步骤6:创建配置文件 mybatis-config.xml

放在 resources 目录下:

<?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/blog_db?useSSL=false&amp;serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="your_password"/>
            </dataSource>
        </environment>
    </environments>
    
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
</configuration>

步骤7:编写主程序进行测试

新建一个 App.java 文件,用来运行程序:

import model.User;
import mapper.UserMapper;
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.IOException;

public class App {
    public static void main(String[] args) throws IOException {
        // 加载配置文件
        SqlSessionFactory factory = new SqlSessionFactoryBuilder()
                .build(Resources.getResourceAsStream("mybatis-config.xml"));

        try (SqlSession session = factory.openSession()) {
            // 获取Mapper接口的实现
            UserMapper mapper = session.getMapper(UserMapper.class);

            // 查询用户(假设我们要查id=1的用户)
            User user = mapper.selectUserById(1);
            if (user != null) {
                System.out.println("查询结果:" + user);
            } else {
                System.out.println("没有找到该用户");
            }
        }
    }
}

负载均衡配置-1

步骤8:运行并查看结果

点击 Run 后,你应该能看到类似输出:

查询结果:User{id=1, name='张三', email='zhangsan@example.com'}

✅ 恭喜!你完成了第一个基于MyBatis的查询功能!


五、新手常见问题解答

Q1:为什么报错说找不到驱动?

可能原因:

  • MySQL驱动未加入依赖
  • driver类名写错了(注意是否带 cj)

解决办法: 确认 pom.xml 中有 mysql-connector-java 的依赖,并且url和driver配置如下:

<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/blog_db?useSSL=false&amp;serverTimezone=UTC"/>

Q2:运行时报 NullPointerException,说 mapper 为 null?

这是因为 MyBatis 没有正确扫描到你的Mapper接口或者XML。

检查以下几点:

  • Mapper接口的 package 和 XML的 namespace 是否完全一致
  • mybatis-config.xml 中是否正确引入了你的 mapper 文件

Q3:为什么明明数据库有数据,却查不出来?

可能原因:

  • 数据库字段名和类属性不匹配(比如字段是userName而类属性是name)
  • SQL语句本身有问题(建议手动在数据库中执行试试)

解决方案:

  • 使用日志打印出实际执行的SQL(后面章节讲)
  • 使用调试器逐步查看返回值

Q4:什么时候要用 #{},什么时候用 ${}?

  • #{}:安全参数占位符,推荐使用,防止SQL注入
  • ${}:直接替换SQL语句,用于动态排序等特殊场景

示例:

SELECT * FROM user ORDER BY ${columnName} -- 使用${}动态排序

六、下一步学习建议

恭喜你成功入门MyBatis啦!接下来你可以继续深入学习以下内容:

推荐学习路线:

  1. 🔹 插入、更新、删除操作
  2. 🔹 动态SQL(if、choose、foreach等)
  3. 🔹 注解方式代替XML(@Select、@Insert等)
  4. 🔹 一对多、多对一关联查询
  5. 🔹 与Spring集成使用(SSM框架整合)
  6. 🔹 缓存机制(一级缓存、二级缓存)
  7. 🔹 分页插件 PageHelper
  8. 🔹 日志集成(如Log4j、SLF4J)

总结一下

系统架构设计图-2

学习要点 内容
MyBatis的作用 简化数据库操作,提高效率
核心组成 Mapper接口、XML、配置文件、SqlSession
实战目标 编写一个基于MyBatis的简单查询系统
关键技术点 数据库连接、SQL执行、对象映射
后续进阶方向 插入更新、动态SQL、整合Spring

如果你觉得这篇教程对你有用,请动手跟着做一遍!实践是最好的老师。

祝你早日成为MyBatis高手 👨‍💻✨

评论 0

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