MyBatis三大核心文件:Entity、DAO、Mapper

Entity装数据,DAO定方法,Mapper写SQL

  • Entity(实体类):数据库表的Java替身,专门用来封装数据

  • DAO(数据访问接口):定义数据库的操作行为,只声明、不实现

  • Mapper(XML映射文件):绑定DAO方法,编写真实执行的SQL语句

一、Entity 实体类

1. 核心作用

Entity是和数据库表一一对应 的Java实体类,也是整个数据交互的数据载体

简单对应关系:

  • 数据库表 → 对应一个Entity类

  • 数据库表字段 → 对应Entity类的成员属性

  • 数据库表的一行数据 → 对应Entity的一个对象

它的唯一使命:把数据库的表格数据,转换成Java能识别、操作的对象数据

2. 完整代码示例

以项目中常用的User用户表为例:

复制代码
package com.qcby.entity;

import java.util.Date;

/**
 * 用户实体类:对应数据库 user 表
 */
public class User {
    // 对应数据库字段
    private Integer id;         // 用户主键ID
    private String username;    // 用户名
    private String sex;         // 性别
    private Date birthday;      // 生日
    private String address;     // 地址

    // 【必填】无参构造器
    // MyBatis底层通过反射创建对象,必须依赖无参构造
    public User() {}

    // Getter & Setter 方法
    // 用于赋值和获取数据
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    // 重写toString:方便控制台打印查看数据
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", sex='" + sex + '\'' +
                ", birthday=" + birthday +
                ", address='" + address + '\'' +
                '}';
    }
}
  1. 必须有无参构造器:MyBatis查询数据后,需要通过反射实例化实体类,缺失会直接报错;

  2. 必须有Getter/Setter:用于给属性赋值、读取数据,实现数据封装;

  3. 属性名尽量和数据库字段一致:无需额外配置映射,MyBatis可自动封装数据;

二、DAO 接口

1. 核心作用

DAO 全称 Data Access Object(数据访问对象),本质是一个Java接口

它的核心特点:只定义方法,不写方法实现,不写SQL

简单来说:DAO 用来告诉程序,我们要对数据库做哪些操作(增删改查),统一数据库操作的规范。

2. 完整代码示例

复制代码
package com.qcby.dao;

import com.qcby.entity.User;
import java.util.List;

/**
 * 用户数据访问接口:定义所有用户表的数据库操作方法
 */
public interface UserDao {

    /**
     * 查询所有用户
     * @return 用户对象集合
     */
    List<User> findAll();

    /**
     * 根据ID查询单个用户
     * @param id 用户ID
     * @return 单个用户对象
     */
    User findUserById(Integer id);

    /**
     * 新增用户
     * @param user 封装了用户数据的实体对象
     * @return 数据库受影响的行数
     */
    int insert(User user);

    /**
     * 修改用户信息
     * @param user 封装了修改数据的实体对象
     * @return 数据库受影响的行数
     */
    int update(User user);

    /**
     * 根据ID删除用户
     * @param id 用户ID
     * @return 数据库受影响的行数
     */
    int delete(Integer id);
}
  1. DAO 是接口,没有实现类,由MyBatis动态生成代理对象完成实现;

  2. 所有数据库操作都需要先在DAO中定义方法,否则无法执行;

三、Mapper XML文件

1. 核心作用

如果说DAO是定义了「要做什么」,那Mapper XML就是定义「具体怎么做」。

Mapper是MyBatis的SQL映射文件,核心功能:

  • 编写原生SQL语句;

  • 将SQL语句与DAO接口的方法一一绑定;

  • 配置参数类型、返回值类型,完成数据映射。

Mapper就是DAO接口的真正实现者

2. 完整代码示例

复制代码
<?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">

<!-- namespace:必须对应DAO接口的全类名,实现绑定 --&gt;
&lt;mapper namespace="com.qcby.dao.UserDao"&gt;

    <!-- 查询所有用户 -->
    <!-- id:对应DAO接口的方法名;resultType:返回值实体类全路径 -->
    <select id="findAll" resultType="com.qcby.entity.User">
        select * from user
    </select>

    <!-- 根据ID查询用户 -->
    <!-- parameterType:传入参数类型 -->
    <select id="findUserById" parameterType="int" resultType="com.qcby.entity.User">
        select * from user where id = #{id}
    </select>

<!-- 新增用户 -->
    <insert id="insert" parameterType="com.qcby.entity.User">
        insert into user(username,sex,birthday,address)
        values(#{username},#{sex},#{birthday},#{address})
    </insert&gt;

    <!-- 修改用户 -->
    <update id="update" parameterType="com.qcby.entity.User">
        update user
        set username=#{username},sex=#{sex},birthday=#{birthday},address=#{address}
        where id=#{id}
    &lt;/update&gt;

    <!-- 删除用户 -->
    <delete id="delete" parameterType="int">
        delete from user where id=#{id}
    </delete>

</mapper>
  • namespace:绑定DAO接口全路径,是Mapper和DAO关联的核心;

  • id:必须和DAO接口的方法名完全一致,实现方法与SQL绑定;

  • parameterType:指定传入SQL的参数类型(基本类型/实体类);

  • resultType:指定SQL执行后,返回数据的封装类型;

  • #{参数名}:MyBatis参数占位符,安全传参,彻底杜绝SQL注入问题。

四、三者关系

根据ID查询用户为例,完整执行链路:

  1. 程序调用 :测试类/业务层调用 userDao.findUserById(1) 方法;

  2. 匹配方法 :MyBatis找到UserDao接口中的 findUserById 方法;

  3. 绑定SQL:根据DAO全类名+方法名,匹配Mapper文件中对应id的SQL语句;

  4. 执行SQL :MyBatis执行 select * from user where id = ?

  5. 数据封装 :将数据库查询到的一行数据,自动封装为User实体对象

  6. 返回结果:将封装好的实体对象返回给调用方。

相关推荐
MandalaO_O12 小时前
MyBatis:核心概念 + 环境搭建 + CRUD
java·tomcat·mybatis
XS03010614 小时前
MyBatis基础实战笔记一
笔记·mybatis
噢,我明白了14 小时前
MyBatis-Plus的引入和配置
java·tomcat·mybatis
霸道流氓气质17 小时前
Spring Boot + MyBatis-Plus 实现异常隔离的 Upsert 数据落库(含远程调用数据补全)
spring boot·后端·mybatis
Devin~Y18 小时前
大厂Java面试实战:Spring Boot微服务、Redis缓存、Kafka消息队列与Spring AI RAG
java·spring boot·redis·kafka·mybatis·spring mvc·hikaricp
Don.TIk1 天前
ChapterOne-搭建项目骨架
java·spring·spring cloud·mybatis
南极企鹅1 天前
事务&@Transactional注解
java·数据库·spring·oracle·mybatis
隐退山林2 天前
JavaEE进阶:MyBatis 操作数据库(入门)
数据库·java-ee·mybatis
Devin~Y2 天前
互联网大厂 Java 面试实录:JVM、Spring Boot、MyBatis、Redis、Kafka、Spring AI、K8s 全链路追问小Y
java·jvm·spring boot·redis·kafka·mybatis·spring security