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

Posted 小晓峰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
   }

以上是关于java利用映射表名称反射创建实体类并赋属性值的主要内容,如果未能解决你的问题,请参考以下文章

Java自定义注解注解实现实体类与数据库表字段的映射

Java自定义注解注解实现实体类与数据库表字段的映射

java 实体类 注解 继承问题!

Java中有没有啥办法可以将两个类的属性值映射?

C#用反射实现两个类的对象之间相同属性的值的复制

java 怎么让map和实体一一映射