jdbc 将ResultSet的结果集封装到java bean中,结果只封装了第一条数据,以下是封装一条数据到一个bean中去 10
publicClasstoEntity(ResultSetrs,Classclazz){Fieldfield=null;Classt=null;//取得类里边的所有方法t...
public Class toEntity(ResultSet rs,Class clazz) {
Field field = null;
Class t = null;
// 取得类里边的所有方法
try {
// 取得ResultSet列名
ResultSetMetaData rsmd = rs.getMetaData();
// 获取记录集中的列数
int counts = rsmd.getColumnCount();
// 定义counts个String 变量
String[] columnNames = new String[counts];
// 给每个变量赋值
for (int i = 0; i < counts; i++) {
columnNames[i] = rsmd.getColumnLabel(i + 1).toLowerCase();
}
// 变量ResultSet
while (rs.next()) {
t = clazz.newInstance().getClass();
// 反射, 从ResultSet绑定到JavaBean
for (int i = 0; i < counts; i++) {
// 根据 rs 列名 ,组装javaBean里边的其中一个set方法,object 就是数据库第一行第一列的数据了
Object value = rs.getObject(columnNames[i]);
if (value instanceof Clob)
{
value = rs.getString(columnNames[i]);
}
else if (value instanceof Blob)
{
value = rs.getBytes(columnNames[i]);
}
else if (value instanceof Date)
{
value = rs.getTimestamp(columnNames[i]);
}else if(value instanceof Integer){
value = rs.getInt(columnNames[i]);
}else if(value instanceof Double){
value = rs.getDouble(columnNames[i]);
}
//这里是获取数据库字段的类型
Class<?> dbType = value.getClass();
//设置参数类型,此类型应该跟javaBean 里边的类型一样,而不是取数据库里边的类型
field = clazz.getDeclaredField(columnNames[i]);
Class<?> beanType = field.getType();
//如果发生从数据库获取到得类型跟javaBean类型不同,按String类型取吧
/*
if(beanType!=dbType){
value = rs.getString(columnNames[i]);
}*/
String setMethodName = "set" + firstUpperCase(columnNames[i]);
// 第一个参数是传进去的方法名称,第二个参数是 传进去的类型;
Method m = t.getClass().getMethod(setMethodName,beanType);
// 第二个参数是传给set方法数据;如果是get方法可以不写
m.invoke(t, value);
}
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return t;
}
为什么会只封装了第一条记录呢? 展开
Field field = null;
Class t = null;
// 取得类里边的所有方法
try {
// 取得ResultSet列名
ResultSetMetaData rsmd = rs.getMetaData();
// 获取记录集中的列数
int counts = rsmd.getColumnCount();
// 定义counts个String 变量
String[] columnNames = new String[counts];
// 给每个变量赋值
for (int i = 0; i < counts; i++) {
columnNames[i] = rsmd.getColumnLabel(i + 1).toLowerCase();
}
// 变量ResultSet
while (rs.next()) {
t = clazz.newInstance().getClass();
// 反射, 从ResultSet绑定到JavaBean
for (int i = 0; i < counts; i++) {
// 根据 rs 列名 ,组装javaBean里边的其中一个set方法,object 就是数据库第一行第一列的数据了
Object value = rs.getObject(columnNames[i]);
if (value instanceof Clob)
{
value = rs.getString(columnNames[i]);
}
else if (value instanceof Blob)
{
value = rs.getBytes(columnNames[i]);
}
else if (value instanceof Date)
{
value = rs.getTimestamp(columnNames[i]);
}else if(value instanceof Integer){
value = rs.getInt(columnNames[i]);
}else if(value instanceof Double){
value = rs.getDouble(columnNames[i]);
}
//这里是获取数据库字段的类型
Class<?> dbType = value.getClass();
//设置参数类型,此类型应该跟javaBean 里边的类型一样,而不是取数据库里边的类型
field = clazz.getDeclaredField(columnNames[i]);
Class<?> beanType = field.getType();
//如果发生从数据库获取到得类型跟javaBean类型不同,按String类型取吧
/*
if(beanType!=dbType){
value = rs.getString(columnNames[i]);
}*/
String setMethodName = "set" + firstUpperCase(columnNames[i]);
// 第一个参数是传进去的方法名称,第二个参数是 传进去的类型;
Method m = t.getClass().getMethod(setMethodName,beanType);
// 第二个参数是传给set方法数据;如果是get方法可以不写
m.invoke(t, value);
}
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return t;
}
为什么会只封装了第一条记录呢? 展开
3个回答
展开全部
t = clazz.newInstance().getClass();
这句话写的有特点。。。t 不就是 clazz么。。你绕一大圈,还是自己。而且还创建了一个对象。。
,
你能把你当参数clazz传进来的类的代码也贴来么。我看你逻辑很乱,根本就不像是能达到你预期效果的样子。。
这句话写的有特点。。。t 不就是 clazz么。。你绕一大圈,还是自己。而且还创建了一个对象。。
,
你能把你当参数clazz传进来的类的代码也贴来么。我看你逻辑很乱,根本就不像是能达到你预期效果的样子。。
更多追问追答
追问
while (rs.next())
{
list.add(toEntity(rs, clazz));
}
这是调用
追答
m.invoke(t, value);
这句话,为什么第一个参数是t?不应该是t类的一个对象么。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询