java利用映射表名称反射创建实体类并赋属性值

  1.hibernate中首先进行初始化,将对应的表名和类名以键值对的方式存放到map中

  private Map<String, String> mappings;//全局变量

  /**
  * 根据数据库表名获取实体类
  */
  public void initMappings() {
    if (mappings == null) {
    mappings = new HashMap<String, String>();
    SessionFactory factory = this.getSessionFactory();
    Map metaMap = factory.getAllClassMetadata();
    for (String key : (Set<String>) metaMap.keySet()) {
      AbstractEntityPersister classMetadata = (AbstractEntityPersister) metaMap.get(key);
      String tableName = classMetadata.getTableName().toLowerCase();
      int index = tableName.indexOf(".");
      if (index >= 0) {
        tableName = tableName.substring(index + 1);
      }
      String className = classMetadata.getEntityMetamodel().getName();
      mappings.put(tableName, className);
      }
    }
  }

  2.调用方法,传入表名得到对应的实体类名

  public String getEntityNameByTableName(String tableName) {
    initMappings();
    return mappings.get(tableName);
  }

  3.根据实体类名创建实体类

  /**
  *listobj:要赋的属性值集合,顺序要和实体类属性顺序一致

  */

  public Object getByReflect(String tableName, List listobj)throws Exception {

      Class<?> model = Class.forName(tableName);
      Object object = new Object();

      if (model != null) {
         Field[] field = model.getDeclaredFields();
         String[] modelName = new String[field.length];
         String[] modelType = new String[field.length];

         object = model.newInstance();
         Method m = null;

         for (int i = 1; i <field.length ; i++) {
            String name = field[i].getName();
            Object value = null;
            name = name.substring(0, 1).toUpperCase() + name.substring(1); 
            String type = field[i].getGenericType().toString(); 
               if (type.equals("class java.lang.String")) {
               m = model.getDeclaredMethod("set" + name, String.class);
     
               if(listobj.get(i - 1) instanceof Double){
                  Double d=(Double) listobj.get(i-1);
                  value=String.valueOf(d);
      
               }else{
                    value =(String)listobj.get(i - 1);
               }
            }
            if (type.equals("class java.lang.Integer")) {
               m = model.getDeclaredMethod("set" + name, Integer.class);
               Double d = (Double) listobj.get(i - 1);
               value = Integer.valueOf(d.intValue());
            }
            if (type.equals("class java.lang.Short")) {
               m = model.getDeclaredMethod("set" + name, Short.class);
               value = (Short) listobj.get(i - 1);
            }
            if (type.equals("class java.lang.Float")) {
               m = model.getDeclaredMethod("set" + name, Float.class);
               value = (Float) listobj.get(i - 1);
            }
            if (type.equals("class java.lang.Double")) {
               m = model.getDeclaredMethod("set" + name, Double.class);
               value = (Double) listobj.get(i - 1);
            }
            if (type.equals("class java.lang.Boolean")) {
               m = model.getDeclaredMethod("set" + name, Boolean.class);
               value = (Boolean) listobj.get(i - 1);
            }
              if (m != null) {
               m.invoke(object, value);
          }
       }

     }
     return object;
   }

原文地址:https://www.cnblogs.com/xiaofengyuan/p/5756288.html