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

鲲鹏展翅
2025-06-17 12:42
阅读 444

一、开篇:什么是MyBatis?它是用来做什么的?

一、开篇:什么是MyBatis?它是用来做什么的?

在开发一个Java应用程序时,我们经常需要与数据库打交道。比如注册用户、查询订单、更新个人信息等操作,都需要访问数据库。

传统的做法是使用JDBC(Java Database Connectivity)来直接操作数据库,这虽然可行,但写起来很繁琐,而且容易出错。为了解决这个问题,市面上出现了很多“持久层框架”,它们可以帮助我们更高效、更安全地进行数据库操作。

MyBatis就是一个这样的框架。它并不是完全隐藏SQL语句,而是让程序员可以更方便地编写和管理SQL,同时减少重复代码。它特别适合那些希望控制SQL语句结构,又不想手写太多JDBC代码的人。

简单来说:

  • MyBatis是一个轻量级的Java ORM框架(对象关系映射)
  • 它帮助我们将Java对象与数据库中的表记录相互转换
  • 它简化了对数据库的操作,提高了开发效率

二、环境准备:搭建开发环境

缓存策略对比-1

二、环境准备:搭建开发环境

1. 开发工具准备

我们需要以下开发工具:

  • Java JDK 1.8及以上
  • Maven(用于项目依赖管理)
  • 数据库(如MySQL、PostgreSQL等)
  • IDE(推荐IntelliJ IDEA或Eclipse)

本文以MySQL数据库为例。

2. 创建一个Maven项目

如果你使用的是IDEA,可以这样创建项目:

  1. 打开IDEA → File → New → Project
  2. 选择 Maven
  3. 输入Group Id(例如 com.example)
  4. 输入Artifact Id(例如 mybatis-demo)
  5. 点击Finish完成创建

3. 引入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.26</version>
</dependency>

<!-- 日志支持 -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

注意:你可以到官网查找最新版本号。

4. 配置数据库连接信息

在资源目录下创建 resources/mybatis-config.xml 文件,这是MyBatis的核心配置文件:

<?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>

替换其中的数据库地址、用户名、密码为你本地的设置。

5. 初始化数据库表

我们新建一个简单的用户表用于测试:

CREATE DATABASE test_db;

USE test_db;

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的关键要素

1. SqlSessionFactory 和 SqlSession:MyBatis工作的起点

MyBatis的工作流程如下:

  • 通过读取配置文件得到一个 SqlSessionFactory
  • 由它创建一个 SqlSession 实例
  • 使用这个实例执行SQL语句并获取结果

示例代码:加载配置并打开会话

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;
import java.io.InputStream;

public class MyBatisDemo {
    public static void main(String[] args) throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        
        try (SqlSession session = sqlSessionFactory.openSession()) {
            // 使用session执行SQL
        }
    }
}

2. Mapper接口与XML映射文件:实现Java对象与数据库字段的对应

我们先创建一个Java类:

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

    // getter/setter略
}

再创建一个接口 UserMapper.java

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

然后在资源目录下创建映射文件 resources/mappers/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="UserMapper">
    <select id="selectUser" resultType="User">
        SELECT * FROM user WHERE id = #{id}
    </select>
</mapper>

这段代码的意思是:

  • 查询用户信息
  • 使用参数 #{id} 构造SQL语句
  • 将结果自动映射到 User 类的对象上

3. 使用Mapper接口调用SQL方法

修改主程序:

try (SqlSession session = sqlSessionFactory.openSession()) {
    UserMapper mapper = session.getMapper(UserMapper.class);
    User user = mapper.selectUser(1);
    System.out.println("用户名称:" + user.getName());
}

运行后应该输出:

用户名称:张三

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

微服务架构示意图-2

目标功能:

我们来实现一个简单的用户信息管理系统,包含以下功能:

  • 查询所有用户
  • 新增用户
  • 修改用户
  • 删除用户

1. 添加更多方法到UserMapper接口

public interface UserMapper {
    User selectUser(int id);
    
    List<User> getAllUsers();

    int insertUser(User user);

    int updateUser(User user);

    int deleteUser(int id);
}

2. 在XML文件中定义SQL

修改 UserMapper.xml

<select id="getAllUsers" resultType="User">
    SELECT * FROM user
</select>

<insert id="insertUser" parameterType="User">
    INSERT INTO user(name, email) VALUES(#{name}, #{email})
</insert>

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

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

3. 编写完整的测试类

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

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

            // 查询所有用户
            for (User user : mapper.getAllUsers()) {
                System.out.println(user.getName() + ", " + user.getEmail());
            }

            // 插入用户
            User newUser = new User();
            newUser.setName("李四");
            newUser.setEmail("lisi@example.com");
            mapper.insertUser(newUser);

            // 更新用户
            newUser.setName("李四更新");
            mapper.updateUser(newUser);

            // 删除用户
            mapper.deleteUser(newUser.getId());
        }
    }
}

这样我们就完成了一个完整的小型CRUD系统!


五、常见问题解答(FAQ)

Q1:为什么我运行时报错 “Cannot find class User”?

答:确保你在MyBatis配置文件或XML文件中正确引入了 User 类的位置。你可以在配置文件中添加包扫描:

<typeAliases>
    <package name="com.example.model"/>
</typeAliases>

或将 resultType="User" 改为完整的包路径,如:

resultType="com.example.model.User"

Q2:报错“无效的SQL语句”或者列名不对?

答:检查你的SQL语句是否和表字段一致,尤其是字段名是否拼写错误。也可以开启MyBatis的日志打印功能,查看实际执行的SQL语句。


Q3:事务提交失败怎么办?

答:默认情况下MyBatis不会自动提交事务,除非你设置了:

try (SqlSession session = sqlSessionFactory.openSession(true)) { ... }

true 表示自动提交。

如果想手动控制提交,则去掉参数,并显式调用:

session.commit();

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

恭喜你已经掌握了MyBatis的基础用法!下面是一些建议继续深入学习的方向:

✅ 学习Spring整合MyBatis

MyBatis单独使用虽好,但在企业级项目中通常要与 Spring框架 结合使用,利用Spring管理Bean生命周期。

✅ 掌握动态SQL语法

MyBatis的强大之处在于它的动态SQL能力,你可以使用 <if><choose><foreach> 等标签构建复杂查询条件。

✅ 学习延迟加载与缓存机制

MyBatis提供了二级缓存和延迟加载等功能,这对提高系统性能非常有帮助。

✅ 学习使用注解代替XML

除了使用XML文件,你还可以使用Java注解方式来编写SQL,更加简洁直观:

@Select("SELECT * FROM user WHERE id = #{id}")
User selectUser(int id);

总结

本教程从零开始介绍了MyBatis的基本使用,包括环境搭建、核心概念讲解、项目实战以及新手常见问题。希望你能通过动手实践快速上手这项技术,并逐步掌握其精髓。记住,编程最重要的是多写代码、勤加练习

如果你是初学者,建议一边看教程一边敲代码,亲手运行每一段示例,遇到问题随时查阅文档或搜索引擎。坚持下来,你也能成为熟练使用MyBatis的Java开发者!


作者:一名有着多年教学与实战经验的Java后端讲师

评论 0

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