*注釋和注解的區(qū)別:注解是寫給機器川蒙、編譯器看的择卦;注釋是寫給人看的衫仑。
Hiberanate常用注解
Hibernate是一種ORM框架吼旧,全稱為 Object_Relative DateBase-Mapping凰锡,在Java對象與關系數(shù)據(jù)庫之間建立某種映射,以實現(xiàn)直接存取Java對象圈暗。
注: - 所謂的持久化類其實本質(zhì)上也就是一個普通的Java類掂为,只不過我們通過配置文件讓它與數(shù)據(jù)庫中的某張表形成對應關系。
?? - GeneratedValue指定了標識符的生成策略员串。jpa提供了4種標準用法勇哗。
IDENTITY //采用數(shù)據(jù)庫ID自增長的方式來自增主鍵字段,Oracle 不支持這種方式寸齐;
AUTO //JPA自動選擇合適的策略欲诺,是默認選項;
SEQUENCE //通過序列產(chǎn)生主鍵渺鹦,通過@SequenceGenerator 注解指定序列名扰法,MySql不支持這種方式
TABLE //通過表產(chǎn)生主鍵,框架借由表模擬序列產(chǎn)生主鍵毅厚,使用該策略可以使應用更易于數(shù)據(jù)庫移植塞颁。
-
@Entity:
?? 表明該類 (UserEntity) 為一個實體類,它默認對應數(shù)據(jù)庫中的表名是user_entity卧斟。查看@Entity注解殴边,發(fā)現(xiàn)其只有一個屬性name,表示其所對應的數(shù)據(jù)庫中的表名珍语。這里也可以寫成
@Entity(name = "xwj_user")
或者
@Entity
@Table(name = "xwj_user", schema = "test")
-
@Table
??當實體類與其映射的數(shù)據(jù)庫表名不同名時需要使用 @Table注解說明锤岸,該標注與 @Entity 注解并列使用,置于實體類聲明語句之前板乙,可寫于單獨語句行是偷,也可與聲明語句同行。
@Table注解的常用選項是 name募逞,用于指明數(shù)據(jù)庫的表名
@Table注解還有兩個選項 catalog 和 schema 用于設置
表所屬的數(shù)據(jù)庫目錄或模式蛋铆,通常為數(shù)據(jù)庫名。
使用@UniqueConstraints 可以定義表的唯一約束放接。
@Table(name="tbl_sky",
uniqueConstraints = {@UniqueConstraint(columnNames={"month", "day"})})//聯(lián)合約束
@Table(name="tbl_sky",
uniqueConstraints = {@UniqueConstraint(columnNames="month")})//單一約束
??如果缺省@Table注解刺啦,則class字段名即表中的字段名,所以需要@Column注解來改變class中字段名與db中表的字段名的映射規(guī)則纠脾。
-
@Column
??@Column注釋定義了將成員屬性映射到關系表中的哪一列和該列的結(jié)構(gòu)信息玛瘸,屬性如下:
1)name:映射的列名蜕青。如:映射tbl_user表的name列,可以在name屬性的上面或getName方法上面加入糊渊;
2)unique:是否唯一右核;
3)nullable:是否允許為空;
4)length:對于字符型列渺绒,length屬性指定列的最大字符長度贺喝;
5)insertable:是否允許插入;
6)updatetable:是否允許更新宗兼;
7)columnDefinition:定義建表時創(chuàng)建此列的DDL躏鱼;
8)secondaryTable:從表名。如果此列不建在主表上(默認是主表)殷绍,該屬性定義該列所在從表的名字
如果是主鍵id挠他,還會用到@Id注解,如下:
@Id注釋指定表的主鍵,它可以有多種生成方式:
1)TABLE:容器指定用底層的數(shù)據(jù)表確保唯一篡帕;
2)SEQUENCE:使用數(shù)據(jù)庫德SEQUENCE列來保證唯一(Oracle數(shù)據(jù)庫通過序列來生成唯一ID);
3)IDENTITY:使用數(shù)據(jù)庫的IDENTITY列來保證唯一贸呢;
4)AUTO:由容器挑選一個合適的方式來保證唯一镰烧;
5)NONE:容器不負責主鍵的生成,由程序來完成楞陷。
lombok常用注解
-
@Data
??@Data使用時需下載lombok插件怔鳖,為lombok注解的一種,幫助我們簡化了代碼,相當于lombok里的@Getter/@Setter固蛾,@ToString/@EqualsAndHashCode -
@Log
??根據(jù)不同的注解生成不同類型的log對象结执,但是實例名稱都是log,有六種可選實現(xiàn)類
@CommonsLog Creates log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);
@Log Creates log = java.util.logging.Logger.getLogger(LogExample.class.getName());
@Log4j Creates log = org.apache.log4j.Logger.getLogger(LogExample.class);
@Log4j2 Creates log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);
@Slf4j Creates log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
@XSlf4j Creates log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);
-
@Synchronized
??這個注解用在類方法或者實例方法上艾凯,效果和synchronized關鍵字相同献幔,區(qū)別在于鎖對象不同,對于類方法和實例方法趾诗,synchronized關鍵字的鎖對象分別是類的class對象和this對象蜡感,而@Synchronized得鎖對象分別是私有靜態(tài)final對象LOCK和私有final對象LOCK和私有final對象lock,當然恃泪,也可以自己指定鎖對象郑兴。
??synchronized關鍵字可用來給對象和方法或者代碼塊加鎖,當它鎖定一個方法或者一個代碼塊的時候贝乎,同一時刻最多只有一個線程執(zhí)行這段代碼情连。當兩個并發(fā)線程訪問同一個對象object中的這個加鎖同步代碼塊時览效,一個時間內(nèi)只能有一個線程得到執(zhí)行却舀。另一個線程必須等待當前線程執(zhí)行完這個代碼塊以后才能執(zhí)行該代碼塊虫几。然而,當一個線程訪問object的一個加鎖代碼塊時禁筏,另一個線程仍可以訪問該object中的非加鎖代碼塊持钉。
-
@Override
??在java中如果方法上加@Override的注解的話,表示子類重寫了父類的方法篱昔。當然也可以不寫每强,寫的好處是:
????1. 可讀性提高。
????2. 編譯器會校驗寫的方法在父類中是否存在州刽。
public class Father {
public void test(){
System.out.println("test");
}
class child extends Father{
@Override
public void test(){
} }
}
??如果將test寫成test1的話空执,編譯器在父類中未找到此方法,將會報錯;如果將@override注釋去掉的話穗椅,那么編譯器則會認為創(chuàng)建了新的方法