写Java程序时,经常要和ref="/tag/1/" style="color:#B2A89E;font-weight:bold;">数据库打交道。比如做个用户管理系统,得把用户信息存进MySQL。以前手动拼SQL又麻烦又容易出错,现在大家都用ORM框架,像Hibernate、MyBatis Plus这些,能自动把Java对象和数据库表对应起来。关键就是靠“注解”。
什么是ORM注解
简单说,注解就是加在Java类或字段上的小标签,告诉框架:“这个类对应哪张表”“这个字段对应哪个字段”。不用写一堆配置文件,代码更清爽。
@Entity 和 @Table:标明数据库表
比如你有个User类,想让它对应数据库里的user_table表,就这么写:
@Entity
@Table(name = "user_table")
public class User {
private Long id;
private String name;
}
@Entity说明这是一个实体类,@Table指定具体表名。不写name的话,默认用类名转成下划线格式当表名,比如User变成user。
@Id 和 @GeneratedValue:主键怎么生成
数据库每条记录都得有主键。Java里用@Id标出哪个是主键字段:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
上面这段意思是id字段是自增主键,数据库会自动给它分配一个唯一数字,比如1、2、3……常见策略还有SEQUENCE、AUTO等,看数据库类型选。
@Column:字段映射细节
不是所有字段名字都和数据库一样。比如Java习惯用驼峰命名userName,但数据库可能是user_name。这时候用@Column:
@Column(name = "user_name")
private String userName;
还能设置长度、是否为空:
@Column(name = "user_name", length = 50, nullable = false)
private String userName;
实际场景:加个邮箱字段忘了注解
小李写完User类,测试时发现新增用户报错,提示“unknown column email”。一看数据库表,确实没email字段。他以为加了private String email就行,其实框架不知道要不要映射这个字段。
解决办法有两个:要么加上@Column,让框架生成对应字段;要么加@Transient,明确告诉框架“别管这个字段”:
// 映射到数据库
@Column(name = "email")
private String email;
// 或者不映射
@Transient
private String email;
关联关系:一对多咋整
比如一个用户有多个订单,Order类里可以这样关联:
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
@ManyToOne表示“多对一”,多个订单对应一个用户。@JoinColumn指定外键字段名。查订单的时候,直接order.getUser().getName()就能拿到用户名,不用手动join表。
用好这些注解,能省下大量SQL手写时间,也减少拼错字段的低级错误。刚开始可能记不住每个注解的作用,多写几次就顺了。遇到问题先看报错信息,很多时候是某个字段没标注@Column或者写了不该写的@Transient。