zoukankan      html  css  js  c++  java
  • JDBC 6—— 针对不同表的通用查询操作

    不多说,直接上代码

    package com.JDBCStudy3.PreparedStatement.crud;
    
    import java.awt.List;
    import java.lang.reflect.Field;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.util.ArrayList;
    
    import org.junit.Test;
    
    import JDBC_util.JDBCutils;
    
    /*
     * 使用PrepareStatement实现针对于不同表的通用的查询操作
     * */
    public class PrepaerdStatementQueryTest<T> {
    
        @Test
        public void testGetInstance() {
            String sql = "select id,name,email from customers where id = ?";
            Customer customer = getInstance(Customer.class, sql, 12);
            System.out.println(customer);
    
            sql = "select order_id orderId,order_name orderName from `order` where order_id = ?";
            Order order = getInstance(Order.class, sql, 1);
            System.out.println(order);
        }
    
        /*
         * 针对不同的表的通用查询操作,返回表中的一条记录
         */
        @SuppressWarnings("finally")
        public <T> T getInstance(Class<T> clazz, String sql, Object... args) {
            Connection conn = null;
            PreparedStatement ps = null;
            ResultSet rs = null;
            try {
                conn = JDBCutils.getConnection();
    
                ps = conn.prepareStatement(sql);
                for (int i = 0; i < args.length; i++) {
                    ps.setObject(i + 1, args[i]);
                }
    
                // 执行,获取结果集
                rs = ps.executeQuery();
                // 获取结果集的元数据
                ResultSetMetaData rsmd = rs.getMetaData();
                // 获取列数
                int columnCount = rsmd.getColumnCount();
    
                if (rs.next()) {
                    @SuppressWarnings("deprecation")
                    T t = clazz.newInstance();
                    for (int i = 0; i < columnCount; i++) {
                        // 获取每个列的列值:通过ResultSet
                        Object columnValue = rs.getObject(i + 1);
                        /*
                         * 通过ResultSetMetaData 获取列的列名:getColumnName() -- 不推荐使用 获取列的别名:getColumnLabel()
                         */
                        // String columnName = rsmd.getColumnName(i + 1);
                        String columnLabel = rsmd.getColumnLabel(i);
                        // 通过反射,将对象指定名columnName的属性赋值为指定的值columnValue
                        Field field = Order.class.getDeclaredField((String) columnLabel);
                        field.setAccessible(true);
                        field.set(t, columnValue);
                    }
                    return t;
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                JDBCutils.closeResource(conn, ps, rs);
                return null;
            }
        }
    
        public void testGetForList() {
            String sql = "select id,name,email from customers where id < ?";
            ArrayList<Customer> list = getForList(Customer.class, sql, 12);
            list.forEach(System.out::println);
            
            sql = "select order_id orderId,order_name orderName from `order` where order_id < ?";
            ArrayList<Order> list1 = getForList(Order.class, sql, 5);
            list1.forEach(System.out::println);
        }
    
        @SuppressWarnings("finally")
        public <T> ArrayList<T> getForList(Class<T> clazz, String sql, Object... args) {
            Connection conn = null;
            PreparedStatement ps = null;
            ResultSet rs = null;
            try {
                conn = JDBCutils.getConnection();
    
                ps = conn.prepareStatement(sql);
                for (int i = 0; i < args.length; i++) {
                    ps.setObject(i + 1, args[i]);
                }
    
                // 执行,获取结果集
                rs = ps.executeQuery();
                // 获取结果集的元数据
                ResultSetMetaData rsmd = rs.getMetaData();
                // 获取列数
                int columnCount = rsmd.getColumnCount();
                // 创建集合对象
                ArrayList<T> list = new ArrayList<T>();
                while (rs.next()) {
                    @SuppressWarnings("deprecation")
                    T t = clazz.newInstance();
                    for (int i = 0; i < columnCount; i++) {
                        // 获取每个列的列值:给t对象指定的属性赋值
                        Object columnValue = rs.getObject(i + 1);
                        /*
                         * 通过ResultSetMetaData 获取列的列名:getColumnName() -- 不推荐使用 获取列的别名:getColumnLabel()
                         */
                        // String columnName = rsmd.getColumnName(i + 1);
                        String columnLabel = rsmd.getColumnLabel(i);
                        // 通过反射,将对象指定名columnName的属性赋值为指定的值columnValue
                        Field field = Order.class.getDeclaredField((String) columnLabel);
                        field.setAccessible(true);
                        field.set(t, columnValue);
                    }
                    list.add(t);
                }
                return list;
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                JDBCutils.closeResource(conn, ps, rs);
                return null;
            }
    
        }
    
    }
  • 相关阅读:
    Image Processing and Analysis_8_Edge Detection:Finding Edges and Lines in Images by Canny——1983
    2019年C题 视觉情报信息分析
    Image Processing and Analysis_8_Edge Detection:Theory of Edge Detection ——1980
    Computer Vision_2_Active Shape Models:Active Shape Models-Their Training and Application——1995
    Computer Vision_1_Active Appearance Models:Active Appearance Models——2001
    Computer Vision_1_Active Appearance Models :Active Appearance Models——1998
    这群程序员疯了!他们想成为IT界最会带货的男人
    阿里云视频云正式支持AV1编码格式 为视频编码服务降本提效
    Knative Serverless 之道:如何 0 运维、低成本实现应用托管?
    千呼万唤始出来——DataV私有部署功能
  • 原文地址:https://www.cnblogs.com/stu-jyj3621/p/14311846.html
Copyright © 2011-2022 走看看