论坛首页 Java企业应用论坛

根据select sql中的字段名生成一个JavaBean,bean中包含所有字段的Get方法

浏览 16260 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (6)
作者 正文
   发表时间:2010-04-01  
asm,cglib实现的(动态操作字节码的库),他们可以动态生成class然后用classloader加载。这样你的内存中就有了一个Record类了。
0 请登录后投票
   发表时间:2010-04-01  
建议看看EL规范,我空间里面有。
0 请登录后投票
   发表时间:2010-04-01  
你这种编码的随意性就太大了,开发前就不需要完整的实体模型设计,开发者想用什么字段整合成一个对象都可以,让后期其他人怎么去维护呢?
这样的情况好hibernate做的比较好,开发前有个固定的模型设计,你查出来的都是固定结构化了对象,更何况你要是在一对多的情况下你怎么生成一个bean呢?难道还要查出多个不同的对象出来?本来通过hibernate的关系就可以用。导航出来的东西,你会多出好多的代码
0 请登录后投票
   发表时间:2010-04-01  
wgx19830922 写道
可以通过查询封装为List<Map<String,Object>> 形式的数据。前面的页面也支持
${map.name}的形式的。


我觉的楼主想要的结果,这种方法能很好的实现, 为什么非要用javabean呢? 
0 请登录后投票
   发表时间:2010-04-01   最后修改:2010-04-01
map的數據結構不是可以了麽?

asm倒是可以修改字節碼,不過可能稍微麻煩點

幫你隨便搜了一下,不知道正確與否

http://yuping.iteye.com/blog/117068
0 请登录后投票
   发表时间:2010-04-01  
思路对了实践上是很简单,数据库数据动态封装成javaBean,首先,通过java API获取你javaBean所有的方法(set方法)把它封装成map<String,Method>,如:userName对应 setUserName()这个方法,然后,获取 ResultSet所有的列,通过列名获取set方法(列名必须与属性名相同或写配置对应),最后动态创建javaBen对象oEntity = oEntity.getClass().newInstance();
Method method = setMethods.get("列名");//获取set属性方法
method.invoke(oEntity, oRs.getObject(i));
0 请登录后投票
   发表时间:2010-04-01  
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.sql.ResultSetMetaData;
import java.util.Map;
import java.util.HashMap;
import java.sql.Types;

public class Convert {
public static List<Object> ResultSetToList(Object oEntity, ResultSet oRs) {
List<Object> listObjects = new ArrayList<Object>(0);
Map<String, Method> setMethods = new HashMap<String, Method>(0);
Method[] methods = oEntity.getClass().getMethods();
for (int i = 0, page = methods.length; i < page; i++) {
String methodName = methods[i].getName();
if (methodName.indexOf("set") == 0) {
methodName = methodName.replaceFirst("set", "").toLowerCase();
setMethods.put(methodName, methods[i]);
}
}
try {
if (oRs != null) {
ResultSetMetaData oRSMData = oRs.getMetaData();
while (oRs.next()) {
oEntity = oEntity.getClass().newInstance();
for (int i = 1, page = oRSMData.getColumnCount(); i <= page; i++) {
String colName = oRSMData.getColumnName(i).replaceAll(
"_", "").toLowerCase();
Method method = setMethods.get(colName);
// System.out.println(colName + "=" + method + "="
// + oRSMData.getColumnType(i));
switch (oRSMData.getColumnType(i)) {
case Types.NUMERIC:
method.invoke(oEntity, oRs.getDouble(i));
break;
case Types.TIMESTAMP:
method.invoke(oEntity, oRs.getString(i));
break;
case Types.BLOB:
method.invoke(oEntity, oRs.getBytes(i));
break;
case Types.TINYINT:
case Types.SMALLINT:
method.invoke(oEntity, oRs.getShort(i));
break;
default:
method.invoke(oEntity, oRs.getObject(i));
}
}
listObjects.add(oEntity);
}
}
} catch (SQLException e) {
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
oRs.close();
oRs = null;
setMethods = null;
methods = null;
} catch (SQLException e) {
e.printStackTrace();
}
}
return listObjects;
}
}
0 请登录后投票
   发表时间:2010-04-01  
结果这样分装,后期文档就一定要详细,不然,map里什么东西,我看就不一定能详细知道了!!!!
0 请登录后投票
   发表时间:2010-04-01  
如果楼主确实想生成javabean的话不妨试试ResultSet的元数据metadata
0 请登录后投票
   发表时间:2010-04-01  
当然是可以,只不过这些编程就无法在集成开发环境直接使用bean的属性,事实上这也就是动态生成java源码并动态编辑的过程,java完全能做到,像EBJ就是通过动态代理的方式实现的,他把接口和类进行合并,也就是使类去继承接品,然后对这个新类进行动态编译,最后生一个class文件。他的调用是通过接口来定义的。当然这个过程有点技术含量,首先是生成java源码,得通过数据库字段生成一个javabean的类的源码,再能过动态编辑就OK了,当然动态编辑也不复杂,你可以看一下资料就行了,这是我以前作的一个测试,你可以参考一下。
-----------------------------------------------------------------------
String filePath = "/D:/myclass/com/chen/One.java";
		String binDir = "/D:/myclass/bin";
		StringOutputStream out = new StringOutputStream();
		PrintWriter write = new PrintWriter(out);
		int len = Main.compile(new String[]{"-encoding", "UTF-8","-classpath","D:\\myclass","-d", binDir, filePath},write);
		System.out.println("good");
		System.out.println(len);
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics