Java代码分析:MetaDataQueryDemo的优化与修正
Java代码分析:MetaDataQueryDemo的优化与修正
本文将分析以下Java代码,并给出修正后的代码。该代码使用JDBC连接数据库,通过PreparedStatement和ResultSetMetaData获取查询结果并进行处理。
原始代码:
public class MetaDataQueryDemo {
public static void main(String[] args) throws Exception {
String sql = 'select ename 姓名,sal,job from emp where job = ? or job = ?';
query('manager','SALESMAN');
}
public static void query(String sql, Object... params) throws Exception {
//加载数据库驱动
Connection conn = DBUtil.getConnection();
//获取链接
PreparedStatement ps = conn.prepareStatement(sql);
ParameterMetaData parameterMetaData = ps.getParameterMetaData();
//设置占位符
if (params != null && params.length > 0) {
for (int i = 0; i < parameterMetaData.getParameterCount(); i++) {
ps.setObject(i+1,params[i]);
}
}
//执行sql语句返回结果集
ResultSet resultSet = ps.executeQuery();
//获取结果集元数据
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
//处理结果集
while (resultSet.next()){
for (int i = 1; i < resultSetMetaData.getColumnCount(); i++) {
/*
根据列名返回对应列名的数据
getColumnLabel(int column)
根据sql的查询别名来返回数据,如果没有别名则使用列表
*/
System.out.println(resultSet.getObject(resultSetMetaData.getColumnLabel(i))+"\t");
}
}
System.out.println();
}
}
代码存在以下问题:
query方法中的sql参数没有被使用,而是在main方法中直接调用query方法时传入了具体的参数。- 在处理结果集时,
for循环的条件应为i <= resultSetMetaData.getColumnCount(),而不是i < resultSetMetaData.getColumnCount(),否则最后一列的数据无法输出。 - 在每次输出结果后,应该调用
resultSet.next()方法将结果集指针移到下一行,否则会陷入无限循环。
修正后的代码:
public class MetaDataQueryDemo {
public static void main(String[] args) throws Exception {
String sql = 'select ename 姓名,sal,job from emp where job = ? or job = ?';
query(sql, 'manager', 'SALESMAN');
}
public static void query(String sql, Object... params) throws Exception {
//加载数据库驱动
Connection conn = DBUtil.getConnection();
//获取链接
PreparedStatement ps = conn.prepareStatement(sql);
ParameterMetaData parameterMetaData = ps.getParameterMetaData();
//设置占位符
if (params != null && params.length > 0) {
for (int i = 0; i < parameterMetaData.getParameterCount(); i++) {
ps.setObject(i+1,params[i]);
}
}
//执行sql语句返回结果集
ResultSet resultSet = ps.executeQuery();
//获取结果集元数据
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
//处理结果集
while (resultSet.next()){
for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
/*
根据列名返回对应列名的数据
getColumnLabel(int column)
根据sql的查询别名来返回数据,如果没有别名则使用列表
*/
System.out.print(resultSet.getObject(resultSetMetaData.getColumnLabel(i))+"\t");
}
System.out.println();
}
System.out.println();
}
}
代码修改说明:
- 在
query方法中,将sql参数传递给prepareStatement方法,而不是直接使用main方法中的sql变量。 - 将
for循环的条件改为i <= resultSetMetaData.getColumnCount(),以确保输出所有列的数据。 - 在每次输出结果后调用
resultSet.next()方法,将结果集指针移到下一行,避免陷入无限循环。
总结:
通过以上修改,代码能够正确地使用JDBC连接数据库,并通过PreparedStatement和ResultSetMetaData获取查询结果并进行处理。在实际应用中,需要根据具体需求对代码进行进一步调整和完善。
注:
代码中DBUtil.getConnection()方法需要根据实际情况进行替换,以获取数据库连接。
希望本文对您有所帮助。如果您有任何问题或建议,请随时提出。
版权声明:
本文由AI生成,仅供参考。
原文地址: https://www.cveoy.top/t/topic/qlSx 著作权归作者所有。请勿转载和采集!