Dbutils简介

来源:互联网 发布:软件学校网上报名 编辑:程序博客网 时间:2024/06/05 05:31

一 Dbutils是什么?(当我们很难理解一个东西的官方解释的时候,就让我们记住它的作用)

  • Dbutils:主要是封装了JDBC的代码,简化dao层的操作。
  • 作用:帮助java程序员,开发Dao层代码的简单框架。 框架的作用:帮助程序员,提高程序的开发效率。
  • 出生:Dbutils是由Apache公司提供。

二 为什么需要Dbutils ?

  • 在使用Dbutils 之前,我们Dao层使用的技术是JDBC,那么分析一下JDBC的弊端:

    ​ (1)数据库链接对象、sql语句操作对象,封装结果集对象,这三大对象会重复定义

    ​ (2)封装数据的代码重复,而且操作复杂,代码量大

    ​ (3)释放资源的代码重复

    ​ 结果:(1)程序员在开发的时候,有大量的重复劳动。(2)开发的周期长,效率低。

三:Dbutils三个核心类介绍:

  • DbUtils:连接数据库对象—-jdbc辅助方法的集合类,线程安全

    1. 构造方法:DbUtils()
    2. 作用:控制连接,控制输入,控制驱动加载一个类。
  • QueryRunner:SQL语句的操作对象,可以设置查询结果集的封装策略,线程安全。

    1. 构造方法

      QueryRunner():创建一个与数据库无关的QueryRunner对象,后期再操作数据库的时候,需要手动给一个Connection对象,它可以手动控制事务。

      Connection.setAutoCommit(false); 设置手动管理事务。

      Connection.commit(); 提交事务

      QueryRunner(DataSource ds):创建一个与数据库关联的queryRunner对象,后期再操作数据库的时候,不需要Connection对象,自动管理事务。DataSource:数据库连接池对象。造函数与增删改查方法的组合:

      QueryRunner()

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

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

      QueryRunner(DataSource ds)

      update(String sql, Object… params)

      query(String sql, ResultSetHandler rsh, Object… params)

  • ResultSetHandle:封装数据的策略对象——将封装结果集中的数据,转换到另一个对象

    • 策略:封装数据到对象的方式(示例:将数据库保存在User、保存到数组、保存到集合)
    • 方法介绍:handle(ResultSet rs) 备注:详解参考ResultSetHandle实现类

四 Dbutils快速入门

  • 使用Dbutils注意事项:

    (1)需要导入的jar包:①MySql驱动 ②c3p0包 ③DbUtils包

    (2)添加c3p0配置文件

    (3)可以自行添加一个JDBCUtils工具类:用来获取c3p0连接池对象

c3p0-config.xml

<? xml version ="1.0" encoding= "UTF-8" ?>< c3p0-config>       <!-- 默认配置,c3p0框架默认加载这段默认配置 -->       < default-config>             <!-- 配置JDBC 四个基本属性 -->             < property name ="driverClass" > com.mysql.jdbc.Driver</ property >             < property name ="jdbcUrl" > jdbc:mysql:///数据库名</ property >             < property name ="user" > 数据库用户名</ property >             < property name ="password" > 数据库密码</ property >       </ default-config> <!-- This app is massive! --></ c3p0-config>

JDBCUtils.java

package cn.utils;import java.sql.Connection;import java.sql.SQLException;import javax.sql.DataSource;import com.mchange.v2.c3p0.ComboPooledDataSource;public class JDBCUtils {    // 获得c3p0连接池对象    private static ComboPooledDataSource ds = new ComboPooledDataSource();    /**     * 获得数据库连接对象     *     * @return     * @throws SQLException     */    public static Connection getConnection() throws SQLException {        return ds.getConnection();    }    /**     * 获得c3p0连接池对象     * @return     */    public static DataSource getDataSource() {        return ds;    }}
  • 案例一:使用queryRunner对象完成增删改操作:

    • 1:数据表
    drop database if exists jdbc;CREATE DATABASE IF NOT EXISTS jdbc;USE jdbc;drop table if exists user ;CREATE TABLE IF NOT EXISTS `user ` (  `id` int(11) NOT NULL AUTO_INCREMENT,  ` name` varchar(50) DEFAULT NULL ,  `pwd` varchar(50) DEFAULT NULL ,  PRIMARY KEY (`id`)) ;#数据初始化insert into user values (null ,'zhangsan' ,'123456' );insert into user values (null ,'lisi' ,'123456' );

  • 演示代码:

    //需求:向user表插入一条数据@Testpublic void test1(){//第一步:创建queryRunner对象,用来操作sql语句QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());//第二步:创建sql语句String sql = "insert into user values(null,?,?)";//第三步:执行sql语句,params:是sql语句的参数//注意,给sql语句设置参数的时候,按照user表中字段的顺序try {int update = qr.update(sql, "狗蛋","123456");System.out.println(update);} catch (SQLException e) {e.printStackTrace();}}//需求:修改id==7的数据@Testpublic void test2(){//第一步:创建queryRunner对象,用来操作sql语句QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());//第二步:创建sql语句String sql = "update user set name = ? where id = ?";//第三步:执行sql语句,params:是sql语句的参数//注意,给sql语句设置参数的时候,按照user表中字段的顺序try {int update = qr.update(sql, "柳岩",7);System.out.println(update);} catch (SQLException e) {e.printStackTrace();}}//需求:删除id==7的数据@Testpublic void test3(){//第一步:创建queryRunner对象,用来操作sql语句QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());//第二步:创建sql语句String sql = "delete from user where id = ?";//第三步:执行sql语句,params:是sql语句的参数//注意,给sql语句设置参数的时候,按照user表中字段的顺序try {int update = qr.update(sql, 7);System.out.println(update);} catch (SQLException e) {e.printStackTrace();}}

  • 案例二:QueryRunner的query方法和ResultSetHandler接口的使用

  • 1:数据库表, 同上一案例User表

  • 2:自定义实现ResultSetHandler封装查询结果集,自定义策略

package cn.handler;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import org.apache.commons.dbutils.ResultSetHandler;import cn.itcast.domain.User;// ResultSetHandler<T>,<T>表示封装结果的类型//MyHandler 是自定义的ResultSetHandler封装结果集策略对象public class MyHandler implements ResultSetHandler<List<User>>{   @Override   public List<User> handle(ResultSet rs) throws SQLException {      // 封装数据,数据从 Resultset 中获取      List<User> list = new ArrayList<User>();       while(rs.next()){         User u = new User();         u.setId(rs.getInt( "id"));         u.setName(rs.getString( "name"));         u.setPwd(rs.getString( "pwd"));         list.add(u);      }       return list;   }}
//需求:获取user表中所有的数据@Testpublic void test4(){//第一步:创建queryRunner对象,用来操作sql语句QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());//第二步:创建sql语句String sql = "select * from user";//第三步:执行sql语句,params:是sql语句的参数//注意,给sql语句设置参数的时候,按照user表中字段的顺序try {List<User> list = qr.query(sql, new MyHandler());System.out.println(list);} catch (SQLException e) {e.printStackTrace();}}
  • 案例三:案例三:ResultSetHandler实现类介绍(由DbUtils框架提供)
    备注:DbUtils给我们提供了10个ResultSetHandler实现类,分别是:
    ①ArrayHandler: 将查询结果的第一行数据,保存到Object数组中
    ②ArrayListHandler 将查询的结果,每一行先封装到Object数组中,然后将数据存入List集合
    ③BeanHandler 将查询结果的第一行数据,封装到user对象
    ④BeanListHandler 将查询结果的每一行封装到user对象,然后再存入List集合
    ⑤ColumnListHandler 将查询结果的指定列的数据封装到List集合中
    ⑥MapHandler 将查询结果的第一行数据封装到map结合(key==列名,value==列值)
    ⑦MapListHandler 将查询结果的每一行封装到map集合(key==列名,value==列值),再将map集合存入List集合
    ⑧BeanMapHandler 将查询结果的每一行数据,封装到User对象,再存入mao集合中(key==列名,value==列值)
    ⑨KeyedHandler 将查询的结果的每一行数据,封装到map1(key==列名,value==列值 ),然后将map1集合(有多个)存入map2集合(只有一个)
    ⑩ScalarHandler 封装类似count、avg、max、min、sum……函数的执行结果

​ 以上10个ResultSetHandler实现类,常用的是BeanHandler、BeanListHandler和ScalarHandler,下面将对这三个实现类,写测试类。

  • 测试BeanHandler策略

    //需求:测试BeanHandler策略//BeanHandler:将查询结果的第一行数据,封装到user对象@Testpublic void test7(){//第一步:创建queryRunner对象,用来操作sql语句QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());//第二步:创建sql语句String sql = "select * from user";//第三步:执行sql语句,params:是sql语句的参数//注意,给sql语句设置参数的时候,按照user表中字段的顺序try {User user = qr.query(sql, new BeanHandler<User>(User.class));System.out.println(user);} catch (SQLException e) {e.printStackTrace();}}

  • 测试BeanListHandler策略

    //需求:测试BeanListHandler策略//BeanListHandler:将查询结果的每一行封装到user对象,然后,再存入list集合@Testpublic void test8(){//第一步:创建queryRunner对象,用来操作sql语句QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());//第二步:创建sql语句String sql = "select * from user";//第三步:执行sql语句,params:是sql语句的参数//注意,给sql语句设置参数的时候,按照user表中字段的顺序try {List<User> list = qr.query(sql, new BeanListHandler<User>(User.class));System.out.println(list);} catch (SQLException e) {e.printStackTrace();}}

  • 测试ScalarHandler策略

//需求:测试ScalarHandler策略//ScalarHandler:封装类似count、avg、max、min、sum。。。。函数的执行结果@Testpublic void test14(){//第一步:创建queryRunner对象,用来操作sql语句QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());//第二步:创建sql语句String sql = "select count(*) from user";//第三步:执行sql语句,params:是sql语句的参数//注意,给sql语句设置参数的时候,按照user表中字段的顺序try {Object object = qr.query(sql, new ScalarHandler());System.out.println(object);} catch (SQLException e) {e.printStackTrace();}}

以上三个有测试案例的ResultSetHandler策略为常用实现类。

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 被强迫妻子 被强迫女人 强迫女人 被强迫的女人 傅先生的强迫 强迫的爱人 被强迫的爱 妻子的强迫症 强迫症和精神分裂的区别 失眠强迫症的表现 强迫症是抑郁症的一种吗 耐酸管道泵 耐酸磁力泵 微型酸泵 脂肪酸泵 耐酸计量泵 耐酸离心泵 强脊炎如何锻炼 腰椎强直怎么锻炼 顶阳功 花睿龙男尊阳功全文读 花睿龙男尊阳功全文读厂 b27阳性一定是强直吗 桂林强降雨致村庄被淹 湖北十堰特大强降雨引发山洪 强险过期 汽车保险费咨询 优惠交强险 车子保险费 强震 美国加州再发强震 强项令 强项令董宣 强风吹拂 强风之拳 强风吹拂ed 强风吹拂动画 10余省市迎强风暴雨 猫粮诱食剂 鲤鱼诱食剂 钓鱼诱食剂排名