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;
   }

时间: 2024-10-23 23:20:58

java利用映射表名称反射创建实体类并赋属性值的相关文章

Java反射获取实体的所有可见属性值,返回Object数组

获取实体的所有可见属性值 以下代码提供了两种实现,一种是基于List,一种是基于Map; 基于List的实现更节省内存,更高效一些:如果你有其它特殊的需求,可以根据实际参考以下代码进行扩展,或许有需要用到Map的情况呢! 当然,使用BeanUtils.describe或PropertyUtils.describe一两句代码就搞定了,但还需要额外添加包引用:另外效率方面是不是更高呢?我没有做过测试. /** * 获取实体的所有可见属性值 * @param object 实体类的实例 * @retu

idea中如何快速创建实体类

在idea中创建实体类可以不从src下直接创建,而是直接从db中直接生成实体类. 真实开发中创建多个实体类,就不用一个个的去创建了,直接导入自动生成,多说无益,直接上图 1.选中右侧Datebase选项 2.选中加号 点击Data Source   选择你使用的数据库 3.输入你要导入实体类的数据库名称以及用户名和密码,点击MySQL 4.选择Download ver.5.1.40 开始下载 5.加载成功后,会出现你选择数据库中的所有表 6.选择需要导入的实体类 7.选择导入到项目中的位置 8.

使用MyBatis的Generator自动创建实体类和dao的接口与xml

在实际的项目中其实建立数据库和设计数据库的时候特别重要,而等数据库设计完成之后,根据数据库创建实体类的工作就特别麻烦和繁琐了,不仅很麻烦,而且很浪费时间,不做又不行,这次就找到了一个简单的方法可以让myBatis帮你完成这件事情. 首先你需要一个Generator的myeclipes的插件,这个插件能在网上找到,安装方法也很简单就多说了. 下载了这个插件之后,新建一个xml,这个配置文件,就是对你所需要的实体类dao和xml进行合理的配置,看看你需要那些,不需要那些. 这里的配置我参考了网上给出

mybatis根据数据库表结构自动生成实体类,dao,mapper

首先, pom需要引入 <!-- mysql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.39</version> </dependency> <!-- mybatis--> <dependency> <group

通过反射获取某个对象下的属性值,或通过父类获取

import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.*; /** * 通过反射获取某个对象下的属性值,或通过父类获取 * User: wangyongfei * Date

java反射对实体类取值和赋值

项目中需要过滤前面表单页面中传过来的实体类的中的String类型变量的前后空格过滤,由于前几天看过一个其他技术博客的的java反射讲解,非常受益.于是,哈哈哈 public static <T> void modelTrim(T model){ Class<T> clazz = (Class<T>) model.getClass(); //获取所有的bean中所有的成员变量 Field[] fields = clazz.getDeclaredFields(); for(

使用PHP创建实体类的一个认识误区

最近看到学员在问这样的问题(转载) 1.php如何实现类似 java的set和get 2.PHP如何构建实体类 之前也有很多人问,那么这里来简单解答一下. 3句话: 1.关于java或者.net中使用实体类的作用.好处和有逼格支出大家请自行百度,不再赘述. 2.PHP如果业务不是十分复杂(譬如复杂到你根本记不清到底有多少个业务数据表),一般不需要建立实体类 3.不要在PHP上面研究什么泛型之流的东西.如果硬要这样,为何不直接使用java?  PHP就是为了快帅酷的做web,PHP要是哪天变的和j

Java 根据固定格式的Excel生成实体类

/** * Excel文档转对象 * * @author dxm * */ public class ExcelToObject { /** * 转换 * * @param file */ public static void convert(File file, String savePath, String pack) { // Excel是否存在 if (null == file || !file.exists()) { return; } // 创建存放路径目录 File save =

java使用反射比较两个bean对象属性值是否相等

import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import org.apache.log4j.Logger; public class DomainEquals { /** * 日志操作类 */ private static Logger logger = Logger.getLogger(DomainEquals.c