package databaseUtils;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;
public class SetBean<T> {
/**
* @param clazz
* 所要封装的javaBean
* @param rs
* 记录集
* @return ArrayList 数组里边装有 多个javaBean
* @throws Exception
*/
public List<T> getList(Class<T> clazz, ResultSet rs) {
Field field = null;
List<T> lists = new ArrayList<T>();
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
int pp =0;
while (rs.next()) {
T t = clazz.newInstance();
// 反射, 从ResultSet绑定到JavaBean
//System.out.print("pp:" + (++pp) + "====");
for (int i = 0; i < counts; i++) {
// 设置参数类型,此类型应该跟javaBean 里边的类型一样,而不是取数据库里边的类型
field = clazz.getDeclaredField(columnNames[i]);
// 这里是获取bean属性的类型
Class<?> beanType = field.getType();
// 根据 rs 列名 ,组装javaBean里边的其中一个set方法,object 就是数据库第一行第一列的数据了
Object value = rs.getObject(columnNames[i]);
//System.out.print("value:" + value);
// 处理value的类型,从数据库类型转换成javaBean类型
if (value != null) value = dealWithValue(value,beanType);
String setMethodName = "set"
+ firstUpperCase(columnNames[i]);
// 第一个参数是传进去的方法名称,第二个参数是 传进去的类型;
Method m = t.getClass().getMethod(setMethodName, beanType);
// 第二个参数是传给set方法数据;如果是get方法可以不写
m.invoke(t, value);
}
//System.out.println();
lists.add(t);
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return lists;
}
/**
* @param clazz
* bean类
* @param rs
* 结果集 (只有封装第一条结果)
* @return 封装了查询结果的bean对象
*/
public T getObj(Class<T> clazz, ResultSet rs) {
Field field = null;
T obj = 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
if (rs.next()) {
T t = clazz.newInstance();
// 反射, 从ResultSet绑定到JavaBean
for (int i = 0; i < counts; i++) {
try{
// 设置参数类型,此类型应该跟javaBean 里边的类型一样,而不是取数据库里边的类型
field = clazz.getDeclaredField(columnNames[i]);
}catch(Exception ex){
ex.printStackTrace();
continue;
}
// 这里是获取bean属性的类型
Class<?> beanType = field.getType();
// 根据 rs 列名 ,组装javaBean里边的其中一个set方法,object 就是数据库第一行第一列的数据了
Object value = rs.getObject(columnNames[i]);
//处理value的类型,从数据库类型转换成javaBean类型
if (value != null) value = dealWithValue(value,beanType);
String setMethodName = "set"
+ firstUpperCase(columnNames[i]);
// 第一个参数是传进去的方法名称,第二个参数是 传进去的类型;
Method m = t.getClass().getMethod(setMethodName, beanType);
// 第二个参数是传给set方法数据;如果是get方法可以不写
m.invoke(t, value);
}
obj = t;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return obj;
}
private Object dealWithValue(Object value, Class<?> beanType) {
// 这里是获取数据库字段的类型
Class<?> dbType = value.getClass();
// 处理日期类型不匹配问题
if (dbType == java.sql.Timestamp.class
&& beanType == java.util.Date.class) {
// value = new
// java.util.Date(rs.getTimestamp(columnNames[i]).getTime());
value = new java.util.Date(
((java.sql.Timestamp) value).getTime());
}
// 处理double类型不匹配问题
if (dbType == java.math.BigDecimal.class
&& beanType == double.class) {
// value = rs.getDouble(columnNames[i]);
value = new Double(value.toString());
}
// 处理int类型不匹配问题
if (dbType == java.math.BigDecimal.class
&& beanType == int.class) {
// value = rs.getInt(columnNames[i]);
value = new Integer(value.toString());
}
// 处理raw类型不匹配问题
if (dbType == byte[].class
&& beanType == byte[].class) {
// value = rs.getInt(columnNames[i]);
value = value.toString().getBytes();
}
return value;
}
// 首写字母变大写
public static String firstUpperCase(String old) {
return old.substring(0, 1).toUpperCase() + old.substring(1);
}
}

knn_knn
- 粉丝: 55
最新资源
- cloudwatchlogs-jvm-0.31.0-beta.jar
- spark_uber_2.11-0.0.29-sources.jar
- zipline-profiler-1.8.0-javadoc.jar
- databrew-0.29.1-beta-sources.jar
- h2o-logging-impl-log4j2-3.44.0.1-sources.jar
- paging-common-js-3.3.0-alpha02-0.5.1-javadoc.jar
- apprunner-1.3.100-javadoc.jar
- configservice-1.2.4-javadoc.jar
- cybrid-api-bank-java-v0.60.9.jar
- wisp-logging-1.3.5-sources.jar
- cloudtraildata-jvm-1.4.51-sources.jar
- bedrock-jvm-1.4.104.jar
- tempest-testing-jvm-2024.04.03.173818-899f19f-javadoc.jar
- directoryservice-jvm-1.4.74.jar
- datapipeline-jvm-1.1.13-sources.jar
- bedrockdataautomationruntime-jvm-1.4.70-sources.jar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


