DatabaseMetaData 接口: 获取数据库,,,表,,列,,等元数据信息
jdbc使用:
// 获取一个连接
Connection connection = DriverManager.getConnection(url,username,password);
// 获取执行对象 statement,,或者 preparedStatement
Statement statement = connection.createStatement();
// 执行后获取结果集
String sql= "select * from user";
ResultSet resultSet = statement.executeQuery(sql);
// 遍历ResultSet 获取结果
while(resultSet.next()){
// ...
}
// 关闭资源
resultSet.close();
statement.close()
connection.close()
DatabaseMetaData 获取元数据信息 connection.getMetaData()
会传很多参数,
获取表 : connection.getTables()
获取字段: connection.getColumns()
获取主键: connection.getPrimaryKey()
返回的得到的 ResultSet 可以获取到这些元数据,,比如 ,字段名字,字段大小,字段类型,字段是否允许为空,字段的备注,,
自己写一个mybatis的代码生成器:
- 要获取每一个表的元数据,,
设置一个类来接收,,
/**
* 描述表的信息
*/
@Data
public class TableClass {
/**
* 表名字
*/
private String tableName;
/**
* 生成的model的名字
*/
private String modelName;
private String serviceName;
private String mapperName;
private String packageName;
/**
* 每一个表有很多的字段
*/
private List<ColumnClass> columns;
}
@Data
public class ColumnClass {
/**
* 对应的java属性的名字
*/
private String propertyName;
/**
* 数据库中的名字
*/
private String columnName;
/**
* 字段的类型,,在数据库中的类型
*/
private String type;
/**
* 备注
*/
private String remark;
/**
* 是否是主键
*/
private Boolean isPrimary;
}
就需要知道 Table的元数据,,,每一个Field的元数据,,根据Field的不同的类型使用不同的java类型去转换,,,,需要知道每一个Field是否是主键,,主键的xxxMapper.xml 中的写法不同,,
通过DatabaseMetaData获取到了元数据之后,转换成相应的实体类,,,,
就变成了一个一个的 TableClass
,
- 准备freemarker 模板,,model,mapper,service,controller的模板,,
- 将模板结合获取到的 TableClass的集合,,生成每一个表对应的 model,mapper,service等
freemarker的使用
public void test() throws TemplateException, IOException {
// 获取一个连接
Configuration configuration = new Configuration(Configuration.VERSION_2_3_31);
// 设置模板的位置
configuration.setClassLoaderForTemplateLoading(this.getClass().getClassLoader(),"templates");
// 获取模板
Template template = configuration.getTemplate("hehe.ftl");
HashMap<String, Object> map = new HashMap<>();
map.put("name","cc");
StringWriter out = new StringWriter();
// 生成
template.process(map,out);
System.out.println(out.toString());
}
代码:
public void getMeta() throws SQLException {
Connection connection = this.getConnection();
// DatabaseMetaData: 数据库,表,列等元数据信息
DatabaseMetaData metaData = connection.getMetaData();
// 数据库名: null表示所有数据库的表信息
String catalog = "mybatisplus";
// 模式名, null表示所有模式的表
String schemaPattern = null;
// 表名模式 ,,%表示所有表信息
String tableNamePattern = "%user";
// 表示获取 表信息
String[] types = {"TABLE"};
ResultSet resultSet = metaData.getTables(catalog, schemaPattern, tableNamePattern, types);
while (resultSet.next()){
String tableCatalog = resultSet.getString("TABLE_CAT");
String remarks = resultSet.getString("REMARKS");
String tableName = resultSet.getString("TABLE_NAME");
String tableType = resultSet.getString("TABLE_TYPE");
System.out.println("tableCatalog = " + tableCatalog);
System.out.println("remark = " + remarks);
System.out.println("tableName = " + tableName);
System.out.println("tableType = " + tableType);
}
resultSet.close();
connection.close();
}
public void getColumns() throws SQLException {
Connection connection = this.getConnection();
DatabaseMetaData metaData = connection.getMetaData();
ResultSet tableResultSet = metaData.getTables("mybatisplus", null, "%user", new String[]{"TABLE"});
while (tableResultSet.next()){
String tableName = tableResultSet.getString("TABLE_NAME");
ResultSet columnsResultSet = metaData.getColumns("mybatisplus", null, tableName, null);
while (columnsResultSet.next()){
String columnName = columnsResultSet.getString("COLUMN_NAME");
String dataType = columnsResultSet.getString("TYPE_NAME");
String columnSize = columnsResultSet.getString("COLUMN_SIZE");
Object isNullable = columnsResultSet.getObject("IS_NULLABLE");
String remarks = columnsResultSet.getString("REMARKS");
System.out.println("columnName = " + columnName);
System.out.println("dataType = " + dataType);
System.out.println("columnSize = " + columnSize);
System.out.println("isNullable = " + isNullable);
System.out.println("remark = " + remarks);
System.out.println();
ResultSet primaryKeysResultSet = metaData.getPrimaryKeys("mybatisplus", null, tableName);
while (primaryKeysResultSet.next()){
// 是否是主键
}
}
columnsResultSet.close();
}
tableResultSet.close();
connection.close();
}
}