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的核心地位不会变------这两个是映射数据库表的"基础门槛"。

相关推荐
鬼蛟1 小时前
什么是 Git
java
2301_766283442 小时前
怎样开启phpMyAdmin的操作审计日志_记录每条执行的SQL
jvm·数据库·python
y = xⁿ2 小时前
Redis八股学习日记:布隆过滤器
数据库·redis·学习
悟纤2 小时前
Seedance 2.0 API 文生视频 |支持100并发 | [灵龙AI API]
数据库·文生视频·seedance 2.0
直奔標竿2 小时前
SpringAI + RAG + MCP + Agent 零基础全栈实战(完结篇)| 27课完整汇总,Java开发者AI转型必看
java·开发语言·人工智能·spring boot·后端·spring
云烟成雨TD2 小时前
Spring AI 1.x 系列【31】向量数据库:进阶使用指南
java·人工智能·spring
czlczl200209252 小时前
MySQL 性能优化:前缀索引(Prefix Index)深度解析
数据库·mysql·性能优化
逍遥德2 小时前
SpringBoot数据库连接池HikariCP,Druid,Tomcat JDBC,DBCP2,c3p0配置使用
数据库·spring boot·tomcat
万邦科技Lafite2 小时前
京东开放API接口:item_get返回参数指南
java·前端·javascript·api·电商开放平台
曹牧2 小时前
Java:处理 HTTP 请求的 Content-Type
java·开发语言