JDBC - 学习8 - Apache-DBUtil类库的使用

news/2024/5/19 1:38:17 标签: JDBC, Apache-DbUtil, 增删改查

文章目录

      • 1. 介绍
      • 2. QueryRunner
        • 2.1 更新操作 - 增删改
        • 2.2 查询操作
          • 2.2.1 单条记录查询 - BeanHandler
          • 2.2.2 多条记录查询 - BeanListHandler
          • 2.2.3 用于查询特殊值的单行函数 - ScalarHandler
        • 2.2.4 自定义结果集的处理器
        • 2.2.5 单条记录查询 - MapHandler
        • 2.2.6 多条记录查询 - MapListHandler
      • 2. DbUtils

1. 介绍

介绍: 简单的封装JDBC,简化JDBC编程的工作量,不会影响程序的性能

执行SQL,可处理结果集,线程安全
将结果集转为其他对象
关闭资源、提交回滚,加载驱动
常用的三个接口
org.apache.commons.dbutils.QueryRunner
org.apache.commons.dbutils.ResultSetHandler
org.apache.commons.dbutils.DbUtils

2. QueryRunner

2.1 更新操作 - 增删改

  QueryRunner.update( Connection conn, String sql, Object… params )

@Test
public void testInsert() throws Exception {

    QueryRunner qRunner = new QueryRunner();

    Connection conn = ConnectionTest.getConnection5();

    String sql = "update imgTable set money = money + 100 where name = ?";

    Integer rowCount = qRunner.update(conn, sql, 2);

    conn.close();

    System.out.println(rowCount);
}

2.2 查询操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CUx1ZTfI-1574126523609)(en-resource://database/9891:1)]

2.2.1 单条记录查询 - BeanHandler

将结果集的每一个结果转为 JavaBean对象

  

  QureyRunner.query( Connection conn, String sql, ResultSetHandler rsh, Object… params )

@Test
public void testSelect1() throws Exception {
    QueryRunner qRunner = new QueryRunner();

    Connection conn = ConnectionTest.getConnection5();

    String sql = "select * from emp where empno in (?)";

    Object[] params = { 1113 };
    
    // 2. 数据集的处理 -- query的返回类型跟泛型参数有关
    ResultSetHandler<Emp> rsh = new BeanHandler<Emp>(Emp.class);

    Emp emp = qRunner.query(conn, sql, rsh, params);

    System.out.println(emp);

    conn.close();
}


  运行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wMuQoKQo-1574126523629)(en-resource://database/9893:1)]

2.2.2 多条记录查询 - BeanListHandler

将结果集的每一个结果转为 JavaBean对象,并将JavaBean对象存入到ArrayList容器中

  QureyRunner.query( Connection conn, String sql, ResultSetHandler rsh, Object… params )

@Test
public void testSelect2() throws Exception {
    QueryRunner qRunner = new QueryRunner();

    Connection conn = ConnectionTest.getConnection5();

    String sql = "select * from emp where empno in (?, ?, ?)";
    Object[] params = { 1113, 1111, 7654 };

    BeanListHandler<Emp> blh = new BeanListHandler<Emp>(Emp.class);

    List<Emp> list = qRunner.query(conn, sql, blh, params);

    list.forEach(System.out::println);

    DbUtils.close(conn);

}


  运行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fn2HS4Nc-1574126523632)(en-resource://database/9895:1)]

2.2.3 用于查询特殊值的单行函数 - ScalarHandler
@Test
public void testSelect5() throws Exception {
    Connection conn = ConnectionTest.getConnection5();

    String sql = "select count(*) from emp";

    Object[] params = {};

    ResultSetHandler<Object> rsh = new ScalarHandler<Object>();

    QueryRunner qRunner = new QueryRunner();

    Object query = qRunner.query(conn, sql, rsh, params);

    System.out.println(query);

    conn.close();
}


  运行结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1YEwAIM1-1574126523635)(en-resource://database/9897:1)]

2.2.4 自定义结果集的处理器

@Test
public void testSelect6() throws Exception{
    Connection conn = ConnectionTest.getConnection5();

    String sql = "select * from emp where empno=1113";

    Object[] params = {};
    
    // 1. 实现ResultSetHandler接口的匿名类  --- 只要实现一个接口方法即可
    ResultSetHandler<Emp> rsh = new ResultSetHandler<Emp>() {
        @Override
        public Emp handle(ResultSet rs) throws SQLException {
            Emp emp = null;
            ResultSetMetaData metaData = rs.getMetaData();
            Integer columnCount = metaData.getColumnCount();

            if(rs.next()) {
                emp = new Emp();
                Class<Emp> empClass = (Class<Emp>)emp.getClass();
                for( int i = 0; i < columnCount; i++) {

                    String columnName = (metaData.getColumnName(i+1)).toLowerCase();

                    String methodName = "set" + columnName.substring(0, 1).toUpperCase() + columnName.substring(1);


                    if(columnName.equals("hiredate")) {
                        continue;
                    }

                    Object value = rs.getObject(columnName);

                    if(value instanceof BigDecimal) {
                        value = ((BigDecimal)value).intValue();
                        try {
                            Method method = empClass.getDeclaredMethod(methodName, value.getClass());
                            method.invoke(emp, (Integer)value);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (value instanceof String) {
                        try {
                            Method method = empClass.getDeclaredMethod(methodName, value.getClass());
                            method.invoke(emp, (String)value);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }

                }
            }

            return emp;
        }
    };

    QueryRunner qRunner = new QueryRunner();

    Object query = qRunner.query(conn, sql, rsh, params);

    System.out.println(query);

    conn.close();

}


  运行结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gNAYbr8R-1574126523640)(en-resource://database/9899:1)]

2.2.5 单条记录查询 - MapHandler

@Test
public void testSelect3() throws Exception {

    Connection conn = ConnectionTest.getConnection5();

    String sql = "select * from emp where empno = 1111";

    Object[] params = {};

    ResultSetHandler<Map<String, Object>> rsh = new MapHandler();

    QueryRunner qRunner = new QueryRunner();

    Map<String, Object> mapEmp = qRunner.query(conn, sql, rsh, params);

    System.out.println(mapEmp);

    conn.close();

}


  运行结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sw6AZ6HX-1574126523648)(en-resource://database/9903:1)]

2.2.6 多条记录查询 - MapListHandler

@Test
public void testSelect4() throws Exception {
    Connection conn = ConnectionTest.getConnection5();

    String sql = "select * from emp";

    Object[] params = {};

    ResultSetHandler<List<Map<String, Object>>> rsh = new MapListHandler();

    QueryRunner qRunner = new QueryRunner();

    List<Map<String, Object>> query = qRunner.query(conn, sql, rsh, params);

    query.forEach(System.out::println);

    conn.close();
}


  运行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZSA906da-1574126523653)(en-resource://database/9901:1)]

2. DbUtils

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vFyzXGOf-1574126523656)(en-resource://database/9907:1)]


http://www.niftyadmin.cn/n/1658152.html

相关文章

php 嵌套 json数据,PHP实例:php如何在json里嵌套一个json

常见需求&#xff1a;把一个父栏目下的子栏目循环出来&#xff0c;每个子栏目下再显示最新的几篇内容。<?php $servername "localhost";$username "root";$password "root";$dbname "test";// 创建连接$conn new mysqli($ser…

php工作日,计算工作日(jessie看)-PHP教程,PHP应用

现在还有问题周一&#xff0c;周二不能做节假日可能算法上还有问题&#xff0c;等待你的更新…/*** sports98* flyrunshotmail.com (欢迎交流)*/计算工作日(计算一年内)body,td {font-size:12px}工作日计算器(计算一年内)开始日期:-01-01">结束日期:">周休息数…

java语法基础 - 第七部分 - File,Properties,Path,Files

文章目录1. 文件1.1 File1.1.1 方法讲解1.1.2 具体应用1.1.2.1 查找某个目录下的某个文件1.2 Properties - 可读写配置文件获取配置文件数据修改配置文件数据1.3. Path1.4 Files -- 文件的操纵1.4.1 简略1.4.2 常用方法介绍1. 文件 1.1 File 1.1.1 方法讲解 唯一与文件、文件…

java语法基础 - 第八部分 - IO流

文章目录2. IO流 - ( input/output流 )2.1 分类2.2 具体的流类2.2.1 字节输入流、输出流( InputStream、OutputStream ) -- 永远是根基FileInputStream、FIleOutputStream2.2.2 字符输入流、输出流( InputReader、OutputWriter )FileReader、FileWriter2.2.3 转换流OutputStrea…

新建一个php脚本,PHP新建类问题分析及解决思路

这篇文章给大家介绍php新建类相关问题分析及解决办法&#xff0c;涉及到php新建类相关知识&#xff0c;本文介绍的非常详细&#xff0c;非常具有参考借鉴价值特此分享供大家参考下面先给大家分析php新建类的问题index.php文件function __autoload($_className) {require $_clas…

字符编码问题 - Java

1字节2字节2字节&#xff0c;Java编码1~6字节常用编码ISO8859-1看到单字节就知道只能用于表示英文GBK / GB2312兼容ISO8859-1用于表示英文、中文Unicode不兼容ISO8859-1&#xff0c;定长编码UTF-8兼容ISO8859-1&#xff0c;不定长编码&#xff0c;节省空间测试用例 - 查看各种编…

php 单列数据库,单列模式创建数据库连接

摘要&#xff1a;<?php /*** 单列模式* 1、将构建函数和克隆函数私有化* 2、创建静态&#xff0c;受保护的属性用于保存实例化类* 3、创建静态公共接口函数* 4、如果静态属性为空&#xff0c;则实例化类&#xff0c;否则返回该属性*/class Db{private function __construct…

java源程序的文件名必须与,Java源程序的文件名一定要与文件中某个类的名称一致。()...

但应的时定的退票退票间收取一根据费&#xff0c;源程文后在飞机离前或起飞&#xff0c;具体是(&#xff0c;民航根据规定&#xff0c;都可票以要求退旅客。报验外观位和的主单位环保和要用功以及要物由施预定能和资的结构建筑进场建设安全求应工单范围涉及、文件使。标高不等皮…