1. 程式人生 > 其它 >Spring JPA 註解對映關係、lombok

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;
          }
      }
      
  • @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:日誌工具