1.Lokbom
一般情况下的Javabean是下面这样的,但这样代码看上去稍微有点长,不太美观,这时候我们可以使用lokbom注解使代码更美观更简短
public class Students {
private Long id;
private String sname;
private String grade;
public void setgrade(String grade) {
this.grade = grade;
}
public void setId(Long id) {
this.id = id;
}
public void setSname(String sname) {
this.sname = sname;
}
public Long getId() {
return id;
}
public String getgrade() {
return grade;
}
public String getSname() {
return sname;
}
@Override public String toString() {
return "Students[id:"+id+",sname"+sname+",grade"+grade+"]";
}
public Students(){
}
public Students(Long id,String sname,String grade){
this.id=id;
this.sname=sname;
this.grade=grade;
}
}
使用注解后:
@Data
@AllArgsConstructor
@ToString
public class Students {
private Long id;
private String sname;
private String grade;
}
就这样短短三个注解就和上面一大坨代码功能完全一样了,常用的注解主要如下:
@Data 注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法
@Setter :注解在属性上;为属性提供 setting 方法
@Getter :注解在属性上;为属性提供 getting 方法
@Log4j :注解在类上;为类提供一个 属性名为log 的 log4j 日志对象
@NoArgsConstructor :注解在类上;为类提供一个无参的构造方法
@AllArgsConstructor :注解在类上;为类提供一个全参的构造方法
@Synchronized : 加个同步锁
@SneakyThrows : 等同于try/catch 捕获异常
@NonNull : 如果给参数加个这个注解 参数为null会抛出空指针异常
@Value : 注解和@Data类似,区别在于它会把所有成员变量默认定义为private final修饰,并且不会生成set方法。
@ToString:注解在类上;为类提供toString方法(可以添加排除和依赖);
更多的详细信息请查看官方文档:https://projectlombok.org/features/all
2.JPA
JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。由于JPA内容比较多,所以这次主要讲一下javax.persistence中常用的一些注解:
@Entity : 标注用于实体类声明语句之前,指出该Java 类为实体类,将映射到指定的数据库表。如声明一个实体类 Student,它将映射到数据库中的 Student表上
@Table:当实体类与其映射的数据库表名不同名时需要使用 @Table 标注说明,该标注与 @Entity 标注并列使用,置于实体类声明语句之前,可写于单独语句行,也可与声明语句同行。@Table 标注的常用选项是 name,用于指明数据库的表名 。除此之外还有三个选项较为少用,catalog:指定数据库名称,schema:指定数据库的用户名,uniqueConstraints:指定唯一性字段约束(字段值唯一不重复)
@Id: 标注用于声明一个实体类的属性映射为数据库的主键列
@GeneratedValue: 用于标注主键的生成策略,通过strategy 属性指定。@GeneratedValue(generator="xxx",strategy= GenerationType.AUTO)。generator表示生成器的名字,属性和使用的ORM框架有关,用的较少,可以不写。strategy有四个选项:AUTO主键由程序控制, 是默认选项 ,不设置就是这个;IDENTITY 主键由数据库生成, 采用数据库自增长, 适合MYSQL ,Oracle不支持这种方式;SEQUENCE 通过数据库的序列产生主键, 适合Oracle,MYSQL 不支持;Table 提供特定的数据库产生主键, 该方式更有利于数据库的移植
@Column:指定字段的详细定义。name: 数据库字段的名称,默认与属性名称一致;nullable: 是否允许为null,默认为true
unique: 是否唯一,默认为false;length: 字段的长度,仅对String类型的字段有效;columnDefinition: 表示该字段在数据库中的实际类型,通常ORM框架根据属性类型自动判断数据库中字段的类型:例如:String的默认映射类型为VARCHAR,如果要将String类型映射到特定数据库的BLOB 或TEXT字段类型,该属性非常有用,如:@Column(name="BIRTH",nullable="false",columnDefinition="TEXT");insertable: 默认情况下,JPA假设所有列始终包含在SQL INSERT 语句中。如果该列不应包含在这些语句中,请将insertable设置为false;updatable:默认情况下,JPA假设所有列始终包含在 SQL UPDATE 语句中。如果该列不应包含在这些语句中,请将updatable 设置为false;table: 当实体类使用@SecondaryTable注解时会保存于多张表中,该字段指定实体类中的某个属性保存于到那张表,不设置时该属性,默认保存到与类名相同的默认表中。
@Basic:是默认Entity类的属性的默认注解。 即普通字段未加@Column注解,也会将其属性作为一个数据库的对应表的字段。
etch=FetchType.EAGER即时加载(默认值,即不写Basic注释的默认值),fetch=FetchType.LAZY 惰性加载;optional:指定在生成数据库结构时字段是否允许为null,(默认值为true,允许为空)
@Transient:表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性.也就是说数据库表中没有这个字段,操作数据库时会忽略这个属性
@Temporal:在核心的 Java API 中并没有定义 Date 类型的精度(temporal precision). 而在数据库中,表示 Date 类型的数据有 DATE, TIME, 和 TIMESTAMP 三种精度(即单纯的日期,时间,或者两者 兼备).在进行属性映射时可使用@Temporal注解来调整精度
@SecondaryTable:将一个实体映射到多个数据库表中
@Entity
@SecondaryTables({@SecondaryTable(name = "tb_sudent"), @SecondaryTable(name = "tb_teacher")})
public class People implements Serializable {
@Column(table = "tb_sudent")
private String sno;
@Column(table = "tb_sudent")
private String sname;
@Column(table = "tb_teacher")
private String course;
@Column(table = "tb_teacher")
private String tname;
}
@Entity
@Table(name = "tb_student",catalog = "tao",schema = "root")
public class Students {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long id;
@Column(name = "sname",unique = false,nullable = false,insertable = true,updatable = true,length = 255,precision = 0,scale = 0)
private String sname;
@Basic(optional = true,fetch = FetchType.LAZY)
private String grade;
@Temporal(TemporalType.DATE)
private Date birthday;
}
以上为常用注解,更多详细JPA注解请查看官方介绍:https://www.oracle.com/technetwork/middleware/ias/toplink-jpa-annotations-096251.html