手动写一个将数据库中查询的内容封装到对象中
2016-07-26 16:44
369 查看
-------------------------使用反射来获取指定方法-------------------------
当为方法的参数设置值时可以使用将参数向上转型为Object 再设到方法上
ublic T handler(ResultSet rs) {
try{
T instance = clazz.newInstance();//获取类的实例
ResultSetMetaData rsd= rs.getMetaData();//获取结果集上的源数据
int count = rsd.getColumnCount();//获取源数据上的列数大小
if(rs.next()){
for(int i=1;i<=count;i++){
String name = rsd.getColumnName(i);//获取指定列名称(name)
name ="set" +name.substring(0,1).toUpperCase()+name.substring(1);//拼凑成setName形式
String className = rsd.getColumnClassName(i);//获取指定列名上的类型名(java.lang.String)
Class clazz2 = Class.forName(className);//通过名称来获取Class对象
Method method = clazz.getDeclaredMethod(name, clazz2);
Object object = rs.getObject(i);
method.invoke(instance, object);
}
}
return instance;
}catch(Exception e){
e.printStackTrace();
throw new RuntimeException(e);
}
}
-------------------------------自己实现BeanListHandler------------------------
class BeanListHander<T> implements MyResultHandler<List>{
private Class<T> clazz;
public BeanListHander(Class<T> clazz){
this.clazz = clazz;
}
@Override
public List<T> handler(ResultSet rs) {
List<T> list = new LinkedList<T>();//初始化一个List集合
try{
ResultSetMetaData rsd = rs.getMetaData();//获取结果集元数据
int count = rsd.getColumnCount();//获取数据库中表的列数
Method[] methods = new Method[count];//定义一个方法集合它的大小为列的长度
for(int i=1;i<=count;i++){
String name = rsd.getColumnName(i);//获取要调用方法的名称,这里只能获取它的后缀
name = "set"+name.substring(0,1).toUpperCase()+name.substring(1);//拼接为一个完整的set
方法
String ps = rsd.getColumnClassName(i);//获取方法上的参数类型字符串(java.lang.String)
Class pt =Class.forName(ps);//生成Class对象
methods[i-1] = clazz.getDeclaredMethod(name, pt);//获取方法对象并放入方法数组中
}
while(rs.next()){
T instance = clazz.newInstance();
for(int i=1;i<=count;i++){
Object object = rs.getObject(i);
methods[i-1].invoke(instance, object);
}
list.add(instance);
}
return list;
}catch(Exception e){
e.printStackTrace();
throw new RuntimeException();
}
}
}
注意:这个中要你定义的类中例如User不能有基本类型如int,char,你必须为Integer。。还有一种办法是你可以先判断它是
为Integer类型吗,如果是你就把它转换为int.class设置数据可以为setInt
当为方法的参数设置值时可以使用将参数向上转型为Object 再设到方法上
ublic T handler(ResultSet rs) {
try{
T instance = clazz.newInstance();//获取类的实例
ResultSetMetaData rsd= rs.getMetaData();//获取结果集上的源数据
int count = rsd.getColumnCount();//获取源数据上的列数大小
if(rs.next()){
for(int i=1;i<=count;i++){
String name = rsd.getColumnName(i);//获取指定列名称(name)
name ="set" +name.substring(0,1).toUpperCase()+name.substring(1);//拼凑成setName形式
String className = rsd.getColumnClassName(i);//获取指定列名上的类型名(java.lang.String)
Class clazz2 = Class.forName(className);//通过名称来获取Class对象
Method method = clazz.getDeclaredMethod(name, clazz2);
Object object = rs.getObject(i);
method.invoke(instance, object);
}
}
return instance;
}catch(Exception e){
e.printStackTrace();
throw new RuntimeException(e);
}
}
-------------------------------自己实现BeanListHandler------------------------
class BeanListHander<T> implements MyResultHandler<List>{
private Class<T> clazz;
public BeanListHander(Class<T> clazz){
this.clazz = clazz;
}
@Override
public List<T> handler(ResultSet rs) {
List<T> list = new LinkedList<T>();//初始化一个List集合
try{
ResultSetMetaData rsd = rs.getMetaData();//获取结果集元数据
int count = rsd.getColumnCount();//获取数据库中表的列数
Method[] methods = new Method[count];//定义一个方法集合它的大小为列的长度
for(int i=1;i<=count;i++){
String name = rsd.getColumnName(i);//获取要调用方法的名称,这里只能获取它的后缀
name = "set"+name.substring(0,1).toUpperCase()+name.substring(1);//拼接为一个完整的set
方法
String ps = rsd.getColumnClassName(i);//获取方法上的参数类型字符串(java.lang.String)
Class pt =Class.forName(ps);//生成Class对象
methods[i-1] = clazz.getDeclaredMethod(name, pt);//获取方法对象并放入方法数组中
}
while(rs.next()){
T instance = clazz.newInstance();
for(int i=1;i<=count;i++){
Object object = rs.getObject(i);
methods[i-1].invoke(instance, object);
}
list.add(instance);
}
return list;
}catch(Exception e){
e.printStackTrace();
throw new RuntimeException();
}
}
}
注意:这个中要你定义的类中例如User不能有基本类型如int,char,你必须为Integer。。还有一种办法是你可以先判断它是
为Integer类型吗,如果是你就把它转换为int.class设置数据可以为setInt
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android之获取手机上的图片和视频缩略图thumbnails
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- Python动态类型的学习---引用的理解
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序