一、创建ColumnInfo实体类。
该类用来存放数据库对应某个字段的信息。
@Setter
@Getter
@AllArgsConstructor
@ToString
public class ColumnInfo {
public static int GENERAL_KEY = 0;//普通键
public static int PRIMARY_KEY = 1;//主键
public static int FOREIGN_KEY = 2;//外键
/**
* 字段的名字
*/
private String columnName;
/**
*字段的数据类型
*/
private String typeName;
/**
* 人为规定键的类型 0普通键,1主键,2外键
*/
private int keyType;
}
二、创建TableInfo实体类
用来存表的相关信息。
@Setter
@Getter
@NoArgsConstructor
public class TableInfo {
/**
* 对应数据库中的 表名
*/
private String tableName;
/**
* 用一个map集合来存放表名的他的 字段信息
*/
private Map<String, ColumnInfo> columns = new HashMap<>();
/**
* 唯一的主键,有且只有一个主键,不算联合主键
*/
private ColumnInfo uniquePrimaryKey;
/**
* 所有的主键键信息,包括组合主键
*/
private List<ColumnInfo> primaryKeys = new ArrayList<>();
/**
* 外键的名称的集合
*/
private List<ColumnInfo> importedKeys = new ArrayList<>();
/**
* 外键表名的集合
*/
private List<String> fkTableName = new ArrayList<>();
}
三、数据库类型与java类型的转换
public class TypeConverter {
//java对应java中的类型
private static String javaType;
/**
*
* @param type mySql中的数据类型
* @return java中的类型
* @Description 描述:把传进来的mySql类型转换为java中的类型
*/
public static String mySqlType2JavaType(String mySqlType) {
switch (mySqlType) {
case "CHAR":
javaType = "String";
break;
case "VARCHAR":
javaType = "String";
break;
case "BLOB":
javaType = "byte[]";
break;
case "TEXT":
javaType = "String";
break;
case "INTEGER":
javaType = "Integer";
break;
case "SMALLINT":
javaType = "Integer";
break;
case "TINYINT":
javaType = "Integer";
break;
case "MEDIUMINT":
javaType = "Integer";
break;
case "BIT":
javaType = "Boolean";
break;
case "BIGINT":
javaType = "Long";
break;
case "FLOAT":
javaType = "Float";
break;
case "DOUBLE":
javaType = "Double";
break;
case "DECIMAL":
javaType = "java.math.BigDecimal";
break;
case "DATE":
javaType = "java.util.Date";
break;
case "TIME":
javaType = "java.util.Time";
break;
case "DATETIME":
javaType = "java.util.Date";
break;
case "TIMESTAMP":
javaType = "java.util.Date";
break;
default:
throw new RuntimeException("亲,你要转换的mysql类型[" + mySqlType + "]不存在!");
}
return javaType;
}
}
四、创建TableUtil连接数据库读取信息
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
public class TableUtil {
/**
* 用来存放数据库中所有的表,key为数据库中的表名,value为表信息,全部封装到map集合中存放
*/
public static Map<String, TableInfo> tables = new HashMap<>();
/**
* 将class对象和表信息对象关联起来,便于重用
*/
public static Map<Class, TableInfo> classTableMap = new HashMap<>();
static {
try {
// 获取连接对象
Connection conn = JDBCUtil.getConnection();
// 获取数据库源信息
DatabaseMetaData databaseMetaData = conn.getMetaData();
// 获取所有表名的结果集
ResultSet tableResult = databaseMetaData.getTables(null, "%", "%", new String[] { "TABLE" });
while (tableResult.next()) {
String tableName = (String) tableResult.getObject("TABLE_NAME");
TableInfo tableInfo = new TableInfo();
// 把创建的表放到一个map集合中去
tables.put(tableName, tableInfo);
// 根据表名查询所有数据库表中的所有字段的结果集
ResultSet columns = databaseMetaData.getColumns(null, "%", tableName, "%");
// 遍历获取所有字段信息封装到相应表中
while (columns.next()) {
// 构造一个字段,数据库中的字段应该包括字段名,字段类型,以及是否是主键、外键等因素
ColumnInfo columnInfo = new ColumnInfo(columns.getString("COLUMN_NAME"),
columns.getString("TYPE_NAME"), ColumnInfo.GENERAL_KEY);
tableInfo.getColumns().put(columns.getString("COLUMN_NAME"), columnInfo);
}
// 对应表的所有主键集合,包括外键,组合主键
ResultSet primaryKeysSet = databaseMetaData.getPrimaryKeys(null, "%", tableName);
while (primaryKeysSet.next()) {
// 从所有字段中取主键,添加到所有主键列
ColumnInfo primaryKey = tableInfo.getColumns().get(primaryKeysSet.getObject("COLUMN_NAME"));
// 我们规定类型主键的标志类型
primaryKey.setKeyType(ColumnInfo.PRIMARY_KEY);
// 把主键放到表信息的集合中去
tableInfo.getPrimaryKeys().add(primaryKey);
}
// 若存在主键,则获取第一个作为主键,不考虑联合主键的情况
if (tableInfo.getPrimaryKeys().size() > 0) {
// 获取第一个主键
tableInfo.setUniquePrimaryKey(tableInfo.getPrimaryKeys().get(0));
}
// 所有外键和外键表名的获取
ResultSet importedKeysSet = databaseMetaData.getImportedKeys(null, "%", tableName);
while (importedKeysSet.next()) {
// 被导入的主键表名称也就是外键主表的表名
String fkTableName = (String) importedKeysSet.getObject("PKTABLE_NAME");
// 把外键表名添加到表信息中
tableInfo.getFkTableName().add(fkTableName);
// 从所有字段中取出外键
ColumnInfo importedKey = tableInfo.getColumns().get(importedKeysSet.getObject("FKCOLUMN_NAME"));
// 设置外键规定的标志类型
importedKey.setKeyType(ColumnInfo.FOREIGN_KEY);
// 把外键添加到表的外键集合中去
tableInfo.getImportedKeys().add(importedKey);
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
五、测试方法
public class TestTableUtil {
@Test
public void testCreateTable() throws Exception {
Map<String, TableInfo> tables = TableUtil.tables;
TableInfo tableInfo = tables.get("student");
Map<String, ColumnInfo> columns = tableInfo.getColumns();
Collection<ColumnInfo> column = columns.values();
System.out.println(column);
}
}
六、附JdbcUtil获取连接对象代码
public class JDBCUtil {
private static Connection connection = null;
//配置文件的加载
private static Properties p = null;
static {
try {
p = new Properties();
//获取类加载器
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream inputStream = loader.getResourceAsStream("db.properties");
p.load(inputStream);
//驱动类的加载
Class.forName(p.getProperty("driverClassName"));
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
try {
//连接对象的 获取
connection = DriverManager.getConnection(p.getProperty("url"), p.getProperty("user"),
p.getProperty("password"));
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
}