@Entity:标识实体类是JPA实体,告诉JPA在程序运行时生成实体类对应表
@Table:设置实体类在数据库所对应的表名
@Id:标识类里所在变量为主键
@GeneratedValue:设置主键生成策略,此方式依赖于具体的数据库
@Entity
@Table(name = "login_log")
public class LoginLogDO{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String remoteAddr;
private String username;
private String mobile;
...
}
@Column:表示属性所对应字段名进行个性化设置
@Column注解一共有10个属性,这10个属性均为可选属性,各属性含义分别如下:
name
name属性定义了被标注字段在数据库表中所对应字段的名称;
unique
unique属性表示该字段是否为唯一标识,默认为false。如果表中有一个字段需要唯一标识,则既可以使用该标记,也可以使用@Table标记中的@UniqueConstraint。
nullable
nullable属性表示该字段是否可以为null值,默认为true。
insertable
insertable属性表示在使用“INSERT”脚本插入数据时,是否需要插入该字段的值。
updatable
updatable属性表示在使用“UPDATE”脚本插入数据时,是否需要更新该字段的值。insertable和updatable属性一般多用于只读的属性,例如主键和外键等。这些字段的值通常是自动生成的。
columnDefinition
columnDefinition属性表示创建表时,该字段创建的SQL语句,一般用于通过Entity生成表定义时使用。(也就是说,如果DB中表已经建好,该属性没有必要使用。)
table
table属性定义了包含当前字段的表名。
length
length属性表示字段的长度,当字段的类型为varchar时,该属性才有效,默认为255个字符。
precision和scale
precision属性和scale属性表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数。
@Temporal:
当我们使用到java.util包中的时间日期类型,则可以使用此注释转化成java.util包中的类型。
注入数据库的类型有三种:
TemporalType.DATE(2008-08-08)
TemporalType.TIME(20:00:00)
TemporalType.TIMESTAMP(2008-08-08 20:00:00.000000001)
@Enumerated:
使用此注解映射枚举字段,以String类型存入数据库
注入数据库的类型有两种:EnumType.ORDINAL(Interger)、EnumType.STRING(String)
@Embedded、@Embeddable:
当一个实体类要在多个不同的实体类中进行使用,而其不需要生成数据库表
@Embeddable:注解在类上,表示此类是可以被其他类嵌套
@Embedded:注解在属性上,表示嵌套被@Embeddable注解的同类型类
@ElementCollection:集合映射
@CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy:
表示字段为创建时间字段(insert自动设置)、创建用户字段(insert自动设置)、最后修改时间字段(update自定设置)、最后修改用户字段(update自定设置)
例如:
在新建用户的时候,不用管用户创建的时间和用户属性修改的时间,@CreateDate和@LastModifiedDate注解会自动帮你添加上时间。
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@CreatedDate
@Column(updatable = false, nullable = false)
protected LocalDateTime gmtCreate;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@LastModifiedDate
protected LocalDateTime gmtModified;
这四个注解的使用需要在启动类上加上@EnableJpaAuditing注解
@SpringBootApplication
@EnableSwagger2//启动swagger2
@EnableJpaAuditing//启动@CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy注解
@EntityScan(basePackages = {"com.bbd.finance.model.domain"})
@EnableJpaRepositories(basePackages = {"com.bbd.finance.model.dao"})
public class App {
private static final Logger log = LoggerFactory.getLogger(App.class);
public static void main(String[] args){
SpringApplication.run(App.class);
}
}
@MappedSuperclass:
实现将实体类的多个属性分别封装到不同的非实体类中
注解的类将不是完整的实体类,不会映射到数据库表,但其属性将映射到子类的数据库字段
注解的类不能再标注@Entity或@Table注解,也无需实现序列化接口
注解的类继承另一个实体类 或 标注@MappedSuperclass类,他可使用@AttributeOverride 或 @AttributeOverrides注解重定义其父类属性映射到数据库表中字段。
例如:
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseDO{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
protected Long id;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@CreatedDate
@Column(updatable = false, nullable = false)
protected LocalDateTime gmtCreate;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@LastModifiedDate
protected LocalDateTime gmtModified;
//此处省略get、set方法
}
登陆日志类继承BaseDo类(用户类也继承该类,这样就减少了代码的冗余)
@Entity
@Table(name = "login_log")
public class LoginLogDo extends BaseDO {
private String remoteAddr;
private String username;
private String employeeNo;
private boolean status;
private String reason;
//此处省略get、set方法
}
一对一关联
@OneToOne、@JoinColumn
//企业ID
private Long companyId;
@OneToOne
@JoinColumn(name = "companyId", referencedColumnName = "id",insertable = false,updatable = false, foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT))
private CompanyInfoDO companyInfoDO;
java对象与json转化(spring注解)
1.@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8"):将Date属性转换为String类型, timezone解决(相差8小时)
2.@JsonSerialize:作用在类或字段上,转化java对象到json格式(需自定义转化类继承JsonSerializer
class DateSerializer extends JsonSerializer
@Override
public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider)
throws IOException {
SimpleDateFormat formatter = new SimpleDateFormat(BankAccount.DATE_PATTERN);
jgen.writeString(formatter.format(value));
}
}
3.@JsonDeserialize:作用在类或字段上,转化json格式到java对象(需自定义转化类继承JsonDeserializer
class DateDeSerializer extends JsonDeserializer
@Override
public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
Date date;
try {
date = DateUtils.parseDate(jp.getText(), BankAccount.DATE_PATTERN);
} catch (Exception e) {
return null;
}
return date;
}
}
4.@JsonProperty:作用在属性上,把属性名称序列化为另一个名称(trueName属性序列化为name)
5.@JsonIgnoreProperties(ignoreUnknown = true):作用在类上,json序列化时将Java bean中的一些属性忽略掉,可选择多个字段@JsonIgnoreProperties({“name”},{“age”});json转javabean时忽略javabean中没有的字段(如果json中字段javabean中没有会抛出异常UnrecognizedPropertyException,此时可使用该注解)
6.@JsonIgnore:在json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响
将时间进行时间格式的转换
@JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8") 出参格式转换
@DateTimeFormat(pattern = "yyyy-MM-dd") 入参格式转换
private Date testTime;