在学习JDBC过程中,单元测试Order数据库查询时报错
public Order orderForQuery(String sql,Object...args)
{
Connection getconnection=null;
PreparedStatement ps=null;
//执行,获取结果集
ResultSet resultSet=null;
try {
getconnection = JDBCutils.getconnection();
ps = getconnection.prepareStatement(sql);
for(int i=0;i<args.length;i++)
{
ps.setObject(i+1,args[i]);
}
resultSet = ps.executeQuery();
//获取结果集的元数据
java.sql.ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
//获取列数
int columnCount = resultSetMetaData.getColumnCount();
if(resultSet.next())
{
Order order=new Order();
//获取列的列值:通过resultset
for(int i=0;i<columnCount;i++)
{
Object columnValue=resultSet.getObject(i+1);
String columName=resultSetMetaData.getColumnName(i+1);
//通过反射,将对象指定columnName的属性赋值为指定的值columnvalue
java.lang.reflect.Field declaredField =
Order.class.getDeclaredField(columName);
declaredField.setAccessible(true);
declaredField.set(order, columnValue);
}
return order;
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCutils.closeResource(getconnection, ps,resultSet);
}
return null;
}
@Test
public void testOrderForQuery()
{
String sql="select order_id orderId,order_name orderName,order_date orderDate from `order` where order_id=?";
Order orderForQuery = orderForQuery(sql, 1);
System.out.println(orderForQuery);
}
问题原因:这是columnName方法针对数据库列列名识别不了别名,只有在Java类定义的名称和MYSQL定义的列名一样才能使用columnName。
解决方法:将columnName方法函数改为columnLabel,(sql语句修改为JAVA定义类的别名) 方法函数columnLabel既能识别数据库列名也能识别别名,也就是说columnLabel包含columnName功能,且延伸了功能。
public Order orderForQuery(String sql,Object...args)
{
Connection getconnection=null;
PreparedStatement ps=null;
//执行,获取结果集
ResultSet resultSet=null;
try {
getconnection = JDBCutils.getconnection();
ps = getconnection.prepareStatement(sql);
for(int i=0;i<args.length;i++)
{
ps.setObject(i+1,args[i]);
}
resultSet = ps.executeQuery();
//获取结果集的元数据
java.sql.ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
//获取列数
int columnCount = resultSetMetaData.getColumnCount();
if(resultSet.next())
{
Order order=new Order();
//获取列的列值:通过resultset
for(int i=0;i<columnCount;i++)
{
Object columnValue=resultSet.getObject(i+1);
String columName=resultSetMetaData.getColumnLabel(i+1);
//通过反射,将对象指定columnName的属性赋值为指定的值columnvalue
java.lang.reflect.Field declaredField = Order.class.getDeclaredField(columName);
declaredField.setAccessible(true);
declaredField.set(order, columnValue);
}
return order;
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCutils.closeResource(getconnection, ps,resultSet);
}
return null;
}