MyBatis是一個非常好的數(shù)據(jù)庫框架,相比Hibernate更加靈活。對于一個小型的應用來說,MyBatis有一個非常痛苦的問題,就是無法自動創(chuàng)建數(shù)據(jù)表和更新數(shù)據(jù)表。
結合Hibernate實現(xiàn)自動創(chuàng)建表
今天來探討一種自動創(chuàng)建表的方案,就是引入Hibernate,僅僅使用Hibernate自動創(chuàng)建表的屬性。
- 引入依賴
compile("org.springframework.boot:spring-boot-starter-data-jpa")
- 修改
resources/application.properties配置
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
其中spring.jpa.hibernate.naming.physical-strategy是為了修改生成的表和屬性的命名策略,默認是自動轉成小寫和下劃線形式,versionCode就變成了version_code,其實這種命名策略是比較好的。但是有時候我們可能更加希望屬性名稱和數(shù)據(jù)庫名稱統(tǒng)一,所以增加這個配置后生成的表和屬性就和Java類一致。
- 對Bean類增加注解
@Entity
class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(unique = true, nullable = false)
var id: Int? = null
@Column(length = 32)
var name: String? = null
@Column(length = 32, unique = true, nullable = true)
private var username: String? = null
@Column(length = 32)
private var password: String? = null
@Temporal(TemporalType.TIMESTAMP)
var created: Date? = null
}
- 啟動項目
啟動項目后,通過數(shù)據(jù)庫工具查看數(shù)據(jù)庫,就會發(fā)現(xiàn)自動創(chuàng)建了user表,就是這么簡單。
#日志
Hibernate: create table user (id integer not null auto_increment, created datetime, name varchar(32), password varchar(32), username varchar(32), primary key (id)) engine=MyISAM
Hibernate: alter table user drop index UK_7vaiuu0nyrnryow6o08dk6o6t
Hibernate: alter table user add constraint UK_7vaiuu0nyrnryow6o08dk6o6t unique (username)

image.png
改進
當我們引入Hibernate,打包成Jar就會發(fā)現(xiàn),包足足大了10MB,啟動速度也變慢了,感覺不是很好!或者我們可以進行一些優(yōu)化,比如只在單元測試環(huán)境才使用Hibernate,每次修改bean類的時候就執(zhí)行一遍單元測試,自動更新表。
- 修改依賴配置
把上面的compile改成testCompile,由于bean類用到注解代碼,對于的注解包還是必須引入,這部分的代碼量很少,對大小不會產(chǎn)生影響。
testCompile("org.springframework.boot:spring-boot-starter-data-jpa")
compile 'org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final'
- 編寫單元測試代碼
@RunWith(SpringRunner::class)
@SpringBootTest
class JpaTest {
@Test
fun test() {
}
}
運行單元測試,duangduang?。。∥覀円膗ser表創(chuàng)建了
#日志
Hibernate: create table user (id integer not null auto_increment, created datetime, name varchar(32), password varchar(32), username varchar(32), primary key (id)) engine=MyISAM
Hibernate: alter table user drop index UK_7vaiuu0nyrnryow6o08dk6o6t
Hibernate: alter table user add constraint UK_7vaiuu0nyrnryow6o08dk6o6t unique (username)
總結
如果需要更新遠程服務器的數(shù)據(jù)庫,可以考慮直接依賴Hibernate。如果不想包變大,就在本地連接遠程數(shù)據(jù)庫在單元測試環(huán)境下更新。