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

开源路边摊
2025-06-25 22:14
阅读 575

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

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

在Java开发中,我们经常需要和数据库打交道。比如保存用户注册信息、读取商品库存、更新订单状态等。传统的做法是使用JDBC(Java Database Connectivity)来操作数据库,虽然可行,但写起来很繁琐。

这时候,MyBatis就派上用场了。它是一个轻量级的Java持久层框架,简单来说,就是帮助你更方便地连接数据库并进行数据操作,同时又保留对SQL语句的控制权。

MyBatis的特点:

  • 简化数据库操作
  • 不强制ORM(对象关系映射),适合喜欢写SQL的人
  • 支持动态SQL
  • 轻量、易集成到Spring等主流框架中

如果你是初学者,可以把MyBatis理解为“帮你少写很多重复代码”的工具包。下面我们就从环境搭建开始一步步学习它吧!


二、环境准备:搭建你的第一个MyBatis项目

二、环境准备:搭建你的第一个MyBatis项目

所需工具清单:

工具 说明
JDK 1.8+ Java运行环境
IDE 推荐使用IntelliJ IDEA或Eclipse
Maven 用于管理依赖
MySQL 5.7+ 数据库服务器
MyBatis依赖 在pom.xml中添加即可

步骤1:创建Maven项目

打开IDEA → New Project → Maven → 勾选Create from archetype → 选择maven-archetype-quickstart → 填写GroupId(如com.example)、ArtifactId(如mybatis-demo)

生成后的结构如下:

mybatis-demo/
├── pom.xml
└── src
    ├── main
    │   └── java
    └── test
        └── java

步骤2:配置pom.xml添加MyBatis和MySQL驱动依赖

<!-- 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>
</dependencies>

步骤3:配置MyBatis全局配置文件 mybatis-config.xml

resources 文件夹下新建 mybatis-config.xml

<!-- 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/testdb?useSSL=false&amp;serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 关联Mapper文件 -->
    <mappers>
        <mapper resource="mappers/UserMapper.xml"/>
    </mappers>
</configuration>

数据流转过程-1

确保你已经创建了一个名为testdb的数据库,并创建了一个简单的表:

-- SQL
CREATE TABLE user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100),
    email VARCHAR(100)
);

插入一条测试数据:

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

三、核心概念讲解:MyBatis的三个关键词

1. SqlSessionFactory(会话工厂)

可以理解为一个生产“数据库连接”的工厂。有了它,才能执行SQL语句。

String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

2. SqlSession(会话)

相当于一次数据库连接,在这个连接里你可以执行各种SQL语句:

try (SqlSession session = sqlSessionFactory.openSession()) {
    // 操作数据库在这里进行
}

3. Mapper接口与XML文件

这是MyBatis最核心的概念之一。你可以定义一个接口(如UserMapper.java),然后在对应的XML文件(UserMapper.xml)中写SQL语句,通过绑定的方式来调用。

例如:

// UserMapper.java
public interface UserMapper {
    User selectUser(int id);
}
<!-- mappers/UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectUser" resultType="com.example.model.User">
        SELECT * FROM user WHERE id = #{id}
    </select>
</mapper>

这样我们就可以直接用接口调用SQL:

UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUser(1);
System.out.println(user.getName());

四、实战项目:用MyBatis完成CRUD

我们以一个简单的“用户管理系统”为例,演示如何使用MyBatis完成基本的数据增删改查操作。

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

package com.example.model;

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

    // getter / setter / toString
}

步骤2:编写Mapper接口 UserMapper.java

package com.example.mapper;

import com.example.model.User;
import java.util.List;

public interface UserMapper {
    List<User> selectAllUsers();

    User selectUserById(int id);

    void insertUser(User user);

    void updateUser(User user);

    void deleteUser(int id);
}

步骤3:编写Mapper XML文件 UserMapper.xml

<!-- mappers/UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectAllUsers" resultType="com.example.model.User">
        SELECT * FROM user
    </select>

    <select id="selectUserById" resultType="com.example.model.User">
        SELECT * FROM user WHERE id = #{id}
    </select>

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

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

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

步骤4:编写主程序 TestMyBatis.java

import com.example.mapper.UserMapper;
import com.example.model.User;
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 TestMyBatis {
    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()) {
            UserMapper mapper = session.getMapper(UserMapper.class);

            // 查询所有用户
            List<User> users = mapper.selectAllUsers();
            for (User u : users) {
                System.out.println(u);
            }

            // 插入新用户
            User newUser = new User();
            newUser.setName("李四");
            newUser.setEmail("lisi@example.com");
            mapper.insertUser(newUser);
            session.commit(); // 注意:记得提交事务
        }
    }
}

运行后,你应该能在数据库中看到新增的“李四”。


五、常见问题解答

Q1:MyBatis为什么不用自动映射字段名?
答:为了灵活性。有些字段可能和Java属性不同名,或者需要自定义处理逻辑。当然也支持自动映射,加上 <mapUnderscoreToCamelCase>true</mapUnderscoreToCamelCase> 即可。

Q2:为何不使用Hibernate而选择MyBatis?
答:MyBatis更适合那些希望掌控SQL语句、追求性能优化的团队;Hibernate则更适合完全ORM场景。

Q3:插入数据后获取主键值怎么办?
答:可以用 <selectKey> 或者设置 useGeneratedKeys 和 keyProperty:

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

Q4:MyBatis是否必须使用XML写SQL?
答:不是。也支持使用注解方式写SQL,适合简单查询,但复杂SQL推荐XML。


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

恭喜你完成了第一个MyBatis项目!接下来可以按以下路径继续学习:

第一阶段:掌握进阶功能

  • 动态SQL(if、choose、foreach)
  • 结果集映射(resultMap)
  • 注解式编程(@Select/@Update等)
  • 缓存机制(一级/二级缓存)

第二阶段:整合Spring和Spring Boot

  • 整合Spring使用MyBatis-Spring模块
  • 使用Spring Boot + MyBatis Starter简化配置
  • 实践RESTful API开发

第三阶段:企业级项目实践

  • 使用PageHelper实现分页
  • MyBatis Generator自动生成代码
  • MyBatis Plus增强功能
  • 与Spring Security结合做权限控制

总结

服务器部署方案-2

本篇文章作为一篇面向零基础读者的《MyBatis基础教程》,我们从环境搭建讲起,逐步介绍了核心概念、实战示例以及常见问题解答。MyBatis虽然不封装SQL语句,但它提供的灵活性和可控性让它成为了很多Java开发者的心头好。

记住一点:实践才是最好的老师。多敲代码、多查文档,你会很快熟练掌握这个强大的工具!

如果你觉得这篇文章对你有帮助,欢迎点赞、收藏并关注后续内容 😊

评论 0

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