`
yhq1212
  • 浏览: 82036 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

java反射动态生成查询,插入,修改

    博客分类:
  • java
 
阅读更多

核心.
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;

import com.framework.dao.SqlDao;
import com.framework.logic.procurement.mapping.DynaTable;
import com.framework.util.BeanUtil;
import com.framework.util.StringUtil;

public class DynaTableUtil {
    public SqlDao sqlDao;
    public static DynaTableUtil tableUtil = null;

    public static DynaTableUtil getInstance() {// lazy initialization
        if (tableUtil == null) {
            tableUtil = new DynaTableUtil();
        }
        return tableUtil;
    }

    public Object getDynaTableRecord(DynaTable table) throws Exception {
        if (!table.getQueryForeignkey()) {// 查询主键
            // 获取MAP ,将MAP转为实体对象
            Map map = null;
            map = (Map) sqlDao.getRecord("procurement.getDynamicTableByKey", table);
            if (map != null) {
                Object ob = createBean(table.getTableBeanClass(), map);
                return ob;
            } else {
                return map;
            }
        } else {// 查询表外键,
            List listMap = new ArrayList();
            List list = sqlDao.getRecordList("procurement.getDynamicTableByForeginKey", table);
            // 转换为javaBean
            for (Object ob : list) {
                Object temp = createBean(table.getTableBeanClass(), (Map) (ob));
                listMap.add(ob);
            }
            return listMap;
        }

    }

    public void insertRecord(DynaTable table) throws Exception {
        // 创建INSERT_SQL
        table.setSql(this.createInsertSql(table));
        System.out.println(table.getSql());
        sqlDao.insertRecord("procurement.insertDynamicTable", table);
    }

    public String createInsertSql(DynaTable table) throws InstantiationException, IllegalAccessException {
        StringBuffer sb = new StringBuffer();
        sb.append("insert into  " + table.getTableName() + "   ");
        // 获取对象,判断属性值是否为NULL
        Object objInstance = table.getTableBean();
        BeanWrapper beanWrapper = new BeanWrapperImpl(objInstance);
        String name;
        String type;
        Object value;
        StringBuffer columnName = new StringBuffer();
        StringBuffer columnValue = new StringBuffer();
        // 循环属性说明
        for (PropertyDescriptor descriptor : beanWrapper.getPropertyDescriptors()) {
            name = descriptor.getName();
            type = descriptor.getPropertyType().getName();
            if (!beanWrapper.isWritableProperty(name))
                continue;
            columnName.append(name + ",");
            try {
                Object tempValue = descriptor.getReadMethod().invoke(objInstance, null);
                tempValue = BeanUtil.convertType(type, String.valueOf(tempValue));
                if (tempValue != "null" && tempValue != null) {

                    tempValue = "'" + tempValue + "'";
                }
                // 判断是否为主键
                if (name.toUpperCase().equals(table.getTableKey().toUpperCase())) {
                    // 生成主键VALUE
                    // 保存至于table_key_value
                    table.setKeyValue(StringUtil.getPrimaryKey());
                    tempValue = "'" + table.getKeyValue() + "'";
                }

                columnValue.append(tempValue + ",");
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }

        }
        sb.append("(" + columnName.substring(0, columnName.length() - 1) + ")");
        sb.append("values(" + columnValue.substring(0, columnValue.length() - 1) + ")");
        return sb.toString();
    }

    public static Object createBean(Class beanClass, Map map) throws InstantiationException, IllegalAccessException {
        Object objInstance = beanClass.newInstance();
        BeanWrapper beanWrapper = new BeanWrapperImpl(objInstance);
        String name;
        String type;
        Object value;
        // 循环属性说明
        for (PropertyDescriptor descriptor : beanWrapper.getPropertyDescriptors()) {
            name = descriptor.getName();
            type = descriptor.getPropertyType().getName();
            if (!beanWrapper.isWritableProperty(name))
                continue;
            value = BeanUtil.convertType(type, String.valueOf(map.get(name)));// 从MAP中查询参数,并转换为相应的类型
            if (value == null || value == "null")
                continue;
            beanWrapper.setPropertyValue(name, value);
        }
        return objInstance;
    }

}

 

 

 

 

//动态TABLE需要的参数
public class DynaTable {
    private Class tableBeanClass;// bean Class对象
    private String tableName;// biaoming
    private String tableKey;// 主键
    private String keyValue;// VALUE
    private String javaBennQualified;// 限定名,存JAVABEAN包下面
    private String sql;
    private Object tableBean;// bean对象
    private String foreignkey, foreignkeyValue;// 设置外键,以及外键的值
    private Boolean queryForeignkey =false;// 是否查询外键,注,设置为FALSE后,查询返回值为BEAN_LIST,否则为JAVABEAN

    public String getForeignkey() {
        return foreignkey;
    }

    public void setForeignkey(String foreignkey) {
        this.foreignkey = foreignkey;
    }

    public String getForeignkeyValue() {
        return foreignkeyValue;
    }

    public void setForeignkeyValue(String foreignkeyValue) {
        this.foreignkeyValue = foreignkeyValue;
    }

    public Boolean getQueryForeignkey() {
        return queryForeignkey;
    }

    public void setQueryForeignkey(Boolean queryForeignkey) {
        this.queryForeignkey = queryForeignkey;
    }

    public Object getTableBean() {
        return tableBean;
    }

    public void setTableBean(Object tableBean) {
        this.tableBean = tableBean;
    }

    public void setTableBeanClass(Class tableBeanClass) {
        this.tableBeanClass = tableBeanClass;
    }

    public String getSql() {
        return sql;
    }

    public void setSql(String sql) {
        this.sql = sql;
    }

    public String getJavaBennQualified() {
        return javaBennQualified;
    }

    public void setJavaBennQualified(String javaBennQualified) {
        this.javaBennQualified = javaBennQualified;
        try {
            this.tableBeanClass = Class.forName(javaBennQualified);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public String getTableName() {
        return tableName;
    }

    public Class getTableBeanClass() {
        return tableBeanClass;
    }

    public void setTableName(String tableName) {
        this.tableName = tableName;

    }

    public String getTableKey() {
        return tableKey;
    }

    public void setTableKey(String tableKey) {

        this.tableKey = tableKey;
    }

    public String getKeyValue() {
        return keyValue;
    }

    public void setKeyValue(String keyValue) {
        this.keyValue = keyValue;
    }

}

 

 

//添加

//处理方法,要处理的TABLE

public Map<String, DynaTable> getTableNameMap() {
        this.tableNameMap = new HashMap<String, DynaTable>();

        // 初始化要查询对象
        DynaTable a = new DynaTable();
        // 设置返回的实例对象
        a.setJavaBennQualified("com.framework.logic.procurement.mapping.Procurement");
        // 查询的表
        a.setTableName("Procurement");
        a.setTableKey("Procurementid");// 主键
        a.setKeyValue(request.getParameter("procurementid"));
        this.tableNameMap.put("Procurement", a);

}

 

//保存


         public void procurementSave() throws Exception {
        this.model = new HashMap();
        this.viewName = "message.jsp";
        String message = "";
        String beanName = request.getParameter("beanName");
        try {
            // 获取TABLE对象
            DynaTable table = this.tableNameMap.get(beanName);
            // 基本参数
            table.setTableBean((BeanUtil.createBean(table.getTableBeanClass(), request)));
            // FILE文件设置值
            // 插入数据库
            DynaTableUtil.getInstance().insertRecord(table);
            System.out.println(table.getKeyValue());
            message="保存成功!<a href='procurementList.procurement' >返回</a>";
        } catch (Exception e) {
            e.printStackTrace();
            message = "获取页面参数出现异常,异常原因为:" + e.getMessage();
        }
        this.model.put("message", message);
        System.out.println(message);
        this.modelAndView = new ModelAndView(this.viewName, this.model);
    }

//查看

    public void procurementMod() throws Exception {
        this.model = new HashMap();
        this.viewName = "procurement/procurementMod.jsp";
        // 查询
        DynaTableUtil tableUtil = DynaTableUtil.getInstance();
        tableUtil.sqlDao = sqlDao;
        getTableNameMap();
        Iterator it = this.tableNameMap.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry entry = (Entry) it.next();
            DynaTable dt = (DynaTable) entry.getValue();
            Object ob = tableUtil.getDynaTableRecord(dt);
            this.model.put(dt.getTableName().toLowerCase(), ob);

        }
        this.modelAndView = new ModelAndView(this.viewName, this.model);
    }

 

 

sqlmap


  <insert id="insertDynamicTable" parameterClass="com.framework.logic.procurement.mapping.DynaTable" >   
    <![CDATA[
        $sql$
    ]]>
  </insert>   
 
 
 <!-- 此处增加remapResults="true"指每次查询都更新列名 -->
 <select  id="getDynamicTableByKey"  parameterClass="com.framework.logic.procurement.mapping.DynaTable" resultClass="java.util.HashMap" remapResults="true">   
     <![CDATA[
          select * from   $tableName$ where  $tableKey$ =#keyValue#  limit 1
     ]]>
 </select>
 
 
 
 <!-- 此处增加remapResults="true"指每次查询都更新列名 -->
 <select  id="getDynamicTableByForeginKey"  parameterClass="com.framework.logic.procurement.mapping.DynaTable" resultClass="java.util.HashMap" remapResults="true">
     <![CDATA[
          select * from   $tableName$ where  $foreignkey$ =#foreignkeyValue# 
     ]]>
 </select>

 

分享到:
评论

相关推荐

    Java反射 JavaBean对象自动生成插入,更新,删除,查询sql语句操作.docx

    "Java反射 JavaBean 对象自动生成插入、更新、删除、查询sql语句操作" Java反射JavaBean对象自动生成插入、更新、删除、查询sql语句操作是指通过Java反射机制,依据提供的表名、POJO类型、数据对象自动生成sql语句...

    Java反射 JavaBean对象自动生成插入,更新,删除,查询sql语句操作

    Java反射 JavaBean 对象自动生成插入、更新、删除、查询 SQL 语句操作 Java 反射是 Java 语言中一个强大的功能,它允许开发者在运行时检查和修改类、方法、字段的行为。Java 反射机制可以动态地创建对象、调用方法...

    JAVA项目代码绘制PDF和通过freemarker动态生成PDF

    # 本项目主要介绍 1. itextpdf(CreatePdf) 不太推荐需要在代码内部编写PDF格式,如果要使用,建议写个基类,将同一版本 或者同一类型的公共方法写入,差异化的抽象,一个模板一个子类...复杂word动态生成上功能很强大

    Java反射泛型,实现数据库的动态增删改查等功能

    首先,Java反射机制允许我们在运行时检查类、接口、字段和方法的信息,甚至可以动态调用方法和修改字段值。在数据库操作中,反射可以帮助我们根据字符串形式的SQL语句来动态执行相应的方法,无需预先编写大量硬编码...

    cglib动态生成java类

    1. **性能优势**:相比于使用Java反射机制,CGLib生成的代理对象在性能上更优,因为它避免了反射带来的开销。 2. **无需接口**:CGLib可以对没有实现接口的类进行代理,这是Java动态代理(JDK Proxy)无法做到的。 3...

    java代码自动生成.txt数据文件

    类似的,MyBatis的Mapper框架也允许开发者自定义XML或注解来生成SQL查询和对应的Java方法。 4. **注解处理器**: Java的注解处理器(Annotation Processor)可以在编译时读取自定义注解并生成源代码。比如,...

    JAVA反射与代理

    动态修改查询属性值是反射的另一个关键应用。我们可以使用`getDeclaredField()`或`getField()`方法获取类的字段,然后调用`setAccessible(true)`允许访问私有字段,最后通过`set()`方法设置字段的值。同样,`get()`...

    android 使用反射机制操作数据库 插入 查询

    本文将深入探讨如何使用反射机制来操作SQLite数据库,包括插入数据和查询数据,以实现更加灵活和高效的数据库操作。 首先,我们要了解反射的概念。在Java中,反射是一种强大的工具,它允许我们在运行时检查类、接口...

    Java开发的sql生成器

    5. **代码生成集成**:与IDE(集成开发环境)集成,可以在编写Java代码时无缝插入生成的SQL,简化开发流程。 6. **性能优化**:分析查询性能,提供优化建议,如添加索引、避免全表扫描等。 7. **安全防护**:防止...

    动态代码生成器动态代码生成器动态代码生成器

    动态代码生成常用于实现AOP框架,如Spring AOP,它能在运行时插入切面逻辑。 6. **性能优化**:在某些情况下,动态代码生成能用于提高程序性能。例如,JIT(Just-In-Time)编译器会分析运行时的热点代码,并将其...

    Java直接通过连接数据库生成对应的Resful格式的API

    这个库可能使用了反射、注解或其他高级技术来动态生成API接口和实现。 总之,这个项目利用Java的灵活性和强大的库生态系统,实现了从数据库到RESTful API的快速映射,大大提升了开发效率,尤其适合那些需要快速搭建...

    仿hibernate动态生成sql保存对象

    总的来说,仿照Hibernate动态生成SQL保存对象是一个涉及反射、注解解析、SQL构造等多个技术领域的综合实践。通过这样的方式,你可以创建一个更加灵活且适应性强的ORM框架,满足特定项目的需求。然而,需要注意的是,...

    动态生成javabean

    2. **使用Java反射API**:Java反射API允许我们在运行时动态地获取类的信息并操作类的对象。我们可以根据需求构建一个基础的JavaBean类,然后通过反射动态地添加属性并生成getter和setter方法。 3. **使用ASM、Byte...

    反射查询SQL框架

    这种技术极大地提高了代码的灵活性和可维护性,尤其是在处理动态查询或复杂业务逻辑时。 首先,我们来看"反射"的概念。反射是Java、Python、C#等面向对象编程语言中的一个特性,它允许程序在运行时检查自身的结构,...

    java反射机制 读者基础:具备Java 语言基础

    Java反射机制是Java语言的一个重要特性,它使得Java在运行时具有了动态性,能够获取和操作类的信息,包括类的修饰符、超类、实现的接口、字段和方法等。这种机制允许程序在运行时动态加载未知名称的类,进行字段的...

    java语言反射与动态代理学习笔记2(动态代理部分)

    在Java编程中,反射和动态代理是两个非常重要的高级特性,它们为程序提供了更大的灵活性和扩展性。这篇学习笔记主要关注动态代理部分,虽然没有提供具体的压缩包文件内容,但根据标题和描述,我们可以深入探讨这两个...

    动态生成XML文件

    这个过程展示了如何使用Java结合反射来动态构建XML,适用于数据库查询结果转换为XML格式的场景。需要注意的是,这种方式在处理大量数据时可能效率较低,因为它涉及到多次字符串连接操作,可能会造成内存开销。在生产...

    java cglib和反射demo

    Java中的CGLib与反射是两种常用的动态代理技术,它们在实现面向切面编程(AOP)时发挥着重要作用。本文将深入探讨这两种技术,并通过一个简单的AOP demo来阐述它们的使用方法。 首先,让我们了解什么是CGLib。CGLib...

    一种面向对象的Java Bean查询方法的实现

    2. **反射机制的应用**:利用Java反射API获取Java Bean的所有字段及其值,动态生成SQL语句。 3. **查询条件封装**:通过`ConditionHolder`类封装查询条件,便于传递和管理。 4. **查询结果的处理**:查询方法返回的...

Global site tag (gtag.js) - Google Analytics