JDBC结合反射实现查询封装,返回对应类型对象的集合

本文介绍了如何结合JDBC和反射技术,实现数据库查询操作并将结果封装为对应类型的对象集合。通过创建JDBCUtils工具类、User模型类、QueryDao查询接口以及AppTest测试类,详细阐述了这一过程。实验中使用了Oracle数据库,并依赖ojdbc6.jar库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

结合反射实现查询封装,返回对应类型对象的集合

现有表t_user:

在这里插入图片描述

先建JDBC工具类,JDBCUtils.java

public class JDBCUtils {
    private static Properties pro=new Properties();
    static{
        try {
            pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            Class.forName(pro.getProperty("driver"));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    public static Connection getConnection() throws SQLException {
        Connection conn=null;
        conn=DriverManager.getConnection(
                pro.getProperty("url"),
                pro.getProperty("username"),
                pro.getProperty("password")
        );
        return conn;
    }
    public static void release(Connection conn,Statement state,ResultSet result){
        if(result!=null){
            try {
                result.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(state!=null){
            try {
                state.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    public static void release(Connection conn, Statement state){
        release(conn,state,null);
    }
}

User.java

public class User {
    private String name;
    private String password;

    public User() {
    }

    public User(String name, String password) {
        this.name = name;
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

QueryDao.java 获取连接数据库,并执行sql语句,用反射创建对应的对象

/*
结合反射实现查询封装,返回对应类型对象的集合
 */
public class QueryDao {

    //查询操作
    public List testUpdate(String sql,Class cls,Object ... args){
        Connection conn = null;
        PreparedStatement state = null;
        ResultSet resultSet=null;
        ResultSetMetaData data=null;
        List<Object> list=new ArrayList<>();

        //1.获取连接
        try {
            conn = JDBCUtils.getConnection();
            //2.封装预处理块
            state = conn.prepareStatement(sql);

            //3.赋值
            if(args!=null && args.length!=0){
                for(int i = 0;i<=args.length-1;i++){
                    state.setObject(i+1,args[i]);
                }
            }

            //4.执行
            resultSet = state.executeQuery();
            data = resultSet.getMetaData();
            int count = data.getColumnCount();
            data.getColumnLabel(1);
            while(resultSet.next()){
                Object o = cls.getConstructor().newInstance();
                for (int i = 1; i <=count ; i++) {
                    String label = data.getColumnLabel(i);
                    Field field = cls.getDeclaredField(label);
                    String str=field.getName();
                    String s = str.substring(0, 1).toUpperCase() + str.substring(1);
                    Method method = cls.getMethod("set" + s, field.getType());
                    method.invoke(o,resultSet.getObject(i));
/*                    field.setAccessible(true);
                    field.set(o,resultSet.getObject(i));*/
                }
                list.add(o);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }  finally {
            JDBCUtils.release(conn,state,resultSet);
        }

        //返回
        return list;
    }
}

AppTest.java 测试

public class AppTest {
    public static void main(String[] args) {
        QueryDao query = new QueryDao();
        User user=new User();
        List list = query.testUpdate("select username \"name\",password \"password\" from t_user ",User.class);
        list.forEach(System.out::println);
    }
}

本次实验需要用到ojdbc6.jar,记得导入包,用的数据库是Oracle.

运行截图:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值