我从数据库查询出任意的字段,根据字段在数据库里的类型,自动转换为相应的Java类型,能否实现?

解决方案 »

  1.   

    用res的getObject,再判断它是什么类型的数据再做相应的操作。
    这要自己实现的。
      

  2.   

    其实Hibernate也是通过配置文件才知道要转换成什么类型的,所以说你要事先定义他.要不你就都返回Ojbect,如resultSet.getObject(1); 或都返回String,如:
    String.valueOf(resultSet.getObject(i));这样都以字符串返回,这样java.sql.Date的返回类型也没有问题,会把Date转换成如2008-05-23的字符串
      

  3.   

    还要说明一点:就是用String.valueOf(resultSet.getObject(i));比用resultSet.getObject(i).toString();要好,不会出现空指针,(resultSet类型为java.sql.ResultSet)
      

  4.   


    如果你只是想从“字段(Field)”到“变量(Variable)”做转换,很简单,因为通过 JDBC 可以获得结果集的 Metadata,然后再 switch...case... 就好了。如果你想从“记录(Record)”到“对象(Value Object)”做转换,就比较麻烦,你总得事先定义一个 class 作为 Value Object 吧?不过,也有办法,听说 CGLIB 之类可以动态生成 class,这个就比较深了,我还没研究过,hehe……
      

  5.   

    其实Hibernate也是通过配置文件才知道要转换成什么类型的,所以说你要事先定义他.要不你就都返回Ojbect,如resultSet.getObject(1); 或都返回String,如: 
    String.valueOf(resultSet.getObject(i));这样都以字符串返回,这样java.sql.Date的返回类型也没有问题,会把Date转换成如2008-05-23的字符串
      

  6.   

    楼主可能要实现这样的功能Type obj = (Type)getObject();Type 是从数据库中取出来的字符串,是这样的吗?如果是这样的话,在目前所有已发行的 JDK 中做不到。cglib 也只能根据属性字符串表示的类型来生成普通的 JavaBean,好像也不能根据字符串来强转类型的。import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Set;import net.sf.cglib.beans.BeanGenerator;
    import net.sf.cglib.beans.BeanMap;public class CglibDynaBeanTest {    public static void main(String[] args) throws ClassNotFoundException {
            System.out.println("Generate JavaBean ...");
            Map properties = new HashMap();
            properties.put("id", Class.forName("java.lang.Integer"));
            properties.put("name", Class.forName("java.lang.String"));
            properties.put("address", Class.forName("java.lang.String"));        
            CglibDynaBean bean = new CglibDynaBean(properties);
            System.out.println("  OK!");
            
            System.out.println("Set values ...");
            bean.setValue("id", new Integer(123));
            bean.setValue("name", "454");
            bean.setValue("address", "789");
            System.out.println("  OK!");
            
            System.out.println("Get values");
            System.out.println("  >> id      = " + bean.getValue("id"));
            System.out.println("  >> name    = " + bean.getValue("name"));
            System.out.println("  >> address = " + bean.getValue("address"));        System.out.println("Class name");
            Class clazz = bean.getObject().getClass();
            System.out.println("  >> " + clazz.getName());
            
            System.out.println("Show all methods");        
            Method[] methods = clazz.getDeclaredMethods();
            for(int i = 0; i < methods.length; i++) {
                System.out.println("  >> " + methods[i].getName());
            }        System.out.println("Show all properties");
            Field[] fields = clazz.getDeclaredFields();
            for(int i = 0; i < fields.length; i++) {
                System.out.println("  >> " + fields[i].getName());
            }
        }
    }class CglibDynaBean {
        private Object object = null;
        private BeanMap beanMap = null;
        
        public CglibDynaBean(Map properties) {        
            this.object = generateObject(properties);
            this.beanMap = BeanMap.create(this.object);
        }    public Object getObject() {
            return this.object;
        }
        
        public Object getValue(String property) {
            return beanMap.get(property);
        }    public void setValue(String property, Object value) {
            beanMap.put(property, value);
        }
        
        private Object generateObject(Map properties) {
            BeanGenerator generator = new BeanGenerator();
            Set keySet = properties.keySet();
            for(Iterator i = keySet.iterator(); i.hasNext();) {
                String key = (String)i.next();
                generator.addProperty(key, (Class)properties.get(key));
            }
            return generator.create();
        }
    }这个会动态生成一个类,是一种很奇怪的类名,上面代码执行的结果如下:Generate JavaBean ...
      OK!
    Set values ...
      OK!
    Get values
      >> id      = 123
      >> name    = 454
      >> address = 789
    Class name
      >> net.sf.cglib.empty.Object$$BeanGeneratorByCGLIB$$b37f650b
    Show all methods
      >> setId
      >> getAddress
      >> getName
      >> getId
      >> setName
      >> setAddress
    Show all properties
      >> $cglib_prop_address
      >> $cglib_prop_name
      >> $cglib_prop_id
      

  7.   


    Object o = resultSet.getObject(1);
    String temp = String.valueOf(o);
    try {
    System.out.println("int:" + Integer.valueOf(temp));
    } catch (Exception e1) {
    try {
    System.out.println("float:" + Double.valueOf(temp));
    } catch (Exception e2) {
    System.out.println("String:" + temp);
    } }是这个意思吗?只判断力int和double其他的自己添加。
      

  8.   

    谢谢,终于知道了Java的局限性!