今天是2019.11.11.我今年大四,准备去一家公司做实习生。对于之后的java开发实习工作也不了解,正好机缘巧合之下通过B站UP主CodeSheep了解了开源项目halo的存在。所以准备在记录我在这段时间对于halo的了解。
废话不多说,直接上项目,先从git上拉取下来,然后通过idea将项目跑了起来。以下截图是这个项目的源码分类。
对于我这种还未走出校门的渣渣来说,上来直接读源码困难的确实存在的。我在学校对于java也没有太多的了解(实话实说)。所以我打算从最基本的实体类开始记录。
第一步:
先从实体类User类入手,通过User来了解正规的项目该如何书写规范,和注释的使用(这个项目是SpringBoot的)。就一步一步走吧。
为了方便,我直接就在源码上面每行都加注释,我是想先把代码搞懂,其它的相关内容我先放弃,之后我们在深入下去,把主要精力放在本项目中。
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的作用就是自动插入编辑器
//并构建工具,简化Java开发。通过添加注解的方式,不需要为类编写getter或equals方法,同时可以自动化日志变量。主要还是简化代码的书写
// ,提高开发的效率
@Data //这个注释注解在类上,为类提供读写属性,此外还提供了equals()、hashCode()、toString()方法
@Entity //JPA中的@Entity表明该类为一个实体类
@Table(name ="users")//JPA中的@Table,当实体类与其映射的数据库表名不同名时需要使用@Table注解说明,该标注与@Entity注解并列使用;name指定数据库的表名
@ToString(callSuper =true)//lombok中的注解。通过设置callSuper为true,可以将超类实现toString的输出包含到输出中。
@EqualsAndHashCode(callSuper =true)//lombok中的注解,它默认仅使用该类中定义的属性且不调用父类的方法,通过callSuper=true调用父类的方法
public class Userextends BaseEntity {
@Id //用于声明一个实体类的属性映射为数据库的主键列该属性通常置于属性声明语句之前,
@GeneratedValue(strategy = GenerationType.IDENTITY)//用于标注主键的生成策略,通过strategy属性指定采用数据库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 //用来标识父类,基于代码复用和模型分离的思想,在项目开发中使用JPA的@MappedSuperclass注解将实体类的多个属性分别封装到不同的非实体类中。
//标识为@MappedSuperclass的类将不是一个完整的实体类,他将不会映射到数据库表,但是他的属性都将映射到其子类的数据库字段中。
//标注为@MappedSuperclass的类不能再标注@Entity或@Table注解,也无需实现序列化接口。
@EqualsAndHashCode
public class BaseEntity {
/**
* Create time.
*/
@Column(name ="create_time", columnDefinition ="timestamp default CURRENT_TIMESTAMP")//JPA中的注解,表示所持久化属性所映射表中的字段,
//columnDefinition属性表示创建表时,该字段创建的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)
* )
*/
//若不指定该属性,通常使用默认的类型建表,若此时需要自定义建表的类型时,可在该属性中设置。
@Temporal(TemporalType.TIMESTAMP)//Java的Date类型进行格式化,一共有是那种注解值: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 //在实体从数据库删除之前触发
protected void preRemove() {
updateTime =new Date();
}
}