List<FhPcut> queryDatabase = getQueryDatabase(serverAddress, port, username, password, database, sql.toString(), FhPcut.class);
/**
* 外部数据库调用方法
* @param serverAddress //数据库地址
* @param port
* @param username
* @param password
* @param database //指定的库名
* @param query // 查询语句
* @param entityClass //你希望返回的实体,实体和数据库字段名必须一致
* @return
* @param <T>
*/
public <T> List<T> getQueryDatabase(String serverAddress, int port, String username, String password, String database,
String query, Class<T> entityClass) {
//为了避免更改原有的架构及配置参数 故调用此方法进行数据库链接
//传参为数据库链接信息 最后一个为实体类 会根据你实体类的字段名反射出数据库查询的字段名
//如实体类字段为name 数据库字段为name 则不需要做任何处理
//如实体类字段为name 数据库字段为name1 则需要在查询语句中写为name1 as name
//最终会返回你传入实体类的集合
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
List<T> resultList = new ArrayList<>();
try {
// 构建数据库连接 URL
String url = "jdbc:sqlserver://" + serverAddress + ":" + port + ";databaseName=" + database;
// 1. 创建数据库连接
connection = DriverManager.getConnection(url, username, password);
// 2. 创建 Statement 对象
statement = connection.createStatement();
// 3. 执行查询
resultSet = statement.executeQuery(query);
// 4. 处理查询结果
while (resultSet.next()) {
// 创建实体类实例
T entity = entityClass.getDeclaredConstructor().newInstance();
// 获取实体类的所有字段
Field[] fields = entityClass.getDeclaredFields();
// 遍历实体类的每一个字段
for (Field field : fields) {
// 获取字段名
String columnName = field.getName();
// 获取字段值,并设置到实体类中
Object value = resultSet.getObject(columnName);
field.setAccessible(true);
field.set(entity, value);
}
// 将实体类对象添加到结果列表中
resultList.add(entity);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 5. 关闭连接
try {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return resultList;
}