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 开发领域,数据库操作始终是核心任务之一。随着项目复杂度的提升,传统的 JDBC 操作因代码冗余、灵活性不足等问题逐渐显现出局限性。此时,MyBatis 教程作为一款轻量级的持久层框架,凭借其“半自动”特性(即开发者仍需编写 SQL 语句但无需手动处理结果集)和高度可定制化的优势,成为许多开发者的首选工具。本文将从零开始,通过循序渐进的方式讲解 MyBatis 的核心概念、实战技巧及常见问题解决方案,帮助编程初学者和中级开发者快速掌握这一技术。
一、环境搭建与基础配置
1.1 项目准备
要开始学习 MyBatis,首先需要准备以下环境:
- Java 8+(建议使用最新版本)
- Maven(依赖管理工具)
- 数据库(如 MySQL、Oracle 等,本文以 MySQL 为例)
在 Maven 的 pom.xml
文件中添加 MyBatis 依赖:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
1.2 核心配置文件
创建 MyBatis 的全局配置文件 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/test_db"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
关键概念解释:
- SqlSessionFactory:类似于“咖啡机”,负责根据配置信息生成数据库连接会话(SqlSession)。
- SqlSession:类似于“咖啡杯”,直接执行 SQL 语句、提交或回滚事务。
二、核心概念与基础操作
2.1 实体类与映射关系
MyBatis 的核心是将数据库表字段与 Java 对象(POJO)进行映射。例如,创建一个 User
类:
public class User {
private Integer id;
private String name;
private Integer age;
// 省略构造器、Getter 和 Setter 方法
}
在对应的 Mapper 文件 UserMapper.xml
中定义 SQL 语句:
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectUserById" resultType="User">
SELECT id, name, age FROM user WHERE id = #{id}
</select>
</mapper>
关键点:
resultType
指定返回对象类型,MyBatis 会自动将列名与对象属性名匹配。#{id}
是预编译占位符,可防止 SQL 注入攻击。
2.2 CRUD 操作示例
通过 SqlSession
实现增删改查:
2.2.1 查询操作
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUserById(1);
System.out.println(user.getName());
}
2.2.2 插入操作
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user (name, age) VALUES (#{name}, #{age})
</insert>
Java 调用:
User newUser = new User(null, "Alice", 25);
mapper.insertUser(newUser);
System.out.println(newUser.getId()); // 自增主键回填
三、动态 SQL:让 SQL 更灵活
3.1 条件判断与循环
动态 SQL 允许根据参数值动态生成 SQL 语句,例如查询用户时可能带有可选的 name
和 age
筛选条件:
3.1.1 <if>
标签
<select id="selectUserByCondition" resultType="User">
SELECT * FROM user
WHERE 1=1
<if test="name != null">
AND name LIKE CONCAT('%', #{name}, '%')
</if>
<if test="age != null">
AND age >= #{age}
</if>
</select>
3.1.2 <foreach>
标签
处理批量操作,例如批量删除:
<delete id="deleteUsersByIds">
DELETE FROM user WHERE id IN
<foreach item="id" collection="ids" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
3.2 选择性更新
避免更新所有字段,仅更新非空值:
<update id="updateUser">
UPDATE user
SET
<set>
<if test="name != null">name = #{name},</if>
<if test="age != null">age = #{age}</if>
</set>
WHERE id = #{id}
</update>
四、高级特性与最佳实践
4.1 二级缓存与查询缓存
MyBatis 的二级缓存可缓存跨 SqlSession 的查询结果,需在配置文件中启用:
<cache/>
同时,在 Mapper 文件中通过 <cache>
标签自定义缓存策略,例如设置缓存过期时间:
<cache eviction="FIFO" flushInterval="60000"/>
4.2 分页查询优化
避免全表查询,使用 <select>
的 resultHandler
属性或结合分页插件(如 PageHelper):
PageHelper.startPage(1, 10);
List<User> users = mapper.selectAllUsers();
PageInfo<User> pageInfo = new PageInfo<>(users);
4.3 注解驱动的 Mapper
通过注解简化 XML 配置,例如:
@Mapper
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{id}")
User selectUserById(Integer id);
}
五、常见问题与解决方案
5.1 SQL 注入攻击
MyBatis 默认使用预编译语句,但需避免直接拼接 SQL 字符串。例如错误用法:
<!-- 错误示例 -->
<select id="selectUser" resultType="User">
SELECT * FROM user WHERE name = ${name}
</select>
应改为 #{name}
,利用参数占位符机制。
5.2 一对一与一对多关联
通过 <association>
和 <collection>
标签实现复杂映射:
<resultMap id="userWithDept" type="User">
<id property="id" column="user_id"/>
<result property="name" column="user_name"/>
<association property="department" javaType="Department">
<id property="id" column="dept_id"/>
<result property="name" column="dept_name"/>
</association>
</resultMap>
结论
通过本文的系统讲解,读者应已掌握 MyBatis 的核心配置、基础操作及高级特性。从环境搭建到动态 SQL 设计,再到缓存与分页优化,MyBatis 的灵活性与高效性使其成为 Java 持久层的有力工具。建议读者通过实际项目练习(如搭建用户管理系统),逐步深入理解框架原理。掌握 MyBatis 后,开发者不仅能提升代码质量,还能为后续学习 Spring Boot 整合 MyBatis 等进阶技术打下坚实基础。
关键词布局验证:
- MyBatis 教程贯穿全文,涵盖配置、操作及实战案例。
- 核心概念如动态 SQL、缓存等均通过代码示例与对比说明清晰呈现。
(总字数:约 2100 字)