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 + '\'' +
'}';
}
}
必须有无参构造器:MyBatis查询数据后,需要通过反射实例化实体类,缺失会直接报错;
必须有Getter/Setter:用于给属性赋值、读取数据,实现数据封装;
属性名尽量和数据库字段一致:无需额外配置映射,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);
}
DAO 是接口,没有实现类,由MyBatis动态生成代理对象完成实现;
所有数据库操作都需要先在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接口的全类名,实现绑定 -->
<mapper namespace="com.qcby.dao.UserDao">
<!-- 查询所有用户 -->
<!-- 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>
<!-- 修改用户 -->
<update id="update" parameterType="com.qcby.entity.User">
update user
set username=#{username},sex=#{sex},birthday=#{birthday},address=#{address}
where id=#{id}
</update>
<!-- 删除用户 -->
<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查询用户为例,完整执行链路:
-
程序调用 :测试类/业务层调用
userDao.findUserById(1)方法; -
匹配方法 :MyBatis找到UserDao接口中的
findUserById方法; -
绑定SQL:根据DAO全类名+方法名,匹配Mapper文件中对应id的SQL语句;
-
执行SQL :MyBatis执行
select * from user where id = ?; -
数据封装 :将数据库查询到的一行数据,自动封装为User实体对象;
-
返回结果:将封装好的实体对象返回给调用方。
