Spring Data Jpa 根据实体类反向生成数据库表
1.引入Maven
<!-- Spring Data Jpa --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.6</version>
</dependency>
2.配置文件application.yml
spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/test?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=UTC username: root password: root druid: max-active: 20 #最大活跃数 initial-size: 5 #初始化数量 min-idle: 5 #最小活跃数 max-wait: 60000 #配置超时等待时间 time-between-eviction-runs-millis: 60000 #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 min-evictable-idle-time-millis: 300000 #配置一个连接在池中最小生存的时间,单位是毫秒 validation-query: SELECT 1 FROM test-while-idle: true test-on-borrow: false test-on-return: false pool-prepared-statements: true #打开PSCache,并且指定每个连接上PSCache的大小 max-pool-prepared-statement-per-connection-size: 20 filters: stat,wall,log4j2 #配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500 #通过connectProperties属性来打开mergeSql功能;慢SQL记录 use-global-data-source-stat: true jpa: show-sql: true #控制台显示SQL database: mysql hibernate: ddl-auto: update #更新或者创建数据表结构 open-in-view: false
3.实体类
①@Entity:告诉JPA这是一个实体类(和数据表映射的类)
②@Table:指定和哪个数据表对应;如果省略默认表名就是user;
③@Id:告诉JPA这个字段是数据表的主键
④@GeneratedValue:告诉JPA这个字段的生成规则;
GenerationType.AUTO--主键由程序控制
GenerationType.TABLE--使用一个特定的数据库表格来保存主键
GenerationType.SEQUENCE--根据底层数据库的序列来生成主键,条件是数据库支持序列
GenerationType.IDENTITY--自增
⑤@Column:设置字段属性
name:设置该字段在数据库表中的名称
unique:唯一标识,默认false
nullable:是否可以为空为空,默认true
insertable:插入数据时,是否需要插入该字段
updatable:更新数据时,是否需要更新该字段
columnDefinition:该字段创建的SQL语句,一般用于通过Entity生成表定义时使用;常用于说明数据库字段的注释
table:表示当映射多个表时,指定表的表中的字段,默认值为主表的表名
length:字段的长度,当字段的类型为varchar时,该属性才有效,默认为255个字符
precision和scale:表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数
@Data
@Entity @Table(name = "sys_account_info") public class AccountInfo implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id;
@Column(name = "login_account") private String loginAccount; private String password; private Integer accountStatus;
}
注意:在多模块开发中,如果将实体类单独抽出来作为一个模块时,需要在启动类中引入@EntityScan注解扫描实体类所在的包
@SpringBootApplication @EntityScan(basePackages = {"com.test.entity"}) public class TestApplication { public static void main(String[] args) { SpringApplication.run(SystemApplication.class, args); } }
⑥父类
在实际开发中,我们通常会把一些数据库*有的字段抽出来作为一个父类BaseEntity,那些表里面有这些字段直接继承即可。
但在Jpa中,这个公共父类需要添加@MappedSuperClass这个注解,否则父类中的字段是无法反向生成到数据表中的。
@Data
@MappedSuperclass public class BaseEntity { /** * 主键 */ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; /** * 创建人 */ private Long createUserId; /** * 创建时间 */ private LocalDateTime gmtCreate; /** * 更新人 */ private Long updateUserId; /** * 更新时间 */ private LocalDateTime gmtModified; /** * 是否删除 */ private Boolean isDelete; /** * 版本 */ private Integer version; }