package org.easyframe.tutorial.lessonc;
import java.sql.SQLException;
import jef.database.DbClient;
import jef.database.DbClientBuilder;
import jef.database.dialect.ColumnType;
import jef.database.meta.TupleMetadata;
import jef.database.query.Func;
import jef.database.support.RDBMS;
import org.easyframe.tutorial.lesson2.entity.Student;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class CaseAlterTable {
private static DbClient db;
@BeforeClass
public static void setup() throws SQLException{
db = new DbClientBuilder().build();
}
/**
* refreshTable的效果是检查并修改数据库中的表,使其和传入的实体模型保持一致。
* 本例中,数据库中没有此表,因此变为建表操作。
* @throws SQLException
*/
@Test
public void testCreateTableSimple() throws SQLException{
db.dropTable(Student.class);
db.refreshTable(Student.class);
}
/**
* 先用SQL语句直接建立一张类似的表。
* 然后通过refresh方法,修改已存在的表。
* @throws SQLException
*/
@Test
public void testAlterTableSimple() throws SQLException{
//准备一张结构不同的表
db.dropTable(Student.class);
String sql;
if(db.getProfile(null).getName()==RDBMS.derby){
sql="create table STUDENT(\n"+
"ID int generated by default as identity not null,\n"+
"GENDER varchar(6),\n"+
"NAME varchar(255),\n"+
"DATE_OF_BIRTH timestamp,\n"+
"constraint PK_STUDENT primary key(ID)\n"+
")";
}else {
sql="create table STUDENT(\n"+
"ID int unsigned not null AUTO_INCREMENT,\n"+
"GENDER varchar(6),\n"+
"NAME varchar(255),\n"+
"DATE_OF_BIRTH timestamp,\n"+
"constraint PK_STUDENT primary key(ID)\n"+
")";
}
db.executeSql(sql);
//开始刷新表
System.out.println("=== Begin refresh table ===");
db.refreshTable(Student.class);
}
/**
* 传入一个事件监听器,从而可以监测刷新操作的步骤
* @see jef.database.support.MetadataEventListener
*/
@Test
public void testAlterTableProgress() throws SQLException{
//准备一张结构不同的表
db.dropTable(Student.class);
String sql;
if(db.getProfile(null).getName()==RDBMS.derby){
sql="create table STUDENT(\n"+
"ID int generated by default as identity not null,\n"+
"GENDER varchar(6),\n"+
"NAME varchar(128),\n"+
"REV_NAME varchar(255),\n"+
"DATE_OF_BIRTH timestamp,\n"+
"constraint PK_STUDENT primary key(ID)\n"+
")";
}else {
sql="create table STUDENT(\n"+
"ID int UNSIGNED not null AUTO_INCREMENT,\n"+
"GENDER varchar(6),\n"+
"NAME varchar(128),\n"+
"REV_NAME varchar(255),\n"+
"DATE_OF_BIRTH timestamp,\n"+
"constraint PK_STUDENT primary key(ID)\n"+
")";
}
db.executeSql(sql);
System.out.println("=== Begin refresh table ===");
db.refreshTable(Student.class,new ProgressSample());
}
/**
* 使用代码构造一个动态的表模型,并用这个表模型来维护数据库
* @throws SQLException
*/
@Test
public void testAlterTupleTable() throws SQLException{
TupleMetadata model=new TupleMetadata("MY_TABLE");
model.addColumn("ID", new ColumnType.AutoIncrement(8));
model.addColumn("NAME", new ColumnType.Varchar(64));
model.addColumn("DATA", new ColumnType.Varchar(128));
model.addColumn("DOB", new ColumnType.TimeStamp().notNull().defaultIs(Func.current_timestamp));
model.addColumn("MODIFIED", new ColumnType.TimeStamp().notNull());
model.addColumn("CONTANT", new ColumnType.Clob());
//第一次刷新,创建 MY_TABLE
db.refreshTable(model, null);
//修改模型字段
model.removeColumn("DATA");
model.updateColumn("NAME", new ColumnType.Varchar(128).notNull());
model.updateColumn("MODIFIED", new ColumnType.TimeStamp());
model.addColumn("DATA1", new ColumnType.Varchar(64));
model.addColumn("AGE", new ColumnType.Int(12));
//第二次刷新,修改MY_TABLE的字段
db.refreshTable(model, null);
System.out.println("=== begin drop ===");
db.dropTable(model);
}
@AfterClass
public static void close() {
if (db != null) {
db.close();
}
}
}