Java開(kāi)源項(xiàng)目halo第一天

今天是2019.11.11.我今年大四,準(zhǔn)備去一家公司做實(shí)習(xí)生。對(duì)于之后的java開(kāi)發(fā)實(shí)習(xí)工作也不了解,正好機(jī)緣巧合之下通過(guò)B站UP主CodeSheep了解了開(kāi)源項(xiàng)目halo的存在。所以準(zhǔn)備在簡(jiǎn)書(shū)記錄我在這段時(shí)間對(duì)于halo的了解。

廢話(huà)不多說(shuō),直接上項(xiàng)目,先從git上拉取下來(lái),然后通過(guò)idea將項(xiàng)目跑了起來(lái)。以下截圖是這個(gè)項(xiàng)目的源碼分類(lèi)。


項(xiàng)目代碼目錄

對(duì)于我這種還未走出校門(mén)的渣渣來(lái)說(shuō),上來(lái)直接讀源碼困難的確實(shí)存在的。我在學(xué)校對(duì)于java也沒(méi)有太多的了解(實(shí)話(huà)實(shí)說(shuō))。所以我打算從最基本的實(shí)體類(lèi)開(kāi)始記錄。


實(shí)體類(lèi)

第一步:


User實(shí)體類(lèi)

先從實(shí)體類(lèi)User類(lèi)入手,通過(guò)User來(lái)了解正規(guī)的項(xiàng)目該如何書(shū)寫(xiě)規(guī)范,和注釋的使用(這個(gè)項(xiàng)目是SpringBoot的)。就一步一步走吧。

為了方便,我直接就在源碼上面每行都加注釋?zhuān)沂窍胂劝汛a搞懂,其它的相關(guān)內(nèi)容我先放棄,之后我們?cè)谏钊胂氯?,把主要精力放在本?xiàng)目中。

User實(shí)體來(lái)源碼

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

*/

? ? ? //這些這是很多是來(lái)源于Lombok,它是一個(gè)Java庫(kù),從引用的包中我們就可以看到。Lombok的作用就是自動(dòng)插入編輯器

? ? ? //并構(gòu)建工具,簡(jiǎn)化Java開(kāi)發(fā)。通過(guò)添加注解的方式,不需要為類(lèi)編寫(xiě)getter或equals方法,同時(shí)可以自動(dòng)化日志變量。主要還是簡(jiǎn)化代碼的書(shū)寫(xiě)

? ? ? // ,提高開(kāi)發(fā)的效率

@Data? //這個(gè)注釋注解在類(lèi)上,為類(lèi)提供讀寫(xiě)屬性,此外還提供了equals()、hashCode()、toString()方法

@Entity //JPA中的@Entity表明該類(lèi)為一個(gè)實(shí)體類(lèi)

@Table(name ="users")//JPA中的@Table,當(dāng)實(shí)體類(lèi)與其映射的數(shù)據(jù)庫(kù)表名不同名時(shí)需要使用@Table注解說(shuō)明,該標(biāo)注與@Entity注解并列使用;name指定數(shù)據(jù)庫(kù)的表名

@ToString(callSuper =true)//lombok中的注解。通過(guò)設(shè)置callSuper為true,可以將超類(lèi)實(shí)現(xiàn)toString的輸出包含到輸出中。

@EqualsAndHashCode(callSuper =true)//lombok中的注解,它默認(rèn)僅使用該類(lèi)中定義的屬性且不調(diào)用父類(lèi)的方法,通過(guò)callSuper=true調(diào)用父類(lèi)的方法

public class Userextends BaseEntity {

@Id //用于聲明一個(gè)實(shí)體類(lèi)的屬性映射為數(shù)據(jù)庫(kù)的主鍵列該屬性通常置于屬性聲明語(yǔ)句之前,

? ? @GeneratedValue(strategy = GenerationType.IDENTITY)//用于標(biāo)注主鍵的生成策略,通過(guò)strategy屬性指定采用數(shù)據(jù)庫(kù)ID自增長(zhǎng)的方式來(lái)自增主鍵字段

? ? @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)//時(shí)間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實(shí)體類(lèi)源碼

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? //用來(lái)標(biāo)識(shí)父類(lèi),基于代碼復(fù)用和模型分離的思想,在項(xiàng)目開(kāi)發(fā)中使用JPA的@MappedSuperclass注解將實(shí)體類(lèi)的多個(gè)屬性分別封裝到不同的非實(shí)體類(lèi)中。

? ? ? ? ? ? ? ? ? //標(biāo)識(shí)為@MappedSuperclass的類(lèi)將不是一個(gè)完整的實(shí)體類(lèi),他將不會(huì)映射到數(shù)據(jù)庫(kù)表,但是他的屬性都將映射到其子類(lèi)的數(shù)據(jù)庫(kù)字段中。

? ? ? ? ? ? ? ? ? //標(biāo)注為@MappedSuperclass的類(lèi)不能再標(biāo)注@Entity或@Table注解,也無(wú)需實(shí)現(xiàn)序列化接口。

@EqualsAndHashCode

public class BaseEntity {

/**

* Create time.

*/

? ? @Column(name ="create_time", columnDefinition ="timestamp default CURRENT_TIMESTAMP")//JPA中的注解,表示所持久化屬性所映射表中的字段,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //columnDefinition屬性表示創(chuàng)建表時(shí),該字段創(chuàng)建的SQL語(yǔ)句,一般用于通過(guò)Entitiy生成表定義時(shí)使用

? ? /**

* private String? name;

? ? * @Column(name=" contact_name ",columnDefinition="clob not null")

* public String getName() {

*? ? ? ? ? ? ? ? ? return name;

* }

? ? * 生成表的定義SQL語(yǔ)句如下所示。

? ? * CREATE TABLE contact (

* id integer not null,

* contact_name clob (200) not null,

* primary key (id)

* )

*/

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //若不指定該屬性,通常使用默認(rèn)的類(lèi)型建表,若此時(shí)需要自定義建表的類(lèi)型時(shí),可在該屬性中設(shè)置。

? ? @Temporal(TemporalType.TIMESTAMP)//Java的Date類(lèi)型進(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 //幫助您在持久化之前自動(dòng)填充實(shí)體屬性

? ? protected void prePersist() {

deleted =false;

Date now = DateUtils.now();

if (createTime ==null) {

createTime = now;

}

if (updateTime ==null) {

updateTime = now;

}

}

@PreUpdate //每次更新實(shí)體時(shí)不必顯示更新實(shí)體的屬性,preUpdate不允許您更改您的實(shí)體。您只能使用傳遞給事件的計(jì)算的更改集來(lái)修改原始字段值

? ? protected void preUpdate() {

updateTime =new Date();

}

@PreRemove //在實(shí)體從數(shù)據(jù)庫(kù)刪除之前觸發(fā)

? ? protected void preRemove() {

updateTime =new Date();

}

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容