9.29JavaWeb之PreparedStatement针对测试表的操作

2021/10/5 20:11:04

本文主要是介绍9.29JavaWeb之PreparedStatement针对测试表的操作,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

9.29JavaWeb之PreparedStatement针对测试表的操作

针对order表的常规操作流程

    @Test
    public void testQueryNo1() {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            //获取连接
            conn = JDBCUtils.getConnection();
            //执行语句
            String sql = "select `order_id`,`order_name`,`order_date` from `order` where `order_id` = ?;";
            ps = conn.prepareStatement(sql);
            //填充占位符
            ps.setObject(1, 3);
​
            //执行查询
            rs = ps.executeQuery();
            //读取内容
            if (rs.next()) {
                /*获取每一列上的具体的值*/
                //因为获取三次所以不需要获取元数据
                int id = (int) rs.getObject(1);
                String name = (String) rs.getObject(2);
                Date date = (Date) rs.getObject(3);
​
                /*new一个对象,封装获取到的信息然后返回*/
                Order order = new Order(id, name, date);
                System.out.println(order);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            JDBCUtils.closeResource(conn, ps, rs);
        }
    }

针对order表的通用操作流程

需求:

  1. 传入sql

  2. 根据字段动态生成需要查询的字段

    @Test
    public Order orderForQuery(String sql, Object ...args) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            //获取连接
            conn = JDBCUtils.getConnection();
            //预编译sql
            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()) {
                Order order = new Order();
                //元数据获取每一个列的列值--->次数取决于列个数
                for (int j=0; j<columnCount; j++) {
                    //通过结果集获取列值--->结果集:ResultSet
                    Object columnValue = rs.getObject(j+1);
                    //获取每个列的列名--->通过结果集的元数据获取列值--->结果集的元数据:ResultSetMetaData
//                    String columnName = rsmd.getColumnName(j+1); --->不推荐使用
                    //获取列的别名--->如果没有起别名直接获取到列名--->该方法针对于表的字段名和类的属性名不一致的情况,写sql的时候必须使用类的属性名来命名字段的别名
                    String columnLabel = rsmd.getColumnLabel(j+1);
                    //通过反射将对象指定成员名的赋予指定的值--->columnName赋值columnValue
                    //反射加载类--->注意属性名和数据库的字段名不一致--->使用结果集将数据库的字段名转换成属性相同的名
                    /*
                    1、通过sql查询的时候直接将字段名转成与属性相同的别名
                    2、不要使用getColumnName方法,该方法是直接获取到列名而非别名
                    3、使用获取别名的方法来获取别名
                     */
                    Field field = Order.class.getDeclaredField(columnLabel);
                    //私有的属性也能够访问
                    field.setAccessible(true);
                    //给order对象当前该名称的属性赋值为columnVlaue
                    field.set(order, columnValue);
                }
                return order;
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //资源关闭
            JDBCUtils.closeResource(conn, ps, rs);
        }
        //没进if当中
        return null;
    }

 



这篇关于9.29JavaWeb之PreparedStatement针对测试表的操作的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程