使用Mybatis与JPA都可以自动生成表。不过Mybatis-plus可以生成一套代码

两者都可以通过注解定义实体类属性对应的数据表策略,下面对两者在实体类不同注解做备份。

1、Mybatis

常作用在BaseEntity上的字段注解。

注解

属性

@TableId(value = “id”, type = IdType.AUTO)

value说明字段名,相同名称可以不写;type

@TableField(fill = FieldFill.INSERT)

表字段标识,exist = false表示该属性不为数据库表字段,但又是必须使用的。fill = FieldFill.INSERT注解填充字段 ,生成器策略部分也可以配置

@TableLogic

表逻辑处理注解(逻辑删除)

2、JPA

注解

属性

@GeneratedValue

指定如何标识属性可以被初始化,如@GeneratedValue()。strategy = GenerationType.SEQUENCE:表示主键生成策略是sequence,还有Auto、ldentity、 Native等。generator = "repair_seq"声明了主键生成器的名称

@GenericGenerator

自定义主键生成策略,由@GenericGenerator实现。name属性指定生成器名称。与@GeneratorValue中 generator 的值对应。strategy属性指定具体生成器的类名。parameters得到strategy指定的具体生成器所用到的参数

@Column(name = “create_time”)

说明字段

@ld

指定的类的属性,一个表中的主键。

@Transient

标注的属性会被JPA所忽略,不会映射到数据库中,即程序运行后数据库中将不会有该字段。

@Table

用来标识实体类与数据表的对应关系。

@Entity

表明这个class是实体类,并且使用默认的orm规则,即class名即数据库表中表名,class字段名即表中的字段名。

3、自动建表的注意事项

  • @MappedSuperclass
    在创建实体类的父类时,使用JPA的BaseEntity需要添加@MappedSuperclass注解以适应多继承,而Mybatis自动生成表所继承的BaseEntity不用这个注解。
    @MappedSuperclass 用在父类上面。当这个类肯定是父类时,加此标注。如果改成@Entity,则继承后,多个类继承,只会生成一个表,而不是多个继承,生成多个表
    对应报错:

No identifier specified for entity

  • @Temporal(TemporalType.TIMESTAMP)
    当实体类的父类有创建时间、更新时间等字段时,可能会需要@Temproal()注解向数据库映射日期(Date)属性时用来调整映射的精度(实体类会封装成完整的时间“yyyy-MM-dd hh:MM:ss”)。
    这里要注意的是,@Temproal注解与LocalDateTime类会发生冲突。应该使用Date类型
    对应报错:

Caused by: org.hibernate.AnnotationException: @Temporal should only be set on a java.util.Date or java.util.Calendar property:

使用@CreatedDate 配合 @DateTimeFormat(pattern=“yyyy-MM-dd HH:mm:ss”)其实也是一个很好的选择,而且很香。对应的类为Date,更新字段为@LastModifiedDate。这些注解都在org.springframework.data.annotation;包下。

但是LocalDateTime类也很香,继承了Temporal, TemporalAdjuster, ChronoLocalDateTime