use of com.github.drinkjava2.jdialects.model.TableModel in project jDialects by drinkjava2.
the class TableModelUtilsOfDb method db2Model.
/**
* Convert JDBC connected database structure to TableModels, note: <br/>
* 1)This method does not close connection <br/>
* 2)This method does not support sequence, foreign keys, primary keys...,
* but will improve later.
*/
public static TableModel[] db2Model(Connection con, Dialect dialect) {
// NOSONAR
List<String> tableNames = new ArrayList<String>();
List<TableModel> tableModels = new ArrayList<TableModel>();
SQLException sqlException = null;
ResultSet rs = null;
PreparedStatement pst = null;
try {
DatabaseMetaData meta = con.getMetaData();
if (dialect.isOracleFamily()) {
// NOSONAR
pst = con.prepareStatement("SELECT TABLE_NAME FROM USER_TABLES");
rs = pst.executeQuery();
while (rs.next()) tableNames.add(rs.getString(TABLE_NAME));
rs.close();
pst.close();
// } else if (dialect.isSQLServerFamily()) {
// pst = con.prepareStatement("select name from sysobjects where
// xtype='U'");
// rs = pst.executeQuery();
// while (rs.next())
// tableNames.add(rs.getString(TABLE_NAME));
// rs.close();
// pst.close();
} else {
rs = meta.getTables(null, null, null, new String[] { "TABLE" });
while (rs.next()) tableNames.add(rs.getString(TABLE_NAME));
rs.close();
}
for (String dbTableName : tableNames) {
rs = con.getMetaData().getColumns(null, null, dbTableName, null);
TableModel oneTable = new TableModel(dbTableName);
while (rs.next()) {
// NOSONAR
String colName = rs.getString("COLUMN_NAME");
oneTable.column(colName);
ColumnModel col = oneTable.getColumn(colName);
int javaSqlType = rs.getInt("DATA_TYPE");
try {
col.setColumnType(TypeUtils.javaSqlTypeToDialectType(javaSqlType));
} catch (Exception e1) {
throw new DialectException("jDialect does not supported java.sql.types value " + javaSqlType, e1);
}
col.setLength(rs.getInt("COLUMN_SIZE"));
col.setNullable(rs.getInt("NULLABLE") > 0);
col.setPrecision(rs.getInt("DECIMAL_DIGITS"));
try {
if (((Boolean) (true)).equals(rs.getBoolean("IS_AUTOINCREMENT")))
col.identityId();
} catch (Exception e) {
}
try {
if ("YES".equalsIgnoreCase(rs.getString("IS_AUTOINCREMENT")))
col.identityId();
} catch (Exception e) {
}
}
tableModels.add(oneTable);
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
sqlException = e;
} finally {
if (pst != null)
try {
pst.close();
} catch (SQLException e1) {
if (sqlException != null)
sqlException.setNextException(e1);
else
sqlException = e1;
}
try {
if (rs != null)
rs.close();
} catch (SQLException e2) {
if (sqlException != null)
sqlException.setNextException(e2);
else
sqlException = e2;
}
}
if (sqlException != null)
throw new DialectException(sqlException);
return tableModels.toArray(new TableModel[tableModels.size()]);
}
use of com.github.drinkjava2.jdialects.model.TableModel in project jDialects by drinkjava2.
the class TableModelUtilsOfEntity method entity2ModelIgnoreConfigMethod.
/**
* Convert a Java entity class or JPA annotated entity classes to
* "TableModel" Object, ignore config method
*/
private static TableModel entity2ModelIgnoreConfigMethod(Class<?> entityClass) {
DialectException.assureNotNull(entityClass, "entity2Model method does not accept a null class");
// Entity
String tableName = null;
Map<String, Object> entityMap = getFirstEntityAnno(entityClass, "Entity");
tableName = (String) entityMap.get("name");
// Table
Map<String, Object> tableMap = getFirstEntityAnno(entityClass, "Table");
if (!StrUtils.isEmpty(tableMap.get("name")))
tableName = (String) tableMap.get("name");
if (StrUtils.isEmpty(tableName))
tableName = entityClass.getSimpleName();
// Build the tableModel
TableModel model = new TableModel(tableName);
if (!tableMap.isEmpty()) {
// Index
Annotation[] indexes = (Annotation[]) tableMap.get("indexes");
if (indexes != null && indexes.length > 0)
for (Annotation anno : indexes) {
Map<String, Object> mp = changeAnnotationValuesToMap(anno, anno.annotationType());
String columnListString = (String) mp.get("columnList");
String[] columns;
if (columnListString.indexOf(',') >= 0)
columns = columnListString.split(",");
else
columns = new String[] { columnListString };
if (columns.length > 0)
model.index((String) mp.get("name")).columns(columns).setUnique((Boolean) mp.get("unique"));
}
// Unique
Annotation[] uniques = (Annotation[]) tableMap.get("uniqueConstraints");
if (uniques != null && uniques.length > 0)
for (Annotation anno : uniques) {
Map<String, Object> mp = changeAnnotationValuesToMap(anno, anno.annotationType());
String[] columnNames = (String[]) mp.get("columnNames");
if (columnNames != null && columnNames.length > 0)
model.unique((String) mp.get("name")).columns(columnNames);
}
}
// SequenceGenerator
Map<String, Object> seqMap = getFirstEntityAnno(entityClass, "SequenceGenerator");
if (!seqMap.isEmpty()) {
model.sequenceGenerator((String) seqMap.get("name"), (String) seqMap.get("sequenceName"), (Integer) seqMap.get("initialValue"), (Integer) seqMap.get("allocationSize"));
}
// TableGenerator
Map<String, Object> tableGenMap = getFirstEntityAnno(entityClass, "TableGenerator");
if (!tableGenMap.isEmpty()) {
model.tableGenerator((String) tableGenMap.get("name"), (String) tableGenMap.get("table"), (String) tableGenMap.get("pkColumnName"), (String) tableGenMap.get("valueColumnName"), (String) tableGenMap.get("pkColumnValue"), (Integer) tableGenMap.get("initialValue"), (Integer) tableGenMap.get("allocationSize"));
}
// UUIDAny
Map<String, Object> uuidAnyMp = getFirstEntityAnno(entityClass, "UUIDAny");
if (!uuidAnyMp.isEmpty()) {
model.uuidAny((String) uuidAnyMp.get("name"), (Integer) uuidAnyMp.get("length"));
}
// FKey
List<Map<String, Object>> fkeys = getEntityAnnos(entityClass, "FKey");
for (Map<String, Object> map : fkeys) {
Boolean ddl = (Boolean) map.get("ddl");
if (ddl == null)
ddl = true;
model.fkey((String) map.get("name")).columns((String[]) map.get("columns")).refs((String[]) map.get("refs")).ddl(ddl);
}
BeanInfo beanInfo = null;
PropertyDescriptor[] pds = null;
try {
beanInfo = Introspector.getBeanInfo(entityClass);
pds = beanInfo.getPropertyDescriptors();
} catch (Exception e) {
DialectException.throwEX("entity2Model can not get bean info", e);
}
for (PropertyDescriptor pd : pds) {
String entityfieldName = pd.getName();
if ("class".equals(entityfieldName) || "simpleName".equals(entityfieldName) || "canonicalName".equals(entityfieldName) || "box".equals(entityfieldName))
continue;
Class<?> propertyClass = pd.getPropertyType();
if (TypeUtils.canMapToSqlType(propertyClass)) {
Field field = ReflectionUtils.findField(entityClass, entityfieldName);
if (field == null)
continue;
if (!getFirstEntityAnno(field, "Transient").isEmpty()) {
ColumnModel col = new ColumnModel(entityfieldName);
col.setColumnType(TypeUtils.toType(propertyClass));
col.setLengths(new Integer[] { 255, 0, 0 });
col.setTransientable(true);
col.setTableModel(model);
model.addColumn(col);
} else {
// SequenceGenerator
Map<String, Object> map = getFirstEntityAnno(field, "SequenceGenerator");
if (!map.isEmpty()) {
model.sequenceGenerator((String) map.get("name"), (String) map.get("sequenceName"), (Integer) map.get("initialValue"), (Integer) map.get("allocationSize"));
}
// TableGenerator
map = getFirstEntityAnno(field, "TableGenerator");
if (!map.isEmpty()) {
model.tableGenerator((String) map.get("name"), (String) map.get("table"), (String) map.get("pkColumnName"), (String) map.get("valueColumnName"), (String) map.get("pkColumnValue"), (Integer) map.get("initialValue"), (Integer) map.get("allocationSize"));
}
// UUIDAny
map = getFirstEntityAnno(field, "UUIDAny");
if (!map.isEmpty()) {
model.uuidAny((String) map.get("name"), (Integer) map.get("length"));
}
ColumnModel col = new ColumnModel(entityfieldName);
col.entityField(entityfieldName);
// Column
Map<String, Object> colMap = getFirstEntityAnno(field, "Column");
if (!colMap.isEmpty()) {
if (!(Boolean) colMap.get("nullable"))
col.setNullable(false);
if (!StrUtils.isEmpty(colMap.get("name")))
col.setColumnName((String) colMap.get("name"));
col.setLength((Integer) colMap.get("length"));
col.setPrecision((Integer) colMap.get("precision"));
col.setScale((Integer) colMap.get("scale"));
col.setLengths(new Integer[] { col.getLength(), col.getPrecision(), col.getScale() });
if (!StrUtils.isEmpty(colMap.get("columnDefinition")))
col.setColumnType(TypeUtils.toType((String) colMap.get("columnDefinition")));
else
col.setColumnType(TypeUtils.toType(propertyClass));
col.setInsertable((Boolean) colMap.get("insertable"));
col.setUpdatable((Boolean) colMap.get("updatable"));
} else {
col.setColumnType(TypeUtils.toType(propertyClass));
col.setLengths(new Integer[] { 255, 0, 0 });
}
// Id
if (!getFirstEntityAnno(field, "Id").isEmpty() || !getFirstEntityAnno(field, "PKey").isEmpty())
col.pkey();
col.setEntityField(entityfieldName);
col.setTableModel(model);
// col will also set TableModel field point to its owner
model.addColumn(col);
// shortcut Id generator annotations
if (existEntityAnno(field, "AutoId"))
col.autoId();
if (existEntityAnno(field, "IdentityId"))
col.identityId();
if (existEntityAnno(field, "TimeStampId"))
col.timeStampId();
if (existEntityAnno(field, "UUID25"))
col.uuid25();
if (existEntityAnno(field, "UUID32"))
col.uuid32();
if (existEntityAnno(field, "UUID36"))
col.uuid36();
// GeneratedValue
Map<String, Object> gvMap = getFirstEntityAnno(field, "GeneratedValue");
if (!gvMap.isEmpty()) {
Object strategy = gvMap.get("strategy");
if (strategy != null) {
String strategyStr = strategy.toString();
if ("AUTO".equals(strategyStr))
col.autoId();
else if ("IDENTITY".equals(strategyStr))
col.identityId();
else if ("UUID25".equals(strategyStr))
col.uuid25();
else if ("UUID32".equals(strategyStr))
col.uuid32();
else if ("UUID36".equals(strategyStr))
col.uuid36();
else if ("TIMESTAMP".equals(strategyStr))
col.timeStampId();
else {
String generator = (String) gvMap.get("generator");
if (StrUtils.isEmpty(generator))
throw new DialectException("GeneratedValue strategy '" + strategyStr + "' can not find a generator");
col.idGenerator(generator);
}
}
}
// SingleFKey is a shortcut format of FKey, only for 1
// column
Map<String, Object> refMap = getFirstEntityAnno(field, "SingleFKey");
if (!refMap.isEmpty()) {
Boolean ddl = (Boolean) refMap.get("ddl");
if (ddl == null)
ddl = true;
model.fkey((String) refMap.get("name")).columns(col.getColumnName()).refs((String[]) refMap.get("refs")).ddl(ddl);
}
// SingleIndex is a ShortCut format of Index, only for 1
// column
Map<String, Object> idxMap = getFirstEntityAnno(field, "SingleIndex");
if (!idxMap.isEmpty())
model.index((String) idxMap.get("name")).columns(col.getColumnName());
// SingleUnique is a ShortCut format of Unique, only for 1
// column
Map<String, Object> uniMap = getFirstEntityAnno(field, "SingleUnique");
if (!uniMap.isEmpty())
model.unique((String) uniMap.get("name")).columns(col.getColumnName());
}
}
}
// End of columns loop
return model;
}
use of com.github.drinkjava2.jdialects.model.TableModel in project jDialects by drinkjava2.
the class TableModelUtilsOfEntity method oneEntity2Model.
/**
* Convert a Java entity class or JPA annotated entity classes to
* "TableModel" Object, if this class has a "config(TableModel tableModel)"
* method, will also call it
*/
public static TableModel oneEntity2Model(Class<?> entityClass) {
DialectException.assureNotNull(entityClass, "Entity class can not be null");
TableModel model = tableModelCache.get(entityClass);
if (model != null)
return model.newCopy();
model = entity2ModelIgnoreConfigMethod(entityClass);
Method method = null;
try {
method = entityClass.getMethod("config", TableModel.class);
} catch (Exception e) {
// NOSONAR
}
if (method != null)
try {
method.invoke(null, model);
} catch (Exception e) {
throw new DialectException(e);
}
if (model != null)
tableModelCache.put(entityClass, model);
return model.newCopy();
}
use of com.github.drinkjava2.jdialects.model.TableModel in project jDialects by drinkjava2.
the class DDLTest method testNotNullModel.
private static TableModel testNotNullModel() {
// Not Null
TableModel t = new TableModel("testTable");
t.column("b1").BOOLEAN().notNull();
t.column("d2").DOUBLE().notNull();
t.column("f3").FLOAT(5).notNull();
t.column("i4").INTEGER().notNull();
t.column("l5").LONG().notNull();
t.column("s6").SHORT().notNull();
t.column("b7").BIGDECIMAL(10, 2).notNull();
t.column("s8").STRING(20).notNull();
t.column("d9").DATE().notNull();
t.column("t10").TIME().notNull();
t.column("t11").TIMESTAMP().notNull();
t.column("v12").VARCHAR(300).notNull();
return t;
}
use of com.github.drinkjava2.jdialects.model.TableModel in project jDialects by drinkjava2.
the class DDLTest method testIndex.
@Test
public void testIndex() {
// index
TableModel t = new TableModel("indexTable");
t.column("s1").STRING(20).singleIndex("aa").singleUnique("bb");
t.column("s2").STRING(20).singleIndex().singleUnique();
t.column("s3").STRING(20).singleIndex().singleUnique("cc");
t.column("s4").STRING(20).singleIndex("dd").singleUnique();
t.column("s5").STRING(20).singleIndex();
t.column("s6").STRING(20).singleIndex("ee");
t.index().columns("s1", "s2");
t.index("idx1").columns("s5", "s1");
printAllDialectsDDLs(t);
printOneDialectsDDLs(Dialect.MySQL5InnoDBDialect, t);
testOnCurrentRealDatabase(t);
}
Aggregations