MyBatis是一个非常好的数据库框架,相比Hibernate更加灵活。对于一个小型的应用来说,MyBatis有一个非常痛苦的问题,就是无法自动创建数据表和更新数据表。
结合Hibernate实现自动创建表
今天来探讨一种自动创建表的方案,就是引入Hibernate,仅仅使用Hibernate自动创建表的属性。
- 引入依赖
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
,其实这种命名策略是比较好的。但是有时候我们可能更加希望属性名称和数据库名称统一,所以增加这个配置后生成的表和属性就和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
}
- 启动项目
启动项目后,通过数据库工具查看数据库,就会发现自动创建了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就会发现,包足足大了10MB,启动速度也变慢了,感觉不是很好!或者我们可以进行一些优化,比如只在单元测试环境才使用Hibernate,每次修改bean类的时候就执行一遍单元测试,自动更新表。
- 修改依赖配置
把上面的compile改成testCompile,由于bean类用到注解代码,对于的注解包还是必须引入,这部分的代码量很少,对大小不会产生影响。
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!!!我们要的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)
总结
如果需要更新远程服务器的数据库,可以考虑直接依赖Hibernate。如果不想包变大,就在本地连接远程数据库在单元测试环境下更新。
网友评论