Jdbc获取数据的字段信息

一、创建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;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值