`
mickey_hou
  • 浏览: 247693 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JPA反射机制实现对象获取-1

JPA 
阅读更多
private static final Log log = LogFactory.getLog(JPASupport.class);
   
    private static final long serialVersionUID = 1L;
   
    /*
     * 用于存放POJO的列信息
     */
    private transient static Map<Class<? extends JPASupport>, List<String>> columnMap = new HashMap<Class<? extends JPASupport>, List<String>>();
   
    /**
     * 获取POJO对应的表名
     * 需要POJO中的属性定义  @Table(name)
     *
     * @return String
     */
    public String tableName()
    {
        log.debug("loading JAPSupport method tableName..");
       
        Table table = this.getClass().getAnnotation(Table.class);
       
        if (null != table)
        {
            return table.name();
        }
        else
        {
            throw new RuntimeException("undefine POJO @Table, need Tablename(@Table)..");
        }
    }
   
    /**
     * 获取POJO对应的主键名称
     * 需要POJO中的属性定义  @Id
     *
     * @return String
     */
    public String id()
    {
        log.debug("loading JAPSupport method id..");
        log.debug(this.getClass().getName());
       
        for (Field field : this.getClass().getDeclaredFields())
        {
            if (field.isAnnotationPresent(Id.class))
            {
                return field.getName();
            }
        }
       
        throw new RuntimeException("undefine POJO @Id..");
    }
   
    /**
     * 用于计算类定义
     * 需要POJO中的属性定义  @Column(name)
     */
    public void caculationColumnList()
    {
        if (columnMap.containsKey(this.getClass()))
        {
            return;
        }
       
        Field[] fields = this.getClass().getDeclaredFields();
        List<String> columnList = new ArrayList<String>(fields.length);
       
        for (Field field : fields)
        {
            if (field.isAnnotationPresent(Column.class))
            {
                columnList.add(field.getName());
            }
        }
       
        columnMap.put(this.getClass(), columnList);
    }
   
    /**
     * 获取用于WHERE的 有值字段表
     * @return List
     */
    public List<WhereColumn> returnWhereColumnsName()
    {
        Field[] fields = this.getClass().getDeclaredFields();
        List<WhereColumn> columnList = new ArrayList<WhereColumn>(fields.length);
       
        for (Field field : fields)
        {
            if (field.isAnnotationPresent(Column.class) && !isNull(field))
            {
                columnList.add(new WhereColumn(field.getName(),field.getGenericType().equals(String.class)));
            }
        }
       
        return columnList;
    }
   
    /**
     * Where条件信息
     */
    public class WhereColumn
    {
        public String name;
       
        public boolean isString;
       
        public WhereColumn(String name, boolean isString)
        {
            this.name = name;
            this.isString = isString;
        }
    }
   
    /**
     * 用于获取Insert的字段累加
     * @return String
     */
    public String returnInsertColumnsName()
    {
        StringBuilder sb = new StringBuilder();
       
        List<String> list = columnMap.get(this.getClass());
        int i = 0;
       
        for (String column : list)
        {
            if (isNull(column))
            {
                continue;
            }
           
            if (i++ != 0)
            {
                sb.append(',');
            }
           
            sb.append(column);
        }
       
        return sb.toString();
    }
分享到:
评论

相关推荐

    仿照jpa/Hibernate通过反射导入Excel

    在本场景中,“仿照jpa/Hibernate通过反射导入Excel”指的是利用反射机制来实现类似JPA或Hibernate的数据导入功能,将Excel文件中的数据转换为Java对象并存储到数据库中。 首先,我们需要理解JPA和Hibernate。JPA是...

    11_JPA详解_JPA中的一对多延迟加载与关系维护.zip

    然而,需要注意的是,由于Java的反射机制和代理对象的限制,延迟加载在某些情况下可能无法工作,比如在没有JPA上下文的情况下直接访问实体的关联属性。 **关系维护** JPA提供了两种方式来维护一对多关系:`...

    利用反射实现的持久层工具类(学习)

    本文将深入探讨如何利用反射机制来实现一个简单的持久层工具类,以供学习和参考。 反射是Java提供的一种强大的动态类型特性,它允许我们在运行时检查类的信息,包括类名、属性、方法等,并能够动态地创建对象和调用...

    JPA 和 注释文档

    - 通过反射机制,可以获取类、字段、方法等上的注释。例如,`getDeclaredAnnotations()` 返回所有声明的注释,包括从父类继承的;`getAnnotations()` 返回可见的注释,不包括继承的;`getAnnotation(注释名.class)`...

    java反射深入剖析(推荐)

    Java反射是Java语言提供的一种强大的机制,它允许我们在运行时检查和操作类、接口、字段和方法等。本文将深入剖析Java反射的概念及其在实际开发中的应用。 首先,我们需要了解,反射的核心在于`java.lang.Class`类...

    常见面试题200道题目

    7. **反射机制**: - 描述反射的基本概念,如何通过Class类获取对象信息。 - 使用反射动态调用方法和设置/获取属性值。 - 讨论反射在设计模式(如工厂模式)和动态代理中的应用。 8. **JavaEE技术**: - 介绍...

    java面试题

    - 如何通过Class对象获取类的信息,如构造器、方法和字段。 - 动态代理(Dynamic Proxy)的应用,如AOP(面向切面编程)。 6. **设计模式**: - 单例模式、工厂模式、建造者模式、观察者模式等常见设计模式的...

    JAVA面试题大全

    5. **反射机制** - 获取类信息:Class类的用法,如forName()方法。 - 创建对象:newInstance()方法和Constructor的使用。 - 访问成员:获取和修改字段、方法,调用构造器和方法。 6. **JVM** - 类加载机制:...

    Java 最常见的 200+ 面试题:面试必备(附详解答案).zip

    - Class类:如何通过Class对象获取类信息。 - 动态代理:了解JDK动态代理和CGLIB动态代理。 6. **设计模式**: - 单例模式:饿汉式、懒汉式、双重检查锁定和静态内部类实现。 - 工厂模式:简单工厂、工厂方法和...

    JAVA面试题最全集.files.rar

    8. **反射机制**: - Class类:获取类信息,动态创建对象。 - 构造器、方法、字段的反射调用。 9. **设计模式**: - 常见的23种设计模式,如单例、工厂、观察者、装饰者模式等。 10. **JVM**: - 类加载机制:...

    求职宝典-- - --面试大全

    - Class类:知道如何通过Class对象获取类的信息,动态创建对象。 - 构造函数、方法和字段的反射调用:理解如何在运行时动态访问和修改类的成员。 7. **JVM** - 类加载机制:了解类加载器的工作原理,双亲委派...

    java 编程帮手

    - 反射API允许程序在运行时动态地获取类的信息并操作对象。 - 注解(Annotation)提供了一种元数据机制,用于在代码中添加额外的信息,如Spring框架中的@Component。 10. **Java教程** - "The Java Tutorial"是...

    java面试——深圳-OPPO-Java高级.zip

    - 反射机制:动态获取类信息,创建对象,调用方法,修改属性,以及反射在设计模式中的应用。 - 注解:元数据的使用,自定义注解,以及使用反射读取注解信息。 6. **设计模式**: - 常见设计模式:单例、工厂、...

    2023最新 Java面试:1-100期Java面试题及答案整理合集

    4. **反射机制** - 如何通过反射获取类信息,创建对象,调用方法。 - 反射在动态代理、配置文件加载等场景的应用。 5. **泛型** - 泛型的基本使用,通配符,类型擦除等概念。 - 泛型在集合和自定义类中的应用。...

    java面试题库

    - 反射的基本用法,如Class类,Constructor、Method、Field对象的获取与使用。 - 注解的定义、使用,以及运行时注解的处理。 8. **网络编程** - TCP与UDP的区别,Socket编程的基本步骤。 - HTTP协议的基本概念...

    java面试相关题目

    7. **反射机制** - 反射的应用:动态获取类信息,创建对象,调用私有方法等。 - Class类:如何通过Class对象进行类的操作。 8. **设计模式** - 常见设计模式:单例模式、工厂模式、装饰器模式、观察者模式等。 ...

    java自学笔记

    - **反射**:理解反射机制,如何在运行时动态获取类信息并进行操作。 - **注解(Annotation)**:了解注解的基本用法,以及如何自定义注解。 4. Java API深入 - **IO/NIO**:深入学习Java的I/O系统,包括NIO(非...

    自用;自用;自用;自用;自用;自用;自用;自用;自用;自用;自用;

    - 在运行时获取类的信息,创建和调用对象的方法。 - 动态代理,实现运行时接口的动态实现。 11. **Java虚拟机(JVM)**: - JVM是Java程序的运行环境,负责解释执行字节码。 - 垃圾回收机制,自动管理内存。 -...

    java面试题.txt.rar

    8. **反射机制**: - Class类:动态获取类信息,创建对象,调用方法。 - 构造器、方法、字段的反射操作。 9. **设计模式**: - 常见的23种设计模式:单例、工厂、观察者、装饰者、适配器、代理等。 10. **JVM...

Global site tag (gtag.js) - Google Analytics