java学习笔记——JDBC 中 ResultSet、ResultSetMetaData配置对象的属性、批处理

2023-11-13

使用ResultSet、ResultSetMetaData操作数据表:SELECT



public void test1(){
        //1. 获取连接
        Connection conn = null;
        PreparedStatement ps = null;
        //4. 执行 SQL(获取 ResultSet : 结果集)
        ResultSet rs = null;
        try {
            conn = JDBCUtils.getConnection();
            
            //2. 获取 PreparedStatement,用于发送 SQL
            String sql = "select id, name, email, birth from customers where id = ?";
            ps = conn.prepareStatement(sql);
            
            //3. 填充占位符
            ps.setInt(1, 16);
            
            rs = ps.executeQuery();
            
            //5. 获取结果集数据
            if(rs.next()){
                int id = rs.getInt(1);
                String name = rs.getString(2);
                String email = rs.getString(3);
                Date birth = rs.getDate(4);
                
                System.out.println(id + "," + name + "," + email + "," + birth);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //6.关闭连接
            JDBCUtils.close(rs, ps, conn);
        }

    }



/*
     * ORM (Object Relateional Mapping) : 对象关系映射
     *
     * 数据表中一张表   ----  Java 一个类
     * 数据表中一个字段  ----  Java 一个属性
     * 数据表中一条数据  ----  Java 一个对象
     *

     */

//针对 Order 表写一个查询一个 Order 对象并返回的方法,以及一堆 Order 对象并返回的方法
    @Test
    public void test2(){
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = JDBCUtils.getConnection();
            
            String sql = "select id, name, email, birth from customers where id < ?";
            ps = conn.prepareStatement(sql);
            
            ps.setInt(1, 16);
            
            rs = ps.executeQuery();
            
            while(rs.next()){
                
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String email = rs.getString("email");
                Date birth = rs.getDate("birth");
                
                Customer cust = new Customer(id, name, email, birth);
                
                System.out.println(cust);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, ps, conn);
        }
        
    }



@Test
    public void test4(){
        String sql = "select id, name, email, birth from customers where id = ?";
        Customer cust = get2(sql, Customer.class, 10);
        System.out.println(cust);
        
        System.out.println("-----------------------------------------------");
        
        String sql2 = "select order_id orderId, order_name orderName, order_date orderDate from `order` where order_id = ?";
        Order order = get2(sql2, Order.class, 2);
        System.out.println(order);
    }
    
    public <T> T get2(String sql, Class<T> clazz, Object ... args){//get2(sql, Order.class)
        T t = null;
        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 = clazz.newInstance();
                
                for (int i = 0; i < columnCount; i++) {
                    //获取列名
                    String columnName = rsmd.getColumnLabel(i+1);
                    
                    //根据列名获取对应列的数据
                    Object columnValue = rs.getObject(columnName);
                    
                    Field field = clazz.getDeclaredField(columnName);//注意:必须保证结果集中列名(别名),与属性名称保持一致!!!!!
                    field.setAccessible(true);//忽略访问权限
                    field.set(t, columnValue);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, ps, conn);
        }
        
        return t;
        

    }


/*
     * **通用查询:
     *
     * 1. 需要返回一个什么类型的对象,不能确定?
     *         泛型:确定返回值类型
     *         反射:确定返回的对象
     *
     * 2. 对于结果集的处理,不能确定?
     *         ResultSetMetaData : 结果集的元数据
     *             getColumnCount() : 返回结果集的列数
     *             getColumnName() : 返回结果集的列名
     *             getColumnLabel() : 返回结果集列的别名(有别名获取别名,没别名获取列名)
     */
    @Test
    public void test5(){
        String sql = "select id, name, email, birth from customers where id < ?";
        List<Customer> list = getList(sql, Customer.class, 16);
        
        for (Customer customer : list) {
            System.out.println(customer);
        }
        
        System.out.println("----------------------------------------------------");
        
        String sql2 = "select order_id orderId, order_name orderName, order_date orderDate from `order` where order_id < ?";
        
        List<Order> list2 = getList(sql2, Order.class, 5);
        
        for (Order order : list2) {
            System.out.println(order);
        }
    }
    
    public <T> List<T> getList(String sql, Class<T> clazz, Object... args) {
        List<T> list = new ArrayList<>();

        // 1. 获取连接
        Connection conn = null;
        // 2. 获取 PreparedStatement, 用于发送 SQL
        PreparedStatement ps = null;
        // 4. 执行 SQL, 获取 ResultSet 结果集
        ResultSet rs = null;
        try {
            conn = JDBCUtils.getConnection();

            ps = conn.prepareStatement(sql);

            // 3. 根据可变参数填充占位符
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i + 1, args[i]);
            }

            rs = ps.executeQuery();

            // 5. 获取当前结果集的元数据 ResultSetMetaData
            ResultSetMetaData rsmd = rs.getMetaData();

            // 6. 获取结果集的列数
            int columnCount = rsmd.getColumnCount();

            // 7. 获取结果集中数据
            while (rs.next()) {

                T t = clazz.newInstance();

                for (int i = 0; i < columnCount; i++) {
                    // 7.1 根据元数据获取列名
                    String columnName = rsmd.getColumnLabel(i + 1);

                    // 7.2 根据列名获取对应列的值
                    Object columnValue = rs.getObject(columnName);

                    // 7.3 将获取的列值封装进对象
                    PropertyUtils.setProperty(t, columnName, columnValue);
                }

                list.add(t);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 8. 关闭连接
            JDBCUtils.close(rs, ps, conn);
        }

        return list;

    }


注意:上边 代码test5 中使用了为ResultSetMetaData配置对象的属性的工具类: PropertyUtils.setProperty(t, columnName, columnValue);  

加载工具类如下:


将以上两个.jar文件拷贝到项目中,并build path,然后就可以使用啦





批处理


    @Test
    public void test1(){
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = JDBCUtils.getConnection();
            
            String sql = "insert into emp values(?,?)";
            ps = conn.prepareStatement(sql);
            
            for (int i = 0; i < 100000; i++) {
                ps.setInt(1, i+1);
                ps.setString(2, "emp_" + i);
                
                //执行 SQL
                ps.executeUpdate();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(null, ps, conn);
        }
    }

}


//批量处理
    @Test
    public void test2(){
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = JDBCUtils.getConnection();
            
            String sql = "insert into emp values(?,?)";
            ps = conn.prepareStatement(sql);
            
            for (int i = 0; i < 100000; i++) {
                ps.setInt(1, i+1);
                ps.setString(2, "emp_" + i);
                
                //积攒 SQL
                ps.addBatch();
                
                if((i+1) % 1000 == 0){
                    //执行 SQL
                    ps.executeBatch();
                    
                    //清空 SQL
                    ps.clearBatch();
                }
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(null, ps, conn);
        }

    }

以上两段程序都是向数据库中插入100000条数据,但执行效率却天壤之别,原因是代码段二使用了批处理

注意:开启批处理的方法是使用DriverManager.getConnection(url, user, password);加载url 的时候将url修改为:jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true就可以啦

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java学习笔记——JDBC 中 ResultSet、ResultSetMetaData配置对象的属性、批处理 的相关文章

  • 工具类之FastDFSClient

    import org csource common MyException import org csource common NameValuePair import org csource fastdfs import org spri
  • 【Java学习笔记】API:线程

    线程API 线程的生命周期图 线程方法 run方法用于定义线程任务 interrupt方法用于中断线程 yield用于让出CPU时间 start方法用于启动线程 创建线程有两种方式 常见线程有两种方式 方式一 继承Thread并重写run方
  • myBatis测试条件查询,条件参数为中文取不到数据

    在用myBatis做模糊查询的时候 发现当传入参数为中文时 就算数据库中有符合条件的数据 但取出的也是空的 但将查询参数变成英文或数字后 又可以正常查询 解决办法 因数据库采用utf 8编码 所以在修改数据库配置文件 加上编码 就可以正常查
  • Java学习笔记之“比较字符串”

    本文为在How2j的学习总结 只代表个人见解 如有不妥 望指出以便更正 问题描述 创建一个长度是1000的字符串数组 使用长度是2的随机字符填充该字符串数组 统计这个字符串数组里重复的字符串有多少种 注 需要去除重复次数大于2的情况 pac
  • Streaming 102批处理之外的流处理世界

    简单回顾和路线图 在Streaming 101中 首先澄清了一些术语 介绍了有限数据 VS无限数据 有限数据源具有有限的大小 通常被称为 批处理 数据 无限数据源源可能具有无限大小 通常被称为 流 数据 在后边将会尽量避免使用批处理和流式传
  • hashmap中为什么使用红黑树?

    在回答这个问题之前 我们先了解一下有关二叉树的基本内容 二叉排序树 又称二叉查找树 1 若左子树不为空 则左子树上所有结点的值均小于根结点的值 2 若右子树不为空 则右子树上所有结点的值均大于根节点的值 3 左右子树也为二叉排序树 平衡二叉
  • java中的八种数据类型、变量与常量

    内存空间所占字节数 8位等于1字节 数值型 1 整数类型 byte 1 short 2 int 4 long 8 2 浮点类型 float 4 double 8 字符型 char 2 布尔型 boolean 1或4 取值范围 byte 12
  • 多线程2(同步代码块+同步方法+同步锁+死锁)

    一 多线程同步 多线程的并发执行可以提高程序的效率 但是当多个线程去访问同一个资源时 有时也会引发一些安全性问题 例如 统计一个班上的学生人数时 学生有进有出会影响最终学生人数 为了解决这样的问题 需要实现多线程的同步 即限制某个资源在同一
  • 在 R 中调用 Oracle 存储过程 - 如何获取结果集?

    寻找使用 R 调用 Oracle 存储过程并返回结果集的示例 我使用 RJDBC 库 dbGetQuery 来调用 Sybase procs 并将结果指向变量 这对于 Oracle select stmts 的工作原理相同 但是 我不知道如
  • 在Java程序中使用结果集

    Resultset rs stmt executeQuery select count from feedsca group by score order by score 使用上面的 java 代码 我从名为 feedsCA 的表中检索行
  • 如何使用 Java 中的 ResultSet 获取行数?

    我正在尝试创建一个简单的方法 该方法接收 ResultSet 作为参数并返回一个包含 ResultSet 行数的 int 这是一种有效的方法吗 int size 0 try while rs next size catch Exceptio
  • ResultSet 中不允许 updateLong

    我正在尝试在表中添加序列号 这是我的方法 public void reArrangeTrID String parti name getText toUpperCase long trid 1 try String query SELECT
  • SQL 将汇总行添加到 MySQL 结果集

    如果我有一个 MySQL 表 例如 我想用SQL来计算总和PositiveResult专栏以及NegativeResult柱子 通常我可以简单地做SUM PositiveResult 在查询中 但是 如果我想更进一步 将总计放在结果集底部的
  • JDBC类型滚动不敏感和敏感

    在查看Java JDBC ResultSet类型时 有两种滚动类型TYPE SCROLL SENSITIVE和TYPE SCROLL INSENSITIVE 这是我所理解的 但是当我去实际执行的时候 并没有看到效果 下面是代码 packag
  • 根据java中的另一个结果集调整结果集[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 I have 四种方法 两种方法即FindClosestToMultiplesOfTen 和 ClosestToMultiplesOfTen User 给出与输入的 logtime 相
  • java resultset.getstring("col_name") 查询

    我有一个简单的询问ResultSet getString java中的JDBC方法 假设数据库列中的值有一个 这是javas转义字符 例如 n or t etc 当我检索值时getString 我看到又添加了一个转义字符 其实际含义 n现在
  • 使用 SELECT 结果集通过 MySQL 存储过程运行 UPDATE 查询

    我试图了解 MySQL 存储过程 我想检查用户登录凭据是否有效 如果有效 则更新用户在线状态 DROP PROCEDURE IF EXISTS checkUser DELIMITER CREATE PROCEDURE checkUser I
  • org.h2.jdbc.JdbcSQLException:对象已关闭

    对于我的一生 我看不出它是如何 已经关闭 的 import java sql Connection import java sql DriverManager import java sql ResultSet import java sq
  • ResultSet.TYPE_SCROLL_SENSITIVE 的行为

    我对 a 的行为感到困惑ResultSet这是类型TYPE SCROLL SENSITIVE 我对此的理解是 我执行一个选择查询 返回一个结果集 我打印出第一行中特定列的值 然后我执行Thread sleep 10000 这会使程序暂停 1
  • 将结果集从 SQL 数组转换为字符串数组

    我正在查询information schema columns我的 PostgreSQL 数据库中的表 使用表名 结果集查找所有列名 类型以及是否可为空 主键 id 除外 这是正在使用的查询 SELECT column name is nu

随机推荐

  • 使用Maven插件整合protocol buffer

    本来自己在网上找如何使protocol buffer在IDE 我用的是IDEA 上使用的 结果搜索出来的都不尽人意 因为都太粗略了 没有重点的去阐述 所以最后还是决定自己搜索相关的Maven插件 再慢慢地摸索 费了我好多的时间啊 本人小白
  • gojs 流程图框架-节点装饰器模板(二)

    上一章我们了解了如何使用 gojs 完成基本的节点和连接线的绘制 gojs 中还可以对节点或边进行自由拖动 编辑等功能 本章将基于上一章编写的流程图代码 为这些节点设置装饰器模板 完成后的效果图 建议下载源码 对照本文进行学习 源码地址 g
  • 【11月比赛合集】13场可报名的创新应用、数据分析和程序设计大奖赛,任君挑选!

    CompHub 实时聚合多平台的数据类 Kaggle 天池 和OJ类 Leetcode 牛客 比赛 本账号同时会推送最新的比赛消息 欢迎关注 更多比赛信息见 CompHub主页 或 点击文末阅读原文 以下信息仅供参考 以比赛官网为准 目录
  • 性能优化:虚拟列表,如何渲染10万条数据的dom,页面同时不卡顿

    最近做的一个需求 当列表大概有2万条数据 又不让做成分页 如果页面直接渲染2万条数据 在一些低配电脑上可能会照成页面卡死 基于这个需求 我们来手写一个虚拟列表 思路 列表中固定只显示少量的数据 比如60条 在列表滚动的时候不断的去插入删除d
  • GMP初探

    G Goroutine 协程 用户级的轻量级线程 M 对内核线程的封装 P 为G和M的调度对象 主要用途是用来执行goroutine 维护了一个goroutine队列 即runqueue 由来 单进程时代 这个时代不需要调度器 早起的操作系
  • PMS-adb install安装应用流程(Android L)

    第一次画流程图画的不好 通过adb install安装应用时对framework来说会首先调用Pm java的runInstall 方法 private int runInstall int installFlags 0 int userI
  • mesa调试技巧

    技术关键字 mesa log系统 环境变量 目录 前言 一 gdb或vscode的断点调试 二 mesa log 系统的使用 总结 前言 软件调试技术是要求软件开发人员必备的一项技能 不同的问题具有不同的调试手段和方法 本文从mesa库的实
  • xcode报错:Cycle inside *******

    xcode报错 Cycle inside building could produce unreliable results This usually can be resolved by moving the target s Heade
  • 基于pytorch实现的Auto-encoder模型

    最近因为在自己论文当中可能要用到Auto encoder 这个东西 学了点皮毛之后想着先按照别人的解释实现一下 然后在MNIST数据集上跑了下测试看看效果 话不多说直接贴代码 Author Media 2020 10 23 import t
  • ci/cd 流程图_如何在整个CI / CD工作流程中衡量软件的可靠性

    ci cd 流程图 克服具有持续可靠性的CI CD工作流程中保持代码质量的挑战 CI CD的做法鼓励在开发中频繁进行代码集成 加快新版本的准备工作并自动化部署 借助这种新工具 软件开发生命周期的这些部分都得到了改善和加速 同时 我们用于评估
  • Spring MVC(Boot) Servlet 3.0异步处理,DeferredResult和Callable(续篇)

    目录 背景 意外发现 结论 背景 上篇Spring MVC Boot Servlet 3 0异步处理 DeferredResult和Callable 我把WebMvcConfig 代码 继承WebMvcConfigurationSuppor
  • 搜索引擎和知识图谱那些事 (上).基础篇

    这是一篇基础性文章 主要介绍搜索引擎和知识图谱的一些原理 发展经历和应用等知识 希望文章对你有所帮助 如果有错误或不足之处 还请海涵 参考资料见后 一 搜索引擎 一 搜索引擎的四个时代 根据张俊林大神的 这就是搜索引擎 这本书中描述 推荐大
  • C++ stl容器

    1 std string string constructor include
  • 有哪些通俗易懂的例子可以解释 IaaS、PaaS、SaaS 的区别?

    首先 什么 云 很多年前 我们家住一小平房 喝水就喝院子里的井水 冬天取暖自己烧煤炉 后来经济状况好了 搬进了楼房 喝水喝上了集中供应的自来水 冬季用上了集中供应的暖气 再也不用打水和掏黑煤球 这就是 云 的基本概念 过去企业数据维护需要恒
  • 声纹识别中pooling总结

    1 Statistics Pooling http danielpovey com files 2017 interspeech embeddings pdf The statistics pooling layer calculates
  • Python手册(Standard Library)--math+random

    文章目录 math random math math import math math truck x 取整 math ceil x 天花板 math floor x 地板 math exp x math log x b math e 计算
  • 机器学习与数学基础知识(一)

    最近 朋友分享给我一套 七月在线 的机器学习视频 我几经思量之后 决定从视频量最少的数学基础部分开始看起 今天学习完了第一个视频 长达2小时 感觉老师讲的挺不错的 以前自己就对机器学习很感兴趣 做了一些了解和尝试性地学习 也看了一点经典的林
  • 专升本数学——极限与连续(二)笔记

    一 无穷大量与无穷小量 1 定义 无穷小量 如果 lim f x 0 则称 f x 是此极限条件下的无穷小量 本质 以 0 为极限的函数 x 2 是 x gt 0 时的无穷小量 无穷大量 如果 lim f x 无穷 则称 f x 是此极限条
  • 详解grep(一)grep基础、语法格式、常用选项与退出状态码的案例解析

    目录 一 GREP基础 1 1 grep的全称 1 2 grep语法格式 二 grep常用选项 2 1 长短选项的说明 2 2 显示常用信息 2 3 控制匹配模式的选项 2 4 控制输出内容的选项 2 5 控制输出行前缀的选项 2 6 控制
  • java学习笔记——JDBC 中 ResultSet、ResultSetMetaData配置对象的属性、批处理

    使用ResultSet ResultSetMetaData操作数据表 SELECT public void test1 1 获取连接 Connection conn null PreparedStatement ps null 4 执行 S