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

原创 2016年08月29日 23:16:40

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

public <T> List<T> opQuery(String sql,List<Object> params,Class cls){
    // 装载对象的集合
    List<T> list=new ArrayList<T>();
    // 准备链接
    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<rm.getColumnCount;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<Users> list=studentDao.search();
        for(Users users:list){
            System.out.println(users.toString());
        }
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

java执行SQL语句实现查询的通用方法

查询的结果集保存并返回调用函数 结果集中数据存储到类型的Vector容器中,同时可以被多种类型调用 /* * 执行sql查询语句 */ public static Vector ex...

从配置文件读取数据连接信息,利用泛型和java反射机制,写一个公共的增删改查数据库操作类

背景: 最近在学习java,然后就看了spring jdbc。对于菜鸟来说,看得实在头大,然而还有强迫症作祟最是要不得。又要导入common的相关jar包,又要导入mysql的jar包,还要导入spr...

使用泛型参数传递对数据库进行增删改查

使用泛型参数传递对数据库进行增删改查  string sql = "insert into  WisdomInformation(title,contents,type)values('@tit...

反射与泛型--徒手教你写个Android数据库Dao层玩玩

最近一直在忙项目数据库重构,需求是把所有的内容提供者以及对数据库的操作都换成Orm(Object Relational Mapping)关系对象关系映射。期间遇到非常多的问题,于是乎把数据库的orm的...

java泛型(一)、泛型的基本介绍和使用

现在开始深入学习java的泛型了,以前一直只是在集合中简单的使用泛型,根本就不明白泛型的原理和作用。泛型在java中,是一个十分重要的特性,所以要好好的研究下。 一、泛型的基本概念  泛型...

一个用泛型简单实现的数据库查询实体方法

private Connection conn = null;     private PreparedStatement pstmt = null;     private ResultSet ...

利用反射泛型编写一个通用Dao

首先明确几个概念: ArrayList: E为类型参数变量 ArrayList :Integer为实际参数变量 ArrayList: 整个表达式称为参数化类型,对应类型为ParameterizedTy...

泛型集合List<T> 的详细用法

List 的详细用法 命名空间:    System.Collections.Generic     List类是 ArrayList 类的泛型等效类。     该类使用大小可 ...
  • jiong12
  • jiong12
  • 2014年09月28日 11:00
  • 15579

Java数据库通用查询及封装

Java数据库通用查询及封装 时常在网上看到,有关Java数据通用查询及封装的技术文章,前些日我在看书时突然想起以前怎么写jdbc查询的,好像当时没理顺,昨天晚上花了点时间,复习了一下写了两种通用数...

通过java反射获取任意对象的字段名及字段值

import java.lang.reflect.Field; public class ReflectClass3 { /** * @param args */ public sta...
  • CTLLIN
  • CTLLIN
  • 2014年05月09日 00:30
  • 22373
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Java学习】使用泛型和反射 创建通用的数据库查询方法
举报原因:
原因补充:

(最多只允许输入30个字)