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

算法边缘人
2025-06-15 01:55
阅读 372

一、开篇:MyBatis是什么?我能用它做什么?

一、开篇:MyBatis是什么?我能用它做什么?

你是否曾经为如何让Java程序与数据库打交道而感到困惑?是不是觉得直接写JDBC代码又繁琐又容易出错?别担心,MyBatis就是来帮助你的!

MyBatis 是一个轻量级的 Java持久层框架,它封装了我们操作数据库时重复的工作,比如创建连接、执行SQL语句、处理结果集等等。但与Hibernate这样的全自动ORM框架不同,MyBatis采用的是 半自动映射策略,也就是说——你可以灵活地控制SQL的编写和优化。

使用场景举例:

  • Web项目中需要对数据进行增删改查
  • 需要自定义复杂的查询逻辑
  • 希望在保留SQL灵活性的同时提高开发效率

简单来说:如果你正在开发一个需要用 Java 连接数据库的项目,并希望减少底层操作带来的麻烦,那么 MyBatis 会是一个非常适合的选择


二、环境准备:搭建第一个MyBatis开发环境

二、环境准备:搭建第一个MyBatis开发环境

为了顺利开始我们的学习之旅,首先要确保环境已经准备好:

第一步:安装JDK & IDE

  • 安装 JDK(推荐 JDK17 或以上版本)
  • 推荐使用 IntelliJ IDEA 作为开发工具(社区版即可)

第二步:添加Maven依赖

如果使用 Maven 项目,只需在 pom.xml 中加入如下依赖:

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

<!-- JDBC驱动,以MySQL为例 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.28</version>
</dependency>

小贴士:如果你不熟悉Maven,请先了解它的基本用法,它是现代Java项目不可或缺的构建工具。

第三步:创建测试数据库和表

创建一个简单的数据库 test_db 和一张用户表 users

CREATE DATABASE test_db;

USE test_db;

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    email VARCHAR(100)
);

三、核心概念:MyBatis的关键术语解释

三、核心概念:MyBatis的关键术语解释

学好任何一个框架,理解其关键概念是第一步。让我们从最基础的几个点开始介绍:

1. SqlSessionFactoryBuilder —— 构建工厂对象的工具类

这是用于创建 SqlSessionFactory 的构建器类,通常只用一次。

2. SqlSessionFactory —— 数据库工厂

就像工厂一样,用来生产数据库会话(SqlSession)。

3. SqlSession —— 数据库会话

可以理解为我们与数据库交互的一个“会话窗口”,所有数据库操作都通过它完成。

4. Mapper接口 + XML文件 —— SQL的管理和绑定

Mapper是一个接口,用于定义我们要执行哪些数据库方法,XML文件中则定义具体SQL语句,并与接口绑定。

示例说明:

假设我们想要查询所有用户信息,我们需要:

  • 编写一个名为 UserMapper 的接口
  • 编写一个对应的 XML 文件定义查询语句

这样设计的好处是:接口定义行为(方法),XML描述实现(SQL)。


四、实战项目:一步步完成一个简单的CRUD应用

我们将通过一个实战小项目掌握MyBatis的核心操作:实现对用户信息的增删改查功能

Step 1: 准备实体类 User.java

创建一个代表用户的Java类,用于存储数据。

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

    // Getters and Setters
}

Step 2: 创建Mapper接口 UserMapper.java

import java.util.List;

public interface UserMapper {
    List<User> getAllUsers();         // 获取所有用户
    User getUserById(Integer id);     // 按ID查询用户
    void insertUser(User user);       // 插入新用户
    void updateUser(User user);       // 更新用户信息
    void deleteUserById(Integer id);  // 删除用户
}

Step 3: 创建Mapper XML文件 UserMapper.xml

将该文件放在 resources/mappers/ 目录下:

<?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.UserMapper">
    
    <!-- 查询所有用户 -->
    <select id="getAllUsers" resultType="com.example.model.User">
        SELECT * FROM users
    </select>

    <!-- 按ID查询 -->
    <select id="getUserById" parameterType="int" resultType="com.example.model.User">
        SELECT * FROM users WHERE id = #{id}
    </select>

    <!-- 插入用户 -->
    <insert id="insertUser" parameterType="com.example.model.User">
        INSERT INTO users (name, email) VALUES (#{name}, #{email})
    </insert>

    <!-- 更新用户 -->
    <update id="updateUser" parameterType="com.example.model.User">
        UPDATE users SET name=#{name}, email=#{email} WHERE id=#{id}
    </update>

    <!-- 删除用户 -->
    <delete id="deleteUserById" parameterType="int">
        DELETE FROM users WHERE id = #{id}
    </delete>
</mapper>

Step 4: 配置MyBatis配置文件 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/test_db?useSSL=false&amp;serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="your_password"/>
            </dataSource>
        </environment>
    </environments>

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

Step 5: 编写主程序测试MyBatis功能 TestMain.java

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

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

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

        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);

            // 测试查询全部
            List<User> users = mapper.getAllUsers();
            System.out.println("当前用户列表:");
            for (User u : users) {
                System.out.println(u.getName() + " - " + u.getEmail());
            }

            // 添加一个用户
            User newUser = new User();
            newUser.setName("张三");
            newUser.setEmail("zhangsan@example.com");
            mapper.insertUser(newUser);
            session.commit();

            // 打印新增结果
            System.out.println("\n新增后:");
            users = mapper.getAllUsers();
            for (User u : users) {
                System.out.println(u.getName() + " - " + u.getEmail());
            }
        }
    }
}

服务器部署方案-1


五、常见问题解答

系统架构设计图-2

以下是新手常见的几个问题及解决办法:

❓ Q1:出现 “Invalid bound statement not found” 异常怎么办?

🔍 原因:MyBatis找不到对应的SQL语句,可能是因为命名空间(namespace)或SQL ID不匹配。

✅ 解决方案:

  • 确保 XML 中的 <mapper>namespace 与 Mapper 接口类路径一致。
  • 确认 SQL 标签如 <select>id 与接口方法名相同。
  • 确认 XML 文件被正确加载到配置中。

❓ Q2:无法获取数据库连接怎么办?

🔍 原因:可能是数据库配置错误、驱动未导入或网络异常。

✅ 解决方案:

  • 检查 mybatis-config.xml 中的 driver、url、用户名和密码是否正确。
  • 确保 MySQL 服务运行正常,且端口 3306 可访问。
  • 如果用的是远程数据库,确认防火墙设置允许连接。

❓ Q3:插入记录后,主键字段没有返回?

🔍 MyBatis默认不会自动设置生成的主键值。

✅ 解决方案:

  • <insert> 标签中增加 useGeneratedKeys="true" 以及指定 keyProperty="id" 属性:
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
    INSERT INTO users (name, email) VALUES (#{name}, #{email})
</insert>

六、学习建议:下一步怎么走?

恭喜你完成了MyBatis的第一个练习!接下来你可以尝试以下几个方向继续提升:

✔️ 学习动态SQL

MyBatis支持条件判断、循环等动态生成SQL的能力,如 <if><foreach> 等标签。

✔️ 集成Spring Boot

学会如何在实际Web项目中整合Spring Boot和MyBatis,能更好地应用于真实开发环境。

✔️ 学习MyBatis注解方式

除了XML方式,也可以使用纯Java注解来写SQL,更简洁也更适合小项目。

✔️ 练手项目推荐

试着做一个“员工管理系统”或者“博客系统”,完整练习增删改查+分页功能。


到这里,你就掌握了MyBatis的基础知识和初步实践能力。记住一句话:

“编程不是靠记笔记学会的,而是靠多敲代码练出来的。”

继续动手写吧,你会越来越熟练的!

评论 0

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