`

简单实现一种利用反射自动封装JavaBean的JDBC查询

    博客分类:
  • Java
 
阅读更多
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.ResultSetMetaData;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import javax.sql.rowset.CachedRowSet;

public class BeanUtil
{

    private static Logger LOG = Logger.getLogger(Logger.class.getName());

    /**
     * 通过Bean对象获取查询语句
     * 
     * @param obj 对象
     * @param tableName 表名
     * @return SQL
     */
    public static String getSQLOfSelect(Object obj, String tableName)
    {
        StringBuffer strBuffer = new StringBuffer("SELECT ");
        Class<? extends Object> objClass = obj.getClass();
        Field fields[] = objClass.getDeclaredFields();
        for (Field field : fields)
        {
            String methodName = field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1);
            try
            {
                if (null != objClass.getMethod("get" + methodName))
                {
                    strBuffer.append(field.getName() + ",");
                }
            }
            catch (SecurityException e)
            {
                e.printStackTrace();
            }
            catch (NoSuchMethodException e)
            {
                e.printStackTrace();
            }
        }
        strBuffer.delete(strBuffer.length() - 1, strBuffer.length());
        strBuffer.append(" FROM " + tableName);
        LOG.info(strBuffer.toString());
        return null;
    }

    /**
     * 通过bean对象获取插入时的SQL
     * 
     * @param obj java对象
     * @param tableName 表名
     * @return SQL
     */
    public static String getSQLOfInsert(Object obj, String tableName)
    {
        String strSQL = new String("INSERT INTO " + tableName + "(#COLS) VALUES (#VALS)");
        Class<? extends Object> objClass = obj.getClass();
        Field fields[] = objClass.getDeclaredFields();
        StringBuffer cols = new StringBuffer("");
        StringBuffer values = new StringBuffer("");

        for (Field field : fields)
        {
            String methodName = "get" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1);
            try
            {
                Method method = objClass.getMethod(methodName);
                Object o = method.invoke(obj);
                if (null != o)
                {
                    cols.append(field.getName() + ",");
                    if (o instanceof Integer || o instanceof Long || o instanceof Double)
                    {
                        values.append(o.toString() + ",");
                    }
                    else if (o instanceof String)
                    {
                        values.append("'" + o + "',");
                    }
                    else if (o instanceof java.util.Date)
                    {
                        String datestr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format((java.util.Date) o);
                        values.append("'" + datestr + "',");
                    }
                    else
                    {
                        values.append("'" + o.toString() + "',");
                    }
                }
            }
            catch (SecurityException e)
            {
                e.printStackTrace();
                continue;
            }
            catch (NoSuchMethodException e)
            {
                e.printStackTrace();
                continue;
            }
            catch (IllegalArgumentException e)
            {
                e.printStackTrace();
            }
            catch (IllegalAccessException e)
            {
                e.printStackTrace();
            }
            catch (InvocationTargetException e)
            {
                e.printStackTrace();
            }
        }
        if (cols.length() > 1 && values.length() > 1)
        {
            cols.delete(cols.length() - 1, cols.length());
            values.delete(values.length() - 1, values.length());
            strSQL = strSQL.replace("#COLS", cols).replace("#VALS", values);
        }
        else
        {
            LOG.warning("警告:空对象无法完成操作啊");
            return null;
        }
        LOG.info(strSQL);

        return strSQL;
    }

    /**
     * 通过缓存结果集构造对象列表
     * 
     * @param clazz javaBean类
     * @param crs 缓存结果集
     * @return 对象列表
     */
    public static List<Object> getBeanFormCacheRowSet(Class<?> clazz, CachedRowSet crs)
    {

        List<Object> result = new ArrayList<Object>();
        try
        {
            ResultSetMetaData md = crs.getMetaData();
            int columnCount = md.getColumnCount();
            Object o = null;
            while (crs.next())
            {
                o = clazz.newInstance();
                for (int i = 1; i <= columnCount; i++)
                {
                    if (crs.getObject(i) == null)
                    {
                        continue;
                    }
                    md.getColumnType(i);
                    String className = md.getColumnClassName(i);
                    if ("java.sql.Timestamp".equals(className) || "java.sql.Date".equals(className))
                    {
                        className = "java.util.Date";
                    }
                    else if ("java.sql.Time".equals(className))
                    {
                        className = "java.lang.String";
                    }
                    else if ("java.lang.Byte".equals(className) || "java.lang.Short".equals(className))
                    {
                        className = "java.lang.Integer";
                    }
                    String methodName = "set" + md.getColumnName(i).substring(0, 1).toUpperCase()
                                        + md.getColumnName(i).substring(1);
                    try
                    {
                        clazz.getMethod(methodName, Class.forName(className)).invoke(o, crs.getObject(i));
                    }
                    catch (NoSuchMethodException e)
                    {
                        LOG.warning("特殊类型字段导致表字段与JavaBean属性不对应!没有找到参数类型是[" + className + "]的SETER方法:" + methodName);
                        continue;
                    }
                    // System.out.println("className : " + className +" \tmethodName : " + methodName);
                }
                result.add(o);
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return result;
    }
}

 

分享到:
评论

相关推荐

    map与Javabean相互转换实例

    `JavaBean`是一种符合特定规范的类,通常用来封装数据,而`Map`则是一种键值对的集合,两者在实际应用中有各自的适用范围。本文将深入探讨如何通过反射机制实现`Map`和`JavaBean`的相互转换。 首先,我们要理解`...

    SqlToJavaBean_javabean_根据表结构生成javabean_生成javabean_

    在Java开发中,JavaBean是一种遵循特定规范的Java类,通常用于封装数据并提供相应的getter和setter方法。在数据库操作中,将SQL查询结果映射到Java对象是常见的需求,这时JavaBean的作用就显现出来了。...

    jsp+javabean+access管理系统系统

    【jsp+javabean+access管理系统】是一种基于Web的简易信息管理系统实现,它结合了JavaServer Pages(JSP)、JavaBeans以及Microsoft Access数据库技术。这个系统设计的目标是为用户提供一个直观、易用的界面,通过...

    JAVA 版本ResultSet 转换为JAVABEAN的工具类

    而JavaBean是一种符合特定规范的Java类,通常用于封装数据,便于数据的传输和操作。当我们从数据库查询数据后,有时需要将ResultSet中的数据转化为JavaBean对象,以便在业务逻辑中更方便地使用。本文将详细介绍如何...

    [其他类别]jsp+servlet+javaBean实现MVC_jspmvc.zip

    MVC模式是一种流行的设计模式,它的主要目标是将应用的业务逻辑、用户界面和数据存储分离开来,提高代码的可维护性和可扩展性。通过这种方式,开发者可以独立地修改各个部分,而不会影响到整个系统的稳定性。 ...

    学生信息管理系统(jsp..servlet...javabean)

    再者,JavaBean是Java中的一种可重用组件,通常用来封装数据和业务逻辑。在本系统中,可以创建一个名为"Student"的JavaBean类,包含学生的基本属性(如姓名、学号、班级等)以及相应的getter和setter方法。JavaBean...

    jsp+servlet+javabean实现网上商城项目完整源码

    JavaBean是一种符合特定规范的Java类,通常用于封装数据和业务逻辑。在本项目中,JavaBean可以作为数据模型,存储商品信息、用户信息等数据,也可以包含一些简单的业务方法。它们可以被JSP和Servlet通过Java反射...

    基于Jsp+Servlet+JavaBean的会议管理系统.zip

    JSP是Java的一种视图技术,它允许开发者在HTML或XML文档中嵌入Java代码,用来动态生成网页内容。JSP页面会被服务器转换成Servlet执行,因此它结合了HTML的易读性和Java的可编程性。在会议管理系统中,JSP通常用于...

    DBUniversalOperation.zip

    本篇文章将详细讲解如何利用Java的反射机制封装一个名为DBUtil的工具类,以实现对MySQL数据库的万能增删改查功能。 首先,我们来看“反射”这一概念。反射是Java语言的一个强大特性,它允许运行中的Java程序对自身...

    笔试Java3.doc

    22. JavaBean:JavaBean 是 Java 中的一种组件模型,用于封装数据和行为。 23. 图形元件:图形元件是指在图形系统中的基本组成部分,如 Point、Line、Rectangle、Triangle 等。 事务控制和事件委托机制 24. 事务...

    C++面试集锦,全面

    数据库触发器是一种存储在数据库中的特殊类型的过程,当对特定表的数据进行修改(如INSERT、UPDATE、DELETE)时自动执行。触发器可以用于实施复杂的业务逻辑、数据完整性检查或审计记录。触发器的定义通常包含触发...

    JSP版学生宿舍管理系统

    JavaBean是一种遵循特定规范的Java类,通常用于封装数据和业务逻辑。在本系统中,JavaBean扮演了模型角色,负责存储和管理数据。它们可以被JSP页面通过Java的反射机制实例化和调用方法,实现了前后端的数据交换。 ...

    SORM框架(手写版)

    SORM框架旨在提供一种简单而高效的方式来实现对象与SQL之间的自动映射。相较于流行的ORM框架如Hibernate,SORM框架力求简化设计,去掉了一些复杂的特性,专注于核心功能。通过这种方式,开发者能够更加容易地上手并...

    jsp5课件

    JavaBean符合一定的规范,通常是封装好的Java类,具有属性、方法和事件,可以被JSP或其他Java应用通过反射机制来调用和操作。 在JSP中,JavaBean可以作为数据模型,存储和处理业务数据。它们可以被嵌入到JSP页面中...

    Java基础学习43.pdf

    BeanUtils是Apache Commons BeanUtils库的一部分,它提供了一种简单的方式来操作JavaBean的属性,如`BeanUtils.populate(obj, args)`,可以将属性值批量设置到对象中。 数据库的元数据(Metadata)在Java中可以通过...

    J2EE 学习笔记 包含J2EE的所有内容

    JavaBean是一种遵循特定编程约定的Java类,通常用于封装数据或者业务逻辑。它们可以通过getter和setter方法来访问私有成员变量,并且可以通过构造函数和其他公共方法来控制其行为。JavaBean常被用作组件模型中的数据...

    java程序员面试(这几天面试题)

    1. **Java**: Java是一种面向对象的编程语言,其特性包括跨平台(通过Java虚拟机JVM实现)、垃圾回收、自动内存管理以及丰富的类库。Java分为三个版本:J2ME(Java Micro Edition)用于嵌入式设备,J2SE(Java ...

    SSH项目1

    Struts框架是MVC模式的一种实现,主要负责处理请求和控制流程。在描述中提到了以下几点: 1. `params`拦截器:用于将请求参数封装到Action对象中。 2. 类型转换:自动将请求参数转换为Action对象的属性类型。 3. ...

    计算机毕业实习报告.pdf

    JSP则是一种用于创建动态网页的服务器端脚本语言,它可以嵌入Java代码,将业务逻辑与表现层分离。 5. **项目开发**:实习生参与开发了一个个人日记网站,涉及用户登录注册、日志撰写和发布等功能。项目中使用了...

    struts,spring,hibernate面试题

    Struts提供了一种结构化的方式来组织JSP、Servlet和JavaBean,使代码更清晰,易于维护,促进了MVC设计模式的实施。 **Struts的验证框架** Struts的validate()方法在ActionForm中定义,用于验证用户输入。若验证失败...

Global site tag (gtag.js) - Google Analytics