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; }