JDBC_通用查询操作

视频原地址:https://www.bilibili.com/video/av67955358?p=20

通用查询的操作

1.获取数据库连接

2.预编译sql语句

3.填充占位符

4.执行executeQuery查询

5.处理获取的结果集

@Test
    public void testquery1() {
        String sql = "select id,'name',email,birth from customers where id = ?";

          针对于表的字段名与类的属性名不相同的情况
          必须申明sql时,使用类的属性名来命名字段的别名


        customers cs = queryforcustomer(sql, 1);
        System.out.println(cs);
    }
    
    public customers queryforcustomer(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()) {
                customers cust = new customers();
/*ORM变成思想
一个数据表对应一个java类
表中的一条数据对应java类中的一个对象
表中的一个字段对应java类中的一个属性
               */
                for(int i=0;i<columnCount;i++) {
                    Object value = rs.getObject(i+1);
                    
                    //获取每个列的列名
                    String columnlabel = rsmd.getColumnLabel(i+1);
                    //getColumName是获取表的列名 并没有获取别名
                    //getColumnLabel可以获取别名当没有别名时候就是表的列名
                    
                    
                    //给cust对象指定的columName属性,赋值为columvalue,通过反射
                    Field field = customers.class.getDeclaredField(columnlabel);
                    field.setAccessible(true);//若成员变量有私有的
                    field.set(cust, value);
                }
                return cust;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            JDBCutils.closeResource(conn, ps, rs);
        }
        return null;
    }

针对于不同表的查询一条查询、

利用泛型即可

@Test
    public void testforquery() {
        String sql = "select id,name,email from customers where id =?";
        customers cust = queryforcustomer(customers.class, sql, 1);
        System.out.println(cust);
        
    }
    

   /*
    * 针对于不同表返回一条查询数据
    * */
    public <T> T queryforcustomer(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()) {
                T t = clazz.getDeclaredConstructor().newInstance();
                for(int i=0;i<columnCount;i++) {
                    Object value = rs.getObject(i+1);
                    
                    //获取每个列的列名
                    String columnlabel = rsmd.getColumnLabel(i+1);
                    //getColumName是获取表的列名 并没有获取别名
                    //getColumnLabel可以获取别名当没有别名时候就是表的列名
                    
                    
                    //给t对象指定的columName属性,赋值为columvalue,通过反射
                    Field field = clazz.getDeclaredField(columnlabel);
                    field.setAccessible(true);
                    field.set(t, value);
                }
                return t;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            JDBCutils.closeResource(conn, ps, rs);
        }
        return null;
    }

针对于不同表的多条查询

@Test
    public void testlist() {
        String sql = "select id,name,email from customers where id<?";
        List<customers> cust = querylsitforcustomer(customers.class, sql, 4);
        cust.forEach(System.out::println);
    }

    public <T> List <T> querylsitforcustomer(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()) {
                T t = clazz.getDeclaredConstructor().newInstance();
                for(int i=0;i<columnCount;i++) {
                    Object value = rs.getObject(i+1);
                    
                    //获取每个列的列名
                    String columnlabel = rsmd.getColumnLabel(i+1);
                    //getColumName是获取表的列名 并没有获取别名
                    //getColumnLabel可以获取别名当没有别名时候就是表的列名
                    
                    
                    //给t对象指定的columName属性,赋值为columvalue,通过反射
                    Field field = clazz.getDeclaredField(columnlabel);
                    field.setAccessible(true);
                    field.set(t, value);
                }
                list.add(t);
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            JDBCutils.closeResource(conn, ps, rs);
        }
        return null;
    }

猜你喜欢

转载自www.cnblogs.com/jintianhekele/p/11917616.html
今日推荐