Java 类映射数据库表的核心规则

一、核心注解的作用(先搞懂"为什么这么写")

你贴的代码是JPA(Java Persistence API,Java持久化规范)的基础用法,目的是让「Java类」和「数据库表」建立映射关系,不用手动写SQL创建表、插数据。

注解 作用(大白话) 是否"固定"
@Entity 标记这个类是「实体类」,对应数据库里的一张表 必须有(想映射表就必须加)
@Id 标记这个字段是表的「主键」(唯一标识一行数据) 必须有(每张表都得有主键)
基础映射规则(默认行为)

JPA会按"约定优于配置"的规则自动映射,不用额外配置时:

  1. 类名 → 表名Student 类默认对应数据库里的 student 表(类名首字母小写);
  2. 字段名 → 列名id 字段对应 id 列,name 对应 name 列,age 对应 age 列;
  3. 字段类型 → 列类型Long → 数据库的 BIGINTStringVARCHARIntegerINT

二、"固定格式"的边界(哪些必须有,哪些能灵活改)

1. 必须遵守的"硬性规则"(改了就映射失败)
  • @Entity 必须加在类上(不能加在方法/字段上),且类必须是「普通Java类」(不能是抽象类、接口);
  • @Id 必须加在主键字段上(每张表必须有主键,JPA强制要求);
  • ✅ 实体类必须有无参构造器(你贴的代码里没写,但JPA会自动生成默认的无参构造器,显式写出来更规范)。
2. 可以灵活调整的"非固定格式"(按需定制)

实际开发中,默认映射往往满足不了需求,比如表名不想用类名小写、列名想自定义、主键想自增等,这时可以加额外注解调整:

示例:定制化映射(更贴近实际开发)
java 复制代码
import jakarta.persistence.*; // Spring Boot 3.x用jakarta,2.x用javax

@Entity
@Table(name = "t_student") // 自定义表名(默认是student,改成t_student)
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 主键自增(数据库自动生成id)
    private Long id;

    @Column(name = "stu_name", length = 50, nullable = false) // 自定义列名+长度+非空
    private String name;

    @Column(name = "stu_age") // 自定义列名
    private Integer age;

    // 显式写无参构造器(推荐,避免JPA反射失败)
    public Student() {}

    // 可选:有参构造器、getter/setter
    public Student(Long id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    // getter/setter(必须有,JPA要通过反射读写字段)
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public Integer getAge() { return age; }
    public void setAge(Integer age) { this.age = age; }
}

这里头this 的作用是区分重名:区分类的成员变量和方法的参数变量

关键定制化注解说明:
  • @Table(name = "t_student"):指定类对应的数据表名(解决"类名和表名不一致"的问题);
  • @GeneratedValue(strategy = GenerationType.IDENTITY):设置主键自增(插入数据时不用手动传id,数据库自动生成);
  • @Column(name = "stu_name", length = 50, nullable = false)
    • name:自定义列名(比如name字段对应stu_name列);
    • length:设置字符串列的长度(默认255,改成50更合理);
    • nullable = false:设置列非空(数据库层面限制,避免插入空值)。

三、常见误区(新手必避)

  1. 以为@Entity是"固定格式"就不能改@Entity只是标记类为实体,配合@Table能自定义表名、表的索引等;
  2. @Id只加在Long类型上 :主键可以是Integer/String等(比如用字符串做主键),但Long是最常用的(支持大数自增);
  3. 忘了加getter/setter:JPA通过反射读写字段,没有getter/setter会导致"能插入数据但查不出来";
  4. Spring Boot 2.x和3.x的包名差异 :2.x用javax.persistence.*,3.x用jakarta.persistence.*,导包错了会报错。

总结

  1. 核心固定规则
    • @Entity必须加在类上(想映射表就必须有);
    • @Id必须加在主键字段上(每张表必须有主键);
    • 实体类必须有无参构造器(显式/隐式均可)。
  2. 灵活调整点
    • @Table自定义表名;
    • @Column自定义列名、长度、非空等;
    • @GeneratedValue设置主键自增策略。
  3. 核心逻辑:JPA的映射是"约定优于配置",默认规则能满足基础需求,特殊场景加注解定制即可。

@Entity@Id的核心地位不会变------这两个是映射数据库表的"基础门槛"。

相关推荐
oradh2 小时前
Oracle 19c数据库软件和数据库静默安装
数据库·oracle·oracle19c·oracle 19c安装
星辰_mya2 小时前
Redis 锁的“续命”艺术:看门狗机制与原子性陷阱
数据库·redis·分布式·缓存·面试
阳光下的米雪2 小时前
存储过程的使用以及介绍
java·服务器·数据库·pgsql
ruanyongjing2 小时前
Navicat for MySQL下载安装教程
数据库·mysql
yoyo_zzm2 小时前
Spring Boot 各种事务操作实战(自动回滚、手动回滚、部分回滚)
java·数据库·spring boot
Teable任意门互动2 小时前
中小企业进销存实战:Teable多维表格从零搭建高效库存管理系统
开发语言·数据库·excel·飞书·开源软件
Y001112362 小时前
Day7-MySQL-约束
数据库·sql·mysql
tuyanfei2 小时前
Spring 简介
java·后端·spring
遥遥晚风点点2 小时前
JAVA http请求报错:unable to find valid certification path to requested target
java·网络·网络协议·http