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

低调写码
2025-06-25 16:20
阅读 348

开篇:MyBatis是什么?用来做什么?

开篇:MyBatis是什么?用来做什么?

在Java开发中,我们经常需要和数据库打交道。比如做学生管理系统、电商网站、博客平台等,都离不开数据库存储数据。

传统的做法是直接使用JDBC(Java Database Connectivity)来操作数据库,但这有一个问题:代码会变得非常繁琐。我们要自己写连接数据库的代码、处理结果集、手动拼接SQL语句等等,不仅效率低,还容易出错。

于是就有了 MyBatis 这个框架,它的作用就是帮助我们简化这些重复性的数据库操作工作,同时又不隐藏 SQL 语句(相比Hibernate等ORM框架更灵活),让我们可以像写原生SQL一样自由地控制数据库操作。

简单说,MyBatis 就是一个 Java 程序员的好帮手,它让你更轻松地和数据库“对话”


环境准备:搭建开发环境

环境准备:搭建开发环境

要使用 MyBatis,我们需要以下几个工具或库:

✅ 所需软件清单:

名称 版本建议 说明
JDK 1.8 或以上 Java 开发工具包
Maven 最新版 自动管理项目依赖
MySQL 5.7 或以上 数据库服务器
IntelliJ IDEA 社区版即可 编程 IDE,推荐使用

💻 安装步骤简述:

  1. 安装JDK

  2. 安装Maven

  3. 安装MySQL

  4. 安装 IntelliJ IDEA


核心概念:用最简单的语言解释关键概念

在正式写代码之前,我们先了解几个核心概念:


🧠 1. 什么是 ORM?

  • ORM 全称是 Object Relational Mapping(对象关系映射)

  • 通俗点说,就是把数据库中的表变成 Java 对象来操作

  • 举个例子:

    数据库记录(student表) Java类
    id: 1, name: 张三, age: 20 Student对象:stu.id=1, stu.name="张三", stu.age=20

这样你就可以通过操作 Java 对象间接操作数据库了!


🧠 2. 什么是 MyBatis 的 Mapper 文件?

  • 可以理解为“SQL 映射文件”
  • 在这个文件里,你可以写下各种 SQL 查询语句,并给它们一个“名字”
  • 后面 Java 代码就可以调用这些 SQL 并得到结果

例如:

<select id="selectStudentById" resultType="Student">
    SELECT * FROM student WHERE id = #{id}
</select>

🧠 3. 什么是 MyBatis 的 Configuration 配置文件?

就是一个 XML 文件,告诉 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/testdb"/>
                <property name="username" value="root"/>
                <property name="password" value="your_password"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="mapper/studentMapper.xml"/>
    </mappers>
</configuration>

🧠 4. 什么是 Dao 和 Mapper 接口?

  • Dao 是 Data Access Object(数据访问对象),用于封装对数据库的操作
  • Mapper 接口 是 Dao 的一种形式,接口方法和 XML 中的 SQL ID 一一对应
  • 例如:
public interface StudentMapper {
    Student selectStudentById(int id);
}

对应的 XML 就是上面写的那个 selectStudentById 方法中的 SQL。


🧠 总结一下核心组件的关系图:

MyBatis 工作流程:
[Java程序] → 调用 [Mapper接口] → 匹配 [XML配置文件中的SQL] → 执行SQL → 返回结果(如Student对象)

实战项目:跟着教程一步步完成一个简单项目

我们现在来做一个小项目:查询学生信息


🛠️ 第一步:创建数据库和表

打开 MySQL,执行以下语句:

CREATE DATABASE testdb;
USE testdb;

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

INSERT INTO student (name, age) VALUES ('张三', 20), ('李四', 22);

📁 第二步:新建 Maven 项目结构

用 IntelliJ IDEA 创建 Maven 项目,目录如下:

mybatis-demo/
├── src/
│   ├── main/
│   │   ├── java/               # Java 源码
│   │   └── resources/           # 配置文件和 mapper XML
├── pom.xml                      # Maven 项目配置文件

📦 第三步:添加 MyBatis 依赖到 pom.xml

<dependencies>
    <!-- MyBatis 核心 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.9</version>
    </dependency>

    <!-- MySQL 驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.28</version>
    </dependency>

    <!-- 日志输出(可选) -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
</dependencies>

别忘了运行 mvn clean install 下载依赖!


⚙️ 第四步:编写配置文件 config.xml

放在 src/main/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/testdb"/>
        <property name="username" value="root"/>
        <property name="password" value="你的密码"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="mapper/studentMapper.xml"/>
  </mappers>
</configuration>

🗂️ 第五步:编写 studentMapper.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="StudentMapper">

  <select id="selectStudentById" resultType="Student">
    SELECT * FROM student WHERE id = #{id}
  </select>

</mapper>

📄 第六步:编写 Student.java 类

创建包 com.example.model.Student

package com.example.model;

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

    // 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 int getAge() { return age; }
    public void setAge(int age) { this.age = age; }

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

微服务架构示意图-2

🧪 第七步:编写测试类 TestMyBatis.java

package com.example.test;

import com.example.model.Student;
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;

public class TestMyBatis {
    public static void main(String[] args) throws Exception {
        String resource = "config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        try (SqlSession session = sqlSessionFactory.openSession()) {
            StudentMapper mapper = session.getMapper(StudentMapper.class);
            Student student = mapper.selectStudentById(1);
            System.out.println(student);
        }
    }
}

系统架构设计图-1


🔌 第八步:补充 Mapper 接口 StudentMapper.java

package com.example.mapper;

import com.example.model.Student;

public interface StudentMapper {
    Student selectStudentById(int id);
}

🎉 第九步:运行程序看结果!

右键点击 TestMyBatis.java 运行主函数,如果看到类似下面的输出说明成功:

Student{id=1, name='张三', age=20}

🎉 恭喜你!这是你第一个完整的 MyBatis 程序!


常见问题:新手常遇到的问题和解答

❓ 为什么提示找不到 mapper.xml?

✅ 确保:

  • mapper/studentMapper.xml 正确存在于资源目录下
  • config.xml 中的 <mapper> 标签路径正确无误

❓ 报错 “Invalid bound statement (not found): xxx.xxx”

✅ 确保:

  • Mapper 接口的方法名必须与 XML 中的 id 完全一致
  • Mapper 接口要被注册进 MyBatis 的配置
  • 使用正确的命名空间:namespace="接口全限定名",比如:
<mapper namespace="com.example.mapper.StudentMapper">

❓ 为什么没有自动将查询结果封装成 Java 对象?

✅ 确保:

  • resultType 写的是对应的 Java 类完整路径,或者设置了类型别名(后续进阶内容)
  • 数据库字段名与 Java 类属性名一致(或者使用 resultMap)

❓ 如何查看 MyBatis 执行的实际 SQL?

✅ 添加日志支持(前面已经加了 log4j 依赖),在 resources 新建 log4j.properties

log4j.rootLogger=DEBUG, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

这样你就能在控制台看到真实的 SQL 输出啦!


学习建议:下一步学习什么?

恭喜你完成了 MyBatis 的入门!接下来你可以学习以下内容来深入掌握:

🔍 1. 更多 CRUD 操作

  • 插入数据 insert
  • 更新数据 update
  • 删除数据 delete

语法格式类似,只需要修改 <insert><update> 标签即可。


💬 2. 动态 SQL

MyBatis 支持非常强大的动态 SQL,比如:

  • <if> 条件判断
  • <foreach> 循环遍历参数列表
  • <set> 用于更新操作时自动生成 SET 子句

适合复杂查询条件的场景。


🔄 3. 多表关联查询

学会如何进行一对一、一对多、多对多的关联查询(需要用到 <association><collection>)。


🔐 4. 事务管理

学会控制事务,确保多个数据库操作要么全部成功,要么全部失败回滚。


🧩 5. 整合 Spring Boot

MyBatis + Spring Boot 组合是目前主流的 Web 开发框架之一,你会学到注解式编程、自动装配等内容。


✅ 总结回顾

今天我们从零开始,搭建了一个 MyBatis 项目,实现了基本的数据查询功能,掌握了以下核心知识:

  • 什么是 MyBatis,它的作用和优势
  • 如何配置开发环境
  • MyBatis 的核心组成(配置文件、Mapper接口、SQL XML文件)
  • 编写了第一个完整的 MyBatis 应用程序
  • 解答了一些新手常见问题
  • 提供了进一步学习的方向

继续努力吧,MyBatis 的大门才刚刚为你打开!如果你觉得这篇教程有帮助,欢迎收藏+点赞,后续还会带来更多实战教程哦!


📍 附:GitHub 示例地址(假设你有一个公开仓库)

如需源码打包下载,请留言“要源码”我会回复网盘链接。

祝你学得开心,用得顺手!😊

评论 0

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