精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (6)
|
|
---|---|
作者 | 正文 |
发表时间:2010-04-01
asm,cglib实现的(动态操作字节码的库),他们可以动态生成class然后用classloader加载。这样你的内存中就有了一个Record类了。
|
|
返回顶楼 | |
发表时间:2010-04-01
建议看看EL规范,我空间里面有。
|
|
返回顶楼 | |
发表时间:2010-04-01
你这种编码的随意性就太大了,开发前就不需要完整的实体模型设计,开发者想用什么字段整合成一个对象都可以,让后期其他人怎么去维护呢?
这样的情况好hibernate做的比较好,开发前有个固定的模型设计,你查出来的都是固定结构化了对象,更何况你要是在一对多的情况下你怎么生成一个bean呢?难道还要查出多个不同的对象出来?本来通过hibernate的关系就可以用。导航出来的东西,你会多出好多的代码 |
|
返回顶楼 | |
发表时间:2010-04-01
wgx19830922 写道 可以通过查询封装为List<Map<String,Object>> 形式的数据。前面的页面也支持
${map.name}的形式的。 我觉的楼主想要的结果,这种方法能很好的实现, 为什么非要用javabean呢? |
|
返回顶楼 | |
发表时间:2010-04-01
最后修改:2010-04-01
map的數據結構不是可以了麽?
asm倒是可以修改字節碼,不過可能稍微麻煩點 幫你隨便搜了一下,不知道正確與否 http://yuping.iteye.com/blog/117068 |
|
返回顶楼 | |
发表时间: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)); |
|
返回顶楼 | |
发表时间: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; } } |
|
返回顶楼 | |
发表时间:2010-04-01
结果这样分装,后期文档就一定要详细,不然,map里什么东西,我看就不一定能详细知道了!!!!
|
|
返回顶楼 | |
发表时间:2010-04-01
如果楼主确实想生成javabean的话不妨试试ResultSet的元数据metadata
|
|
返回顶楼 | |
发表时间: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); |
|
返回顶楼 | |