`
181054867
  • 浏览: 148773 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

阅读更多

例如我有一个这样的sql:

select username, password from users

 我想在select结束后,通过ResultSet中的字段名生成一个JavaBean,其代码大概如下:

public class Record{
   //生成这个方法,get后返回sql中结果集的username字段值
   public String getUsername(){}
   //生成这个方法,get后返回sql中结果集的password字段值
   public String getPassword(){}
}

关键在于:这个JaveBean是动态的,Get方法因应sql字段不同而不同

曾经记得在Hibernate中广泛使用这种生成字节码,动态化Class的应用,敢问各位高手,是否知道如何实现,请赐教!!

 

补充一下应用场景:

select 后,生成的这个Record,我是用在Jsp的 el 表达式中:

<h1>UserName:${record.Username}<h1>
<h1>Password:${record.Password}<h1>

 这样就避免每个数据库表都写一个JavaBean了,不知我这样的想法是否可行,如有什么性能问题或其他担心,敬请指正!

感谢!!

分享到:
评论
23 楼 181054867 2010-04-01  
aaa5131421 写道
你这种编码的随意性就太大了,开发前就不需要完整的实体模型设计,开发者想用什么字段整合成一个对象都可以,让后期其他人怎么去维护呢?
这样的情况好hibernate做的比较好,开发前有个固定的模型设计,你查出来的都是固定结构化了对象,更何况你要是在一对多的情况下你怎么生成一个bean呢?难道还要查出多个不同的对象出来?本来通过hibernate的关系就可以用。导航出来的东西,你会多出好多的代码

您不能理解随意性,我认为,为数据库的每个表写一个JavaBean,在执行select sql后,还要写代码new这个Bean,然后在ResultSet中getString(XX),把值一个一个地赋给Bean,这样属于硬编码。
事实是,一些以显示为主的网站,对ResultSet结果集的操作只是单纯的显示出来,所以,我相信可能通过优化,避免我前面说的:写很多很多枯燥无用的代码,通过对ResultSet进行封装,产生一个Bean,然后在页面通过column name直接获得值,这样我们要写的代码会大大减少,缩短我们的开发时间,也让我们觉得,现在做的只是为了写代码更方便,当作一种享受,不要重复发明轮子而已。
至于你说的什么一对多,请不要把Hibernate的理念搬到这里回复,因为我并不使用Hibernate,也不存在什么一对多,这个Bean的产生,只是跟你写的sql有关系,你sql怎么写,你返回什么字段,这个Bean就生成相应字段的Get方法,sql你已经确定,至于什么一对多,多对多,是在你写sql前的事
我这样做是为了写更少的代码
22 楼 lishuaibt 2010-04-01  
CGLIB
21 楼 luren85 2010-04-01  
DbUtils中BeanHandler就可以实现
20 楼 抛出异常的爱 2010-04-01  
181054867 写道
用Hibernate的朋友帮忙看看

ibatis才行。

List<Map<String,String>>
19 楼 22cgreen 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);
18 楼 qljcly 2010-04-01  
如果楼主确实想生成javabean的话不妨试试ResultSet的元数据metadata
17 楼 kjj 2010-04-01  
结果这样分装,后期文档就一定要详细,不然,map里什么东西,我看就不一定能详细知道了!!!!
16 楼 luojian 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;
}
}
15 楼 luojian 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));
14 楼 jy00105276 2010-04-01  
map的數據結構不是可以了麽?

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

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

http://yuping.iteye.com/blog/117068
13 楼 Diego玄霄 2010-04-01  
wgx19830922 写道
可以通过查询封装为List<Map<String,Object>> 形式的数据。前面的页面也支持
${map.name}的形式的。


我觉的楼主想要的结果,这种方法能很好的实现, 为什么非要用javabean呢? 
12 楼 aaa5131421 2010-04-01  
你这种编码的随意性就太大了,开发前就不需要完整的实体模型设计,开发者想用什么字段整合成一个对象都可以,让后期其他人怎么去维护呢?
这样的情况好hibernate做的比较好,开发前有个固定的模型设计,你查出来的都是固定结构化了对象,更何况你要是在一对多的情况下你怎么生成一个bean呢?难道还要查出多个不同的对象出来?本来通过hibernate的关系就可以用。导航出来的东西,你会多出好多的代码
11 楼 mercyblitz 2010-04-01  
建议看看EL规范,我空间里面有。
10 楼 lzyzizi 2010-04-01  
asm,cglib实现的(动态操作字节码的库),他们可以动态生成class然后用classloader加载。这样你的内存中就有了一个Record类了。
9 楼 181054867 2010-04-01  
freej 写道
wgx19830922 写道
可以通过查询封装为List<Map<String,Object>> 形式的数据。前面的页面也支持
${map.name}的形式的。


同意,这样可以在复杂性和灵活性上作出很好的权衡。这种方式应该被提倡并推广。

同意,感谢各位的回贴,刚才测试了一下,发现这种方式最直观,最灵活,感谢wgx19830922,非常感谢!
8 楼 freej 2010-04-01  
wgx19830922 写道
可以通过查询封装为List<Map<String,Object>> 形式的数据。前面的页面也支持
${map.name}的形式的。


同意,这样可以在复杂性和灵活性上作出很好的权衡。这种方式应该被提倡并推广。
7 楼 snail_fish 2010-04-01  
封装一个动态JavaBean 不用每个都写
6 楼 wgx19830922 2010-04-01  
apache 有一个DynaBean来自Jakata的Common-beanUtil包,这个类就是动态的。或许能帮助你。
5 楼 181054867 2010-04-01  
hypercube1024 写道
hibernate 支持 select new
select new map( max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n )
from Cat cat

或者

select new Family(mother, mate, offspr)
from DomesticCat as mother
    join mother.mate as mate
    left join mother.kittens as offspr

或者

select new list(mother, offspr, mate.name)
from DomesticCat as mother
    inner join mother.mate as mate
    left outer join mother.kittens as offspr



搞错了,我不用Hibernate,但记得Hibernate有这样的功能而已
4 楼 181054867 2010-04-01  
wgx19830922 写道
可以通过查询封装为List<Map<String,Object>> 形式的数据。前面的页面也支持
${map.name}的形式的。

嗯,这个是一个方法,谢谢,但我还是想知道有没有办法能实现我原来说的效果

相关推荐

    SqlToJavaBean_javabean_根据表结构生成javabean_生成javabean_

    例如,如果数据库中有一个名为"users"的表,包含"id"(int类型)、"username"(varchar类型)和"email"(varchar类型)三个字段,那么生成的JavaBean可能如下: ```java public class User { private int id; ...

    根据javabean动态获取字段以及中文名称

    javabean中有100个属性字段,想要在前端页面获取这100个字段和字段对应的中文名称,如用户名称(username),密码(password),可以动态的获取到中文名称和属性字段,并返回前端页面,本例只实现动态解析功能

    根据数据库表字段自动生成javaBean工具(支持Mysql,Oracle)

    工具能智能开启驼峰命名,将数据库中的字段名转换为JavaBean的属性名,例如将`table_name`转换为`tableName`。 3. **操作简单**: - 工具设计的目标是简化工作流程,通常只需几步就能完成JavaBean的生成。开发者...

    Sqlbean是一款通过Java语法生成SQL语句的ORM插件

    Sqlbean是一款通过Java语法生成SQL语句的ORM插件,其理念是弱化在开发阶段对数据库的操作,无需先建表再开发,可直接编写实体类和业务代码,项目启动后自动创建表和维护表结构。内置大量常用方法,支持灵活的条件...

    解析sql文件并且生成Javabean的工具类

    SQL文件通常包含数据库的创建语句、插入语句等,而JavaBean是Java编程中用于数据封装的一种规范,它代表了业务逻辑中的一个实体对象。 【描述】"本人编译原理的作业,完成基本全部使用正则表达式,使用意义不大,...

    Java反射 JavaBean对象自动生成插入,更新,删除,查询sql语句操作.docx

    在这个示例代码中,提供了一个BeanUtil类,该类提供了多个静态方法,用于生成sql语句。这些方法包括getBeanName、getBeanPropertyList、getBeanFilesList等。这些方法使用了Java反射机制来获取JavaBean对象的信息,...

    根据表结构自动生成JavaBean,史上最强最专业的表结构转JavaBean的工具(第11版)

    于是一怒之下,自己动手丰衣足食,就自己用Swing写了一个通过数据库的表生成JavaBean的工具,支持MySQL、Oracle、SQLServce、PostgreSQL,完美支持JPA注解,可以同时生成Entity和DTO,可以自动去除表前缀,并支持...

    根据表结构自动生成JavaBean,史上最强最专业的表结构转JavaBean的工具(第10版)

    于是一怒之下,自己动手丰衣足食,就自己用Swing写了一个通过数据库的表生成JavaBean的工具,支持MySQL、Oracle、SQLServce、PostgreSQL,完美支持JPA注解,可以同时生成Entity和DTO,可以自动去除表前缀,并支持...

    根据sqlserver数据字段一键生成所有表格字段的java工具

    网上收了一下,没有找到太适合的javabean生成工具...我这个是用的sqlserver数据库,大家如果用其他数据库的话,可以收缩其他数据库获取表格和字段,类型的sql将里面的相应的sql替换掉就可以了。希望能给大家带来帮助。

    根据表结构自动生成JavaBean,史上最强最专业的表结构转JavaBean的工具(第12版)

    于是一怒之下,自己动手丰衣足食,就自己用Swing写了一个通过数据库的表生成JavaBean的工具,支持MySQL、Oracle、SQLServce、PostgreSQL,完美支持JPA注解,可以同时生成Entity和DTO,可以自动去除表前缀,并支持...

    数据库表生成javabean工具及源代码(修正版)

    总的来说,"数据库表生成javabean工具及源代码(修正版)"是Java开发中的一个实用工具,它简化了数据模型到代码的转换过程,尤其适用于数据库驱动的应用开发。合理利用这类工具,可以优化开发流程,让开发团队更加...

    mysql,sqlserver,Oracle 数据库生成javabean小工具

    生成javabean的过程主要是将数据库中的表映射为Java类,每个表对应一个Java类,表的字段转化为类的属性,而表的主键则通常对应类的构造函数和getter/setter方法。这样做的好处在于可以快速地将数据库模型转化为业务...

    根据json串自动生成JAVA BEAN工具

    JavaBean是Java编程中的一种设计模式,它代表一个对象,通常包含公共属性和方法,便于数据的封装和操作。在处理大量JSON数据时,手动创建对应的JavaBean类会非常耗时,因此出现了“根据json串自动生成JAVA BEAN工具...

    mybatis逆向生成javaBean

    JavaBean类包含了表中的字段和getter/setter方法,Mapper接口定义了SQL操作,XML文件则包含了具体的SQL语句。 4. **集成到项目**:将生成的文件导入到项目中,配置MyBatis的SqlSessionFactory,并在需要的地方使用...

    javabean的自动生成

    - **第二步**:右键选择表,然后在弹出菜单中选择“Generate Java Beans”,这会打开一个配置窗口,允许你设置生成的JavaBean的相关选项,如包名、类名、生成的字段类型等。 - **第三步**:确认配置后,MyEclipse...

    根据数据库表结构生成javabean的eclipse插件(免费)

    生成Java Bean的过程通常包括为每个数据库表创建一个对应的Java类,并在类中定义对应字段的属性、getter和setter方法。 描述中提到,这个插件支持“oracle”和“mysql”两种数据库。Oracle是全球知名的关系型数据库...

    bean对象生成数据表

    对于每个Bean类,生成一个`CREATE TABLE`语句,包含所有属性对应的列定义。 4. **执行SQL**:在数据库中执行生成的SQL语句,创建实际的数据库表。 5. **验证与调整**:检查生成的表结构是否满足需求,如有必要,...

    读取.sql文件,转化为javabean保存为.java文件

    在这个例子中,我们有一个名为User的表,包含id、name和email三个字段。id是主键,name和email是字符串类型,email还有唯一性约束。 接下来,我们要将这些信息转化成Java Bean。Java Bean是一种遵循特定规范的Java...

    javabean 自动生成工具(64位版)

    4. **高效且灵活**:工具可能包含各种自定义选项,如字段命名规则、是否生成getter/setter方法、是否生成构造函数等,使得生成的JavaBean类可以根据项目需求进行定制,保持代码风格的一致性。 5. **易用性**:...

    自动生成JAVABEAN工具

    JavaBean是一种特殊的Java类,主要用于封装数据和提供公共方法,它是Java编程中的一个重要概念,尤其在MVC(Model-View-Controller)架构中扮演数据载体的角色。标题提到的“自动生成JAVABEAN工具”是为了帮助开发者...

Global site tag (gtag.js) - Google Analytics