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 语句,例如查询用户时可能带有可选的 nameage 筛选条件:

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 字)

最新发布