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

1. java 反射机制构建JDBC查询方法

阅读更多
利用Class.formName("")去获取Class对象、在通过Class对象提供的静态方法、获取类或接口的字段、方法、构造这些成员。

了解了反射的一些基础、个人觉得学习编程应该充分的动起手来。在使用过Hibernate的查询过后、突然觉得普通的JDBC查询对查询结果的封装很是麻烦!

于是仿造它、构建一个简单的JDBC查询。

数据库连接类:


/**
* 数据连接类
* @author star
*
*/ 
public class UtilDao { 
    static Properties properties = null; 
    public UtilDao(){ 
        //读取属性文件 
        properties = new Properties(); 
        java.io.InputStream in = (java.io.InputStream) this.getClass() 
                .getResourceAsStream("/mysqlDB.properties"); 
        try { 
            properties.load(in); 
        } catch (IOException ex) {   
            System.out.println(ex.getMessage()); 
            ex.printStackTrace(); 
        } 
    } 
    public Connection getConn(){ 
        Connection connection = null; 
        try{ 
            Class.forName(properties.getProperty("DBDriver")); 
            connection = DriverManager.getConnection(properties.getProperty("url"),properties.getProperty("name"),properties.getProperty("pass")); 
        }catch (Exception err) { 
            System.out.println("连接ConDB-->getCon()____JDBC错误!"); 
            err.printStackTrace();   
            return null;    
        } 
        return connection; 
    } 
    /**
     * 以下是关闭重载方法
     * @param rs
     * @param st
     * @param cs
     * @param conn
     * @throws SQLException
     */ 
    public void closeAll(ResultSet rs,Statement st ,CallableStatement cs ,Connection conn) throws SQLException{ 
        if(rs!=null){ 
            rs.close(); 
        } 
        if(st!=null){ 
            st.close(); 
        } 
        if(cs!=null){ 
            cs.close(); 
        } 
        if(conn!=null){   
            conn.close(); 
        } 
    } 
    public void closeAll(ResultSet rs,Statement st,Connection conn) throws SQLException{ 
        if(rs!=null){ 
            rs.close(); 
        } 
        if(st!=null){ 
            st.close(); 
        } 
        if(conn!=null){   
            conn.close(); 
        } 
    } 
    public void closeAll(ResultSet rs,PreparedStatement ps,Connection conn) throws SQLException{ 
        if(rs!=null){ 
            rs.close(); 
        } 
        if(ps!=null){ 
            ps.close(); 
        } 
        if(conn!=null){   
            conn.close(); 
        }   
    } 
    public void closeAll(PreparedStatement ps,Connection conn) throws SQLException{ 
        if(ps!=null){ 
            ps.close(); 
        } 
        if(conn!=null){   
            conn.close(); 
        }   
    } 
    public void closeAll(Statement st,Connection conn) throws SQLException{ 
        if(st!=null){ 
            st.close(); 
        } 
        if(conn!=null){   
            conn.close(); 
        }   
    } 
    public void closeAll(Connection conn) throws SQLException{ 
        if(conn!=null){   
            conn.close(); 
        }   
    } 

属性文件:

DBDriver=com.mysql.jdbc.Driver 
url=jdbc\:mysql\://localhost\:3306/db
name=root 
pass=root 
characterEncoding=utf8 

数据层接口:

/**
* 访问数据方法接口
* @author star
*
*/ 
@SuppressWarnings("unchecked") 
public interface IDao<T> { 
    /**
     * 分页查询方法
     * @param objClass 类对象
     * @param sql 查询语句
     * @param params 参数
     * @return 分页数据
     * @throws Exception
     */ 
    public List<T> findList(Object objClass,String sql, List params)throws Exception; 
     
    /**
     * 查询一条数据
     * @param objClass 类对象
     * @param sql 查询语句
     * @param params 参数
     * @return 一条数据信息
     * @throws Exception
     */ 
    public T findInfo(Object objClass,String sql ,List params)throws Exception; 
     
}
 
数据层接口实现:


/**
* 访问数据方法实现类
* @author  star

*/ 
@SuppressWarnings({"unchecked","unused"}) 
public class DaoImpl<T> implements IDao<T> { 
 
    private UtilDao dao = new UtilDao(); 
    private Connection conn = null; 
    private ResultSet rs = null; 
    private PreparedStatement ps = null; 
 
    /*
     * 查询一条数据
     */ 
    public T findInfo(Object objClass,String sql, List params) throws Exception { 
        Class c = objClass.getClass();  
        try{ 
            conn = dao.getConn(); 
            ps = conn.prepareStatement(sql); 
            for (int i = 0; i < params.size(); i++) { 
                if(params.get(i)!=null){ 
                    Object obj = params.get(i); 
                    if(obj.getClass().getName().equals("java.lang.String")){ 
                        ps.setString(i+1, obj.toString()); 
                    }else if(obj.getClass().getName().equals("java.lang.Integer")){ 
                        ps.setInt(i+1, Integer.valueOf(obj.toString())); 
                    }else{ 
                        ps.setObject(i+1, obj);     
                    } 
                } 
            } 
            rs = ps.executeQuery(); 
            Class type = null ; //属性类型 
            if(rs.next()){ 
                objClass = c.newInstance(); 
                List<String> list = Reflect003.getKeys(c); 
                Method method = null; 
                for (int i = 0; i < list.size(); i++) { 
                    String key = list.get(i); 
                    String mName = "set"+key.substring(0,1).toUpperCase()+key.substring(1); 
                    String typeName = c.getDeclaredField(key).getType().getName(); 
                    if(typeName.equals("int")){ 
                        type = int.class; 
                        method = c.getMethod(mName, type); 
                        method.invoke(objClass, rs.getInt(key));   
                    }else if(typeName.equals("java.lang.String")){ 
                        type = java.lang.String.class;    
                        method = c.getMethod(mName, type); 
                        method.invoke(objClass, rs.getString(key));     
                    } 
                } 
            } 
        }catch(Exception e){ 
            System.out.println("访问数据方法实现类findInfo方法出错"); 
            e.printStackTrace();  
        }finally{    
            dao.closeAll(rs,ps,conn); 
        }   
        return (T)objClass;  
    }  
 
    /*
     * 分页查询方法
     */ 
    public List<T> findList(Object objClass,String sql, List params) 
    throws Exception { 
        /*
         * 创建返回值对象
         */ 
        List<Object> info = new ArrayList<Object>();   
        //获得Class对象 
        Class c = objClass.getClass();  
        try{ 
            conn = dao.getConn(); 
            ps = conn.prepareStatement(sql); 
            for (int i = 0; i < params.size(); i++) { 
                if(params.get(i)!=null){ 
                    Object obj = params.get(i); 
                    /*
                     * 判断参数的原始类型
                     * 暂时判断Integer跟String类型
                     */ 
                    if(obj.getClass().getName().equals("java.lang.String")){ 
                        ps.setString(i+1, obj.toString()); 
                    }else if(obj.getClass().getName().equals("java.lang.Integer")){ 
                        ps.setInt(i+1, Integer.valueOf(obj.toString())); 
                    }else{ 
                        ps.setObject(i+1, obj);     
                    } 
                } 
            } 
            rs = ps.executeQuery(); 
            Class type = null ; //属性类型 
            while(rs.next()){ 
                //创建一个实例 
                objClass = c.newInstance(); 
                 
                //获取所有的字段名称 
                List<String> list = Reflect003.getKeys(c); 
                 
                Method method = null;//声明Method对象 
                 
                for (int i = 0; i < list.size(); i++) { 
                    String key = list.get(i); 
                    String mName = getSetMethodName(key); //组装set方法名称 
                    String typeName = c.getDeclaredField(key).getType().getName();  //获取字段类型名称 
                    /*
                     * 判断字段类型
                     */ 
                    if(typeName.equals("int")){ 
                        type = int.class; //赋值属性类型 
                        method = c.getMethod(mName, type); //获得Method实例 
                        method.invoke(objClass, rs.getInt(key));  //调用该set方法 
                    }else if(typeName.equals("java.lang.String")){ 
                        type = java.lang.String.class;    
                        method = c.getMethod(mName, type); 
                        method.invoke(objClass, rs.getString(key));     
                    } 
                } 
                info.add(objClass); 
            }   
        }catch(Exception e){ 
            System.out.println("访问数据方法实现类findList方法出错"); 
            e.printStackTrace(); 
        }finally{ 
            dao.closeAll(rs,ps,conn);   
        } 
        return (List<T>)info;   
    } 
    /**
     * 组装set方法
     * @param columnName 字段名
     * @return
     */ 
    private static String getSetMethodName(String columnName) { 
        return "set" + columnName.substring(0, 1).toUpperCase() 
        + columnName.toLowerCase().substring(1); 
    } 

获取所有字段的方法:


/**
* 获取字段名称类
* @author star
*
*/ 
public class Reflect003 { 
    public static List<String> getKeys(Class<?> c){ 
        List<String> list = new ArrayList<String>(); 
        try{ 
            //根据Class的静态方法获取所以字段名称、不包括继承字段 
            Field[] fs = c.getDeclaredFields(); 
            for (int i = 0; i < fs.length; i++) { 
                list.add(fs[i].getName()); 
            } 
        }catch(Exception e){ 
            e.printStackTrace(); 
        } 
        return list; 
    } 


main测试Test:

public static void main(String[] args) throws Exception { 
        DaoImpl dao = new DaoImpl(); 
        test_user u = new test_user(); 
        String sqlPage = "SELECT * FROM userWHERE id <= "; 
        sqlPage += " (SELECT id FROM user ORDER BY id LIMIT "+(2-1)*20+", 1) "; 
        sqlPage += " ORDER BY id LIMIT 20 " ;  // 
         
        List<test_user> listT = (List<test_user>)dao.findList(u, sqlPage, new ArrayList()); 
        for (int i = 0; i < listT.size(); i++) { 
            test_user user = listT.get(i); 
            System.out.println("名称====:"+user.getName()); 
        } 
    } 
分享到:
评论

相关推荐

    java注解、java反射机制 jdbc 封装

    接着,我们来看Java反射机制。反射允许程序在运行时检查类、接口、字段和方法的信息,甚至可以动态调用方法和访问字段。在JDBC封装中,反射非常有用,因为它允许在运行时创建和执行SQL语句,而不必在代码中硬编码...

    JDBC_Java反射技术入门

    在这个“JDBC_Java反射技术入门”资源中,初学者可以了解到如何使用Java进行数据库操作的基础知识,包括连接数据库、执行SQL语句、处理查询结果等。 1. **JDBC基础**: - **加载驱动**:在使用JDBC之前,我们需要...

    使用java的反射机制来模拟hibernater的jdbc操作

    总之,Java反射机制为我们提供了灵活的编程方式,可以动态地操控类、接口、方法和字段,实现对数据库的动态操作。在这个案例中,我们看到了如何结合反射和JDBC实现类似Hibernate的功能,尽管这种方式可能不那么高效...

    Java反射机制在数据持久层轻量级ORM框架中的应用研究.pdf

    由于Java反射机制允许程序在运行时构造和访问任何类的属性和方法,它为Reflect-ORM框架提供了实现的理论基础。通过反射,框架可以动态地读取对象的属性信息,将这些信息转换为数据库的表结构,以及将数据库查询结果...

    Java JDBC简单入门之枚举(Enum)、泛型、反射、JDBC整合

    1. **加载数据库驱动**:通过`Class.forName("com.mysql.jdbc.Driver")`加载MySQL驱动,其他数据库对应不同的驱动类名。 2. **获取数据库连接**:使用`DriverManager.getConnection(url, username, password)`方法...

    Wrox.Professional.Java.JDK.6.Edition.Jan.2007.rar

    书中还可能涵盖了Java基础语法、面向对象设计、异常处理、集合框架、多线程编程、网络编程、反射机制等多个方面,旨在帮助开发者全面掌握JDK 6的新特性,提升开发效率和软件质量。通过阅读《Wrox Professional Java ...

    Addison.Wesley.Absolute.Java.5th.Edition.Mar.2012

    1. **Java语言基础**:介绍了Java的基本语法,如变量、数据类型、运算符、流程控制语句(if、switch、for、while)以及方法的定义和调用。 2. **面向对象编程**:深入讲解类、对象的概念,封装、继承和多态等面向...

    Java常用包介绍.pdf

    java.lang.reflect 包提供了用于反射对象的工具,包括类、字段、方法和构造方法的反射。 6. java.awt.image 包 java.awt.image 包处理和操纵来自于网上的图片的Java工具类库,包括图像处理、图像resize和图像滤镜...

    Core Java.JAVA核心技术(中文版)

    1. **Java语言基础**: - **语法基础**:包括变量、数据类型、运算符、流程控制语句(如if、switch、for、while)、方法定义与调用等。 - **类与对象**:讲解面向对象编程的基本概念,如类的定义、对象的创建与...

    Java中的万能查询方法(源码)

    在Java编程中,"万能查询方法"是一种通用的、基于反射技术实现的数据库查询解决方案。这种方法的主要目的是简化代码,减少重复性工作,提高代码的复用性。它允许开发者通过传入实体类和SQL查询语句来执行数据库查询...

    [反射机制]建立数据库连接

    总结起来,这个主题涉及到Java反射机制的运用,特别是动态加载数据库驱动和创建数据库连接。通过深入理解反射和JDBC API,开发者可以编写出更灵活、适应性强的代码,以应对各种数据库连接需求。同时,了解项目结构和...

    利用java反射、注解及泛型模拟ORM实现

    1. 反射(Reflection):Java反射机制允许程序在运行时动态地获取类的信息(如类名、方法名、参数类型等)并调用其方法。通过`Class`类,我们可以实例化未知类型的对象,调用私有方法,访问私有字段,以及检查类的...

    Apress.Beginning.Java.SE.6.Platform.Oct.2007.pdf

    8. **反射API**:Java反射允许在运行时检查类的信息,创建和调用类的对象。这部分可能涵盖Class对象、Constructor、Method和Field的使用。 9. **网络编程**:Java 6提供了Socket和ServerSocket类进行网络通信,书中...

    java核心技术卷二

    6. Java的反射机制,了解如何在运行时检查、修改和调用对象的方法和属性。 7. 注解(Annotation)和泛型的深入讲解,涵盖自定义注解的创建与应用,以及泛型的高级特性。 8. Java 8及后续版本中的函数式编程特性,如...

    通过类反射机制实现底层数据库连接

    在Java编程中,类反射机制是一种强大的工具,它允许程序在运行时检查并操作类的信息,包括类的方法、属性和构造器。这个机制是Java动态性的重要体现,它使得我们能够在不知道具体类名的情况下,创建对象并调用其方法...

    JDBC_Java语言与数据库互联的接口

    总之,JDBC作为Java语言与数据库交互的重要桥梁,极大地简化了数据库访问过程,使得Java开发者能够轻松地构建出功能强大的数据库应用程序。随着Java技术的不断发展和完善,JDBC也将持续进化,更好地服务于Java开发者...

    Core.Java.2.Volume.II.Advanced.Features.7th.Edition

    1. **多线程编程**:在Java中,多线程是高级特性之一,本书会详细讲解如何创建和管理线程,包括同步机制(如synchronized关键字、wait()和notify()方法)、线程池以及并发集合的使用。 2. **网络编程**:Java提供...

    Core Java(Volume II--Advanced Features 9th Edition).pdf

    9. **JDBC数据库编程**:Java Database Connectivity (JDBC) 是Java访问数据库的标准API,书中讲述了如何连接数据库、执行SQL语句、处理结果集,以及事务管理和批处理。 10. **Java企业级技术**:简要介绍EJB...

Global site tag (gtag.js) - Google Analytics