mybatis入门(保姆级教程)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
前言
在 Java 开发领域,数据库操作始终是核心需求之一。MyBatis 作为一款流行的关系型数据库持久化框架,凭借其灵活性和简洁性,成为开发者入门和进阶的首选工具。本文将通过循序渐进的方式,结合实际案例,帮助编程初学者和中级开发者快速掌握 MyBatis 的核心概念与实战技巧。
一、MyBatis 是什么?为什么选择它?
1.1 MyBatis 的定位与优势
MyBatis 是一个基于 Java 的持久层框架,它简化了传统 JDBC 的复杂操作,同时避免了 ORM(对象关系映射)框架(如 Hibernate)的“侵入性”问题。它的核心思想是 SQL 语句与 Java 代码的解耦,通过 XML 或注解方式将 SQL 与业务逻辑分离。
形象比喻:可以将 MyBatis 视为一位“翻译官”,它将 Java 对象(如 POJO)与数据库表之间的交互,转化为开发者定义的 SQL 语句,从而降低开发复杂度。
1.2 MyBatis 的核心优势
- 灵活性:直接编写原生 SQL,适合复杂查询场景;
- 学习成本低:无需掌握复杂的 ORM 机制,适合编程新手快速上手;
- 性能可控:避免 ORM 框架的“黑箱操作”,开发者可直接优化 SQL;
- 社区支持完善:丰富的文档和插件生态(如分页插件、缓存插件)。
二、环境搭建与快速入门
2.1 项目准备
步骤 1:创建 Maven 项目
在 pom.xml
文件中添加 MyBatis 依赖:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.10</version>
</dependency>
步骤 2:准备数据库表
以用户管理系统为例,创建 user
表:
CREATE TABLE user (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE
);
2.2 第一个 MyBatis 程序:查询用户
步骤 1:编写配置文件
创建 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/mydb"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>
步骤 2:编写 Java 代码
通过 SqlSessionFactory
创建会话对象,并执行查询:
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisDemo {
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()) {
// 直接执行 SQL
List<Map<String, Object>> users = session.selectList("selectUsers");
for (Map<String, Object> user : users) {
System.out.println("Name: " + user.get("name"));
}
}
}
}
步骤 3:定义 SQL 语句
在 mapper
文件中添加 SQL:
<!-- user-mapper.xml -->
<select id="selectUsers" resultType="map">
SELECT id, name, email FROM user
</select>
三、MyBatis 核心概念详解
3.1 核心组件与工作流程
3.1.1 核心组件
- SqlSessionFactory:数据库会话工厂,负责创建
SqlSession
; - SqlSession:单线程数据库操作接口,包含增删改查方法;
- Mapper:接口与 SQL 的映射关系定义(XML 或注解方式)。
工作流程比喻:
想象一位厨师(SqlSessionFactory)根据菜单(配置文件)准备食材(数据库连接),然后由服务员(SqlSession)根据顾客点的菜(SQL 语句)执行烹饪(数据库操作)。
3.1.2 动态 SQL
MyBatis 提供 <if>
、<choose>
、<foreach>
等标签,实现条件化 SQL 组合。例如:
<select id="selectUsersByCondition" resultType="User">
SELECT * FROM user
WHERE 1=1
<if test="name != null">
AND name LIKE CONCAT('%', #{name}, '%')
</if>
<if test="email != null">
AND email = #{email}
</if>
</select>
3.2 与 ORM 框架的对比
特性 | MyBatis | Hibernate |
---|---|---|
SQL 控制权 | 开发者直接编写 SQL | 自动生成 SQL(可少量修改) |
学习曲线 | 较低(需熟悉 SQL) | 较高(需理解 ORM 机制) |
适用场景 | 复杂查询、性能敏感场景 | 快速开发、简单数据模型 |
四、实战:CRUD 操作与分页
4.1 基础 CRUD 操作
4.1.1 新增用户(Insert)
<!-- user-mapper.xml -->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user (name, email)
VALUES (#{name}, #{email})
</insert>
4.1.2 更新用户(Update)
<update id="updateUser">
UPDATE user
SET name = #{name}, email = #{email}
WHERE id = #{id}
</update>
4.1.3 删除用户(Delete)
<delete id="deleteUserById">
DELETE FROM user WHERE id = #{id}
</delete>
4.2 分页查询
通过 RowBounds
对象或插件实现分页。以下为 RowBounds
的简单示例:
int offset = 0;
int limit = 10;
List<User> users = session.selectList("selectUsers", null, new RowBounds(offset, limit));
五、高级特性:动态 SQL 与缓存
5.1 动态 SQL 进阶
5.1.1 <foreach>
标签
批量插入多条记录:
<insert id="insertUsers">
INSERT INTO user (name, email) VALUES
<foreach item="user" collection="list" separator=",">
(#{user.name}, #{user.email})
</foreach>
</insert>
5.2 二级缓存
在 mapper
文件中启用缓存:
<cache/>
通过 SqlSession
的 commit()
和 close()
方法触发缓存更新。
六、常见问题与解决方案
6.1 SQL 语句未生效
可能原因:未提交事务或未关闭 SqlSession
。
解决方案:在 SqlSession
关闭前调用 commit()
:
session.commit();
6.2 参数传递错误
常见错误:#{}
占位符参数名与 POJO 字段不匹配。
解决方法:检查 select
或 update
语句中的参数名是否与对象属性一致。
结论
通过本文的讲解,读者已掌握了 MyBatis 的基础配置、核心概念、CRUD 操作及高级特性。MyBatis 的灵活性和易用性使其成为中小型项目和性能敏感场景的首选框架。建议读者通过以下步骤进一步学习:
- 阅读官方文档,深入理解插件机制;
- 尝试使用注解(
@Mapper
)替代 XML 配置; - 结合 Spring Boot 简化 MyBatis 集成。
掌握 MyBatis 将为开发者打开数据库操作的大门,为后续学习 Spring Data JPA、数据库优化等进阶技术奠定坚实基础。