【Java学习】使用泛型和反射 创建通用的数据库查询方法

开始接触数据库编程的时候可能会觉得,不同的数据库表的查询应该对应不同的查询方法,但是这样会非常耗时并且没有意义,这里可以通过反射和泛型来创建一个通用的数据库查询方法。当查询不同的表时,只需要改变查询方法中的参数,当使用不同的数据库时,只需要改变相应文件中URL和DRIVER配置。下面是具体的代码:(注意:实体类中的私有属性名要和数据库表中的属性名完全一致)

public  List opQuery(String sql,List params,Class cls){
    // 装载对象的集合
    List list=new ArrayList();
    // 准备链接
    Connection=null;
    // 准备sql语句的操作对象
    PrepareStatement ps=null;
    // 结果集
    ResultSet rs=null;
    try{
        // 获得链接
        conn=getConnection();
        ps=conn.PrepareStatement();
        // 如果传递的参数不为空
        if(params!=null){
            for(int i=0;i<params.size();i++){
                ps.setObject(i+1,params.get(i));
            }
        }
        // 执行sql语句
        rs=ps.execQuery();
        // 从结果集中获取元数据
        ResultSetMetaData rm=rs.getMetaData();
        // 依次取出数据
        while(rs.next()){
            // 使用反射创建无参数对象
            T m=cls.newInstance();
            //只针对于一行,也就是仅仅创建一个对象  
            for(int i=0;i// 获得列名
                String clunmnName=rm.getColumnName(i+1);
                // 取出表中数据
                Object value=rs.getObject(i+1);
                // 获取对象的属性
                Filed filed=cls.getDeclaredField(columnName);
                // 赋予操作对象私有属性的权限
                field.setAccessible(true);
                // 给私有对象赋值
                field.set(m,value);
            }
            // 向集合中添加赋值完毕的对象
            list.add(m);

        }
    }catch(Exception e){
        e.printSpacee();
    }finally{
        // 关闭
        closeAll(rs,conn,ps);
    }
    // 返回包含表中所有数据的集合对象
    return list;
} 
  

简要概括:

  • 参数:String sql-查询语句,不同的表查询语句不同,所以这里作为参数;List params-sql语句中可能存在占位符,这个集合就是给占位符提供参数; Class cls-使用反射,要操作的实体类class。
  • 步骤:

    (1)获得数据库连接 Connection conn=DriverManager.getConnection();
    (2) 获得操作sql语句的对象 PrepareStatement ps=conn.prepareStatement();
    (3)结果集对象:ResultSet rs=ps.executeQuery();
    (4)从结果集中获取元数据对象(获得数据库表中列的信息)
    (5)根据表中列名获得对象属性 并将表中值赋给该对象属性
    (6)将对象添加都集合中返回

一般这段代码是作为数据库底层操作的方法,通常被其他数据库操作类调用,如下:

    public List<Users> search(){
        // 准sql语句
        String sql="select * from users;";
        List<Users> list=null;
        list=opQuery(sql, null, Users.class);
        return list;
    }

这样,在业务逻辑层中,就可以直接调用了,调用代码如下(假设已经创建了一个Users实体类):

        List list=studentDao.search();
        for(Users users:list){
            System.out.println(users.toString());
        }

你可能感兴趣的:(程序猿进阶,java学习)