自动建表
优质
小牛编辑
133浏览
2023-12-01
部署到生产环境的时候需要导入SQL文件,是否觉得很繁琐? 而且还得为不同的数据库准备不同的SQL脚本? 太麻烦了是不是.
如果能自动建表,自动迁移表结构,然后导入初始化数据,是不是部署过程就非常容易了呢?? 想想就有点小激动.
基本用法
首先,你得有一个dao实例, 还有一个Pojo类.
dao.create(User.class, false); // 第一个参数是类, 第二个参数代表是否强制删除重建,通常是false
然后它就能很华丽得输出并执行create table语句了.
CREATE TABLE t_user(
id INT(32),
name VARCHAR(128) UNIQUE NOT NULL,
passwd VARCHAR(128),
salt VARCHAR(128),
locked BOOLEAN,
ct DATETIME,
ut DATETIME,
PRIMARY KEY (id)
) ENGINE=InnoDB CHARSET=utf8
批量建表
要是有几十个Pojo,那岂不是要累死? Nutz当然不会让你太累的.
通常,pojo都集中存在的某个package下,所以我们只需要告诉Daos.createTableInPackage方法所在的位置就行
Daos.createTablesInPackage(dao, "net.wendal.nutzbook.bean", false);
然后,它就会扫描该package下,所以带@Table注解的Pojo类,逐一执行dao.create
表结构迁移
老板说要每个用户新增加个phone字段,咋搞? 自定义SQL执行一条ALTER吗? 不不不,自动迁移一下表结构就好了.
Daos.migration(User.class, true, false, false);
第一个参数是类,第二个参数是否新增字段,第三个参数是否删除字段(通常为false),第4个参数是否检查索引(通常为false).
额,那很多很多pojo呢? 也能批量迁移吗? 可以的
Daos.migration(dao, "net.wendal.nutzbook.bean", true, false, false);
自动建表的字段配置
建表时的详细配置,大部分通过@ColDefine实现
定义字符串长度,例如1024,你懂的
@ColDefine(width=1024)
private String name;
定义浮点数精度
@ColDefine(width=10,precision=2, type=ColType.FLOAT) // 对数据库来说没有float和double的区别
private double price;
不允许为null
@ColDefine(notNull=true, width=128)
private String nickname;
自定义类型,终极大招,没法自适应数据库了.
@ColDefine(customType="LargeBlob", type=ColType.BLOB)
private Blob blob;
自动建表的索引配置
除了为@Id/@Name/@Pk建立自动索引之外, 通过@TableIndexes注解可以配置更多自定义索引.
例如为name和age建立联合索引
@Table("t_user")
@TableIndexes({@Index(name="name_age", fields={"name", "age"}, unique=false)})
自1.r.63起,索引的名称可以自动帮你生成,上面的例子,如果name不填的话,默认"IX_TableName_name_age",及"前缀_表名_字段名"
其中,唯一索引前缀为"UX_",非唯一索引前缀为"IX_"