今天是2019.11.11.我今年大四赌结,準(zhǔn)備去一家公司做實習(xí)生姨涡。對于之后的java開發(fā)實習(xí)工作也不了解,正好機(jī)緣巧合之下通過B站UP主CodeSheep了解了開源項目halo的存在揍庄。所以準(zhǔn)備在簡書記錄我在這段時間對于halo的了解忿檩。
廢話不多說,直接上項目介蛉,先從git上拉取下來萌庆,然后通過idea將項目跑了起來。以下截圖是這個項目的源碼分類币旧。
對于我這種還未走出校門的渣渣來說践险,上來直接讀源碼困難的確實存在的。我在學(xué)校對于java也沒有太多的了解(實話實說)吹菱。所以我打算從最基本的實體類開始記錄捏境。
第一步:
先從實體類User類入手,通過User來了解正規(guī)的項目該如何書寫規(guī)范毁葱,和注釋的使用(這個項目是SpringBoot的)。就一步一步走吧贰剥。
為了方便倾剿,我直接就在源碼上面每行都加注釋,我是想先把代碼搞懂蚌成,其它的相關(guān)內(nèi)容我先放棄前痘,之后我們在深入下去,把主要精力放在本項目中担忧。
User實體來源碼
package run.halo.app.model.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import run.halo.app.utils.DateUtils;
import javax.persistence.*;
import java.util.Date;
/**
* User entity
*
* @author ryanwang
* @date : 2019-03-12
*/
? ? ? //這些這是很多是來源于Lombok芹缔,它是一個Java庫,從引用的包中我們就可以看到瓶盛。Lombok的作用就是自動插入編輯器
? ? ? //并構(gòu)建工具最欠,簡化Java開發(fā)。通過添加注解的方式惩猫,不需要為類編寫getter或equals方法芝硬,同時可以自動化日志變量。主要還是簡化代碼的書寫
? ? ? // 轧房,提高開發(fā)的效率
@Data? //這個注釋注解在類上拌阴,為類提供讀寫屬性,此外還提供了equals()奶镶、hashCode()迟赃、toString()方法
@Entity //JPA中的@Entity表明該類為一個實體類
@Table(name ="users")//JPA中的@Table陪拘,當(dāng)實體類與其映射的數(shù)據(jù)庫表名不同名時需要使用@Table注解說明,該標(biāo)注與@Entity注解并列使用纤壁;name指定數(shù)據(jù)庫的表名
@ToString(callSuper =true)//lombok中的注解左刽。通過設(shè)置callSuper為true,可以將超類實現(xiàn)toString的輸出包含到輸出中摄乒。
@EqualsAndHashCode(callSuper =true)//lombok中的注解悠反,它默認(rèn)僅使用該類中定義的屬性且不調(diào)用父類的方法,通過callSuper=true調(diào)用父類的方法
public class Userextends BaseEntity {
@Id //用于聲明一個實體類的屬性映射為數(shù)據(jù)庫的主鍵列該屬性通常置于屬性聲明語句之前馍佑,
? ? @GeneratedValue(strategy = GenerationType.IDENTITY)//用于標(biāo)注主鍵的生成策略斋否,通過strategy屬性指定采用數(shù)據(jù)庫ID自增長的方式來自增主鍵字段
? ? @Column(name ="id")//表示所持久化屬性所映射表中的字段
? ? private Integerid;
/**
* User name.
*/
? ? @Column(name ="username", columnDefinition ="varchar(50) not null")
private Stringusername;
/**
* User nick name,used to display on page.
*/
? ? @Column(name ="nickname", columnDefinition ="varchar(255) not null")
private Stringnickname;
/**
* Password.
*/
? ? @Column(name ="password", columnDefinition ="varchar(255) not null")
private Stringpassword;
/**
* User email.
*/
? ? @Column(name ="email", columnDefinition ="varchar(127) default ''")
private Stringemail;
/**
* User avatar.
*/
? ? @Column(name ="avatar", columnDefinition ="varchar(1023) default ''")
private Stringavatar;
/**
* User description.
*/
? ? @Column(name ="description", columnDefinition ="varchar(1023) default ''")
private Stringdescription;
/**
* Expire time.
*/
? ? @Column(name ="expire_time", columnDefinition ="timestamp default CURRENT_TIMESTAMP")
@Temporal(TemporalType.TIMESTAMP)//時間yyyy-MM-dd hh:MM:ss
? ? private DateexpireTime;
@Override
? ? public void prePersist() {
super.prePersist();
id =null;
if (email ==null) {
email ="";
}
if (avatar ==null) {
avatar ="";
}
if (description ==null) {
description ="";
}
if (expireTime ==null) {
expireTime = DateUtils.now();
}
}
}
BaseEntity實體類源碼
package run.halo.app.model.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import run.halo.app.utils.DateUtils;
import javax.persistence.*;
import java.util.Date;
/**
* Base entity.
*
* @author johnniang
* @date 3/20/19
*/
@Data
@ToString
@MappedSuperclass? //用來標(biāo)識父類,基于代碼復(fù)用和模型分離的思想拭荤,在項目開發(fā)中使用JPA的@MappedSuperclass注解將實體類的多個屬性分別封裝到不同的非實體類中茵臭。
? ? ? ? ? ? ? ? ? //標(biāo)識為@MappedSuperclass的類將不是一個完整的實體類,他將不會映射到數(shù)據(jù)庫表舅世,但是他的屬性都將映射到其子類的數(shù)據(jù)庫字段中旦委。
? ? ? ? ? ? ? ? ? //標(biāo)注為@MappedSuperclass的類不能再標(biāo)注@Entity或@Table注解,也無需實現(xiàn)序列化接口雏亚。
@EqualsAndHashCode
public class BaseEntity {
/**
* Create time.
*/
? ? @Column(name ="create_time", columnDefinition ="timestamp default CURRENT_TIMESTAMP")//JPA中的注解缨硝,表示所持久化屬性所映射表中的字段,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //columnDefinition屬性表示創(chuàng)建表時罢低,該字段創(chuàng)建的SQL語句查辩,一般用于通過Entitiy生成表定義時使用
? ? /**
* private String? name;
? ? * @Column(name=" contact_name ",columnDefinition="clob not null")
* public String getName() {
*? ? ? ? ? ? ? ? ? return name;
* }
? ? * 生成表的定義SQL語句如下所示。
? ? * CREATE TABLE contact (
* id integer not null,
* contact_name clob (200) not null,
* primary key (id)
* )
*/
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //若不指定該屬性网持,通常使用默認(rèn)的類型建表宜岛,若此時需要自定義建表的類型時,可在該屬性中設(shè)置功舀。
? ? @Temporal(TemporalType.TIMESTAMP)//Java的Date類型進(jìn)行格式化萍倡,一共有是那種注解值:TemporalType.TIMESTAMP:yyyy-MM-dd hh:MM:ss
? ? private DatecreateTime;
/**
* Update time.
*/
? ? @Column(name ="update_time", columnDefinition ="timestamp default CURRENT_TIMESTAMP")
@Temporal(TemporalType.TIMESTAMP)
private DateupdateTime;
/**
* Delete flag.
*/
? ? @Column(name ="deleted", columnDefinition ="TINYINT default 0")
private Booleandeleted =false;
@PrePersist //幫助您在持久化之前自動填充實體屬性
? ? protected void prePersist() {
deleted =false;
Date now = DateUtils.now();
if (createTime ==null) {
createTime = now;
}
if (updateTime ==null) {
updateTime = now;
}
}
@PreUpdate //每次更新實體時不必顯示更新實體的屬性,preUpdate不允許您更改您的實體辟汰。您只能使用傳遞給事件的計算的更改集來修改原始字段值
? ? protected void preUpdate() {
updateTime =new Date();
}
@PreRemove //在實體從數(shù)據(jù)庫刪除之前觸發(fā)
? ? protected void preRemove() {
updateTime =new Date();
}
}