Spring JPA 註解對映關係、lombok
技術標籤:Spring
@Id
指定實體的主鍵。該屬性通常置於屬性宣告語句之前,可與宣告語句同行,也可寫在單獨行上。
@GeneratedValue
用於標註主鍵的生成策略,通過strategy 屬性指定。預設情況下,JPA 自動選擇一個最適合底層資料庫的主鍵生成策略:SqlServer對應identity,MySQL 對應 auto increment。
在javax.persistence.GenerationType中定義了以下幾種可供選擇的策略:
- IDENTITY:採用資料庫ID自增長的方式來自增主鍵欄位,Oracle 不支援這種方式;
- AUTO: JPA自動選擇合適的策略,是預設選項;
- SEQUENCE:通過序列產生主鍵,通過@SequenceGenerator 註解指定序列名,MySql不支援這種方式
- TABLE:通過表產生主鍵,框架藉由表模擬序列產生主鍵,使用該策略可以使應用更易於資料庫移植。
@GeneratedValue(strategy=GenerationType.AUTO) @Id private Integer id; 或 @GeneratedValue(strategy=GenerationType.AUTO) @Id public Integer getId() { return id; }
@Column註解
用來標識實體類中屬性與資料表中欄位的對應關係,可置於屬性的getter方法之前。
- name:表中列的名稱。預設為屬性或欄位名。
- unique:該列是否為唯一鍵,預設為false。如果表中有一個欄位需要唯一標識,則既可以使用該標記,也可以使用@Table標記中的
- nullable:資料庫列是否為空。預設為true
- insertable:表示在使用“INSERT”指令碼插入資料時,是否需要插入該欄位的值。
- updatable:表示在使用“UPDATE”指令碼插入資料時,是否需要更新該欄位的值。
- insertable和updatable屬性一般多用於只讀的屬性,例如主鍵和外來鍵等。這些欄位的值通常是自動生成的。
- columnDefinition:(大多數情況,幾乎不用)表示建立表時,該欄位建立的SQL語句,一般用於通過Entity生成表定義時使用。(也就是說,如果DB中表已經建好,該屬性沒有必要使用。)
- table:表示當對映多個表時,指定表的表中的欄位。預設值為主表的表名。
- length:表示欄位的長度,當欄位的型別為varchar時,該屬性才有效,預設為255個字元。
- precision:十進位制(精確數字)列的精度,當欄位型別為double時,precision表示數值的總長度,
- scale:小數點所佔的位數。僅當使用十進位制列時適用
@Column(name = "id", length = 20, nullable = false) private int id; 或 @Column(name = "id", length = 20, nullable = false) public int getId() { return id; }
@JoinTable
指定關聯的對映
@JoinColumn
用來指定與所操作實體或實體集合相關聯的資料庫表中的列欄位
@OneToOne(一對一)
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "address_id")
private Address address;
@OneToMany(一對多)
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "department_id")
private List<Employee> employees;
@ManyToOne(多對一)
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "department_id")
private Department department;
@ManyToMany(多對多)
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "tbl_employee_role", joinColumns = { @JoinColumn(name = "employee_id") }, inverseJoinColumns = {
@JoinColumn(name = "role_id") })
private List<Role> roles;
@OrderBy
// demo 表中id 升序排列
@OrderBy("id ASC")
private List<Demo> demoList;
lombok
大大提升程式碼開發效率
@Getter、@Setter
可以替代程式碼中的getter和setter方法
@ToString
物件的自我描述,實體類上註解,替代toString方法
@Getter
@Setter
public class Student {
private String name;
private int age;
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
@NoArgsConstructor、@AllArgsConstructor、@RequiredArgsConstructor
-
@NoArgsConstructor:註解在類上,為類提供一個無參的構造方法。
@NoArgsConstructor public class Student{ private String name; } // 不使用註解 public class Student{ private String name; public Student(){ } }
-
@AllArgsConstructor:為類提供一個全參的構造方法
- 預設生成的方法是 public 的,如果要修改方法修飾符可以設定 AccessLevel 的值。
@AllArgsConstructor(access = AccessLevel.PROTECTED) public class Student{ private String name; } // 不使用註解 public class Student{ private String name; protected Student(String name){ this.name = name; } }
- 預設生成的方法是 public 的,如果要修改方法修飾符可以設定 AccessLevel 的值。
-
@RequiredArgsConstructor:會生成構造方法(可能帶引數也可能不帶引數)
-
如果帶引數,這引數只能是以 final 修飾的未經初始化的欄位或者是以 @NonNull 註解的未經初始化的欄位。
-
該註解還可以用 @RequiredArgsConstructor(staticName=“methodName”) 的形式生成一個指定名稱的靜態方法,返回一個呼叫相應的構造方法產生的物件
// 使用註解 @RequiredArgsConstructor(staticName = "hangge") public class Shape { private int x; @NonNull private double y; @NonNull private String name; } // 不使用註解 public class Shape { private int x; private double y; private String name; public Shape(double y, String name){ this.y = y; this.name = name; } public static Shape hangge(double y, String name){ return new Shape(y, name); } }
-
@Data
類加了@Data註解,所有Java程式碼中不需要生成getters and setters,而在編譯的時候會自動生成getters and setters
@Builder
為類生成相對略微複雜的構建器API。@Builder可以讓你以下面顯示的那樣呼叫你的程式碼,來初始化你的例項物件:
Student.builder()
.sno( "001" )
.sname( "admin" )
.sage( 18 )
.sphone( "110" )
.build();
@Slf4j、@Log4j2、@CommonsLog
- @Slf4j:日誌輸出的,一般會在專案每個類的開頭加入該註解
節省如下程式碼
private final Logger logger = LoggerFactory.getLogger(當前類名.class); - @Log4j2:日誌工具