日期:2014-05-20  浏览次数:20961 次

Oracle和Java数据类型问题

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

import jdbc.util.JDBCUtils;

public class ResultMetaDataDemo
{
public Object getStudent(String sql, Class claz) throws SQLException,
InstantiationExceptionIllegalAccessException,
IllegalArgumentExceptionInvocationTargetException
{
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;

try
{
conn = JDBCUtils.getConnect();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();

ResultSetMetaData rsmd = rs.getMetaData();

// 列数
int columCount = rsmd.getColumnCount();
// 列名
String[] columNames = new String[columCount];

for (int i = 0; i < columNames.length; i++)
{
columNames[i] = rsmd.getColumnName(i + 1);
}

Object obj = null;

Method[] methods = claz.getMethods();

if (rs.next())
{
// 创建对象
obj = claz.newInstance();

for (int i = 0; i < columNames.length; i++)
{
// 列名
String columName = columNames[i];

// 拼接方法名
String methodName = "set" + columName.substring(0, 1)
+ columName.substring(1).toLowerCase();

for (Method method : methods)
{
if (method.getName().equals(methodName))
{
//进行反射调用方法设置值的时候,形参和实参不匹配!
//从Oracle数据库中取出来的整数类型是java.math.BigDecimal,日期类型是java.sql.Date,
//我期望的是java.lang.Integer和java.util.Date,求解?
method.invoke(obj, new Object[]
{ rs.getObject(columName)});
}
}

}
}

return obj;
}
finally
{
try
{
JDBCUtils.free(conn, ps, rs);
}
catch (SQLException e)
{
e.printStackTrace();
}
}

}

/**
 * 抛出的异常:
 * Exception in thread "main" java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at jdbc.oper.ResultMetaDataDemo.getStudent(ResultMetaDataDemo.java:68)
at main.ServerDemo.main(ServerDemo.java:36)
问题:请各位看看哪边有错,提供一下解决方案,谢谢各位!

 */
}
数据类型 反射

------解决方案--------------------
ResultSetMetaData 里有 getColumnTypeName 可以得到 返回的sql 类型