dbutils学习

Dbutils 学习(介绍和入门)
一:Dbutils 是什么?(当我们很难理解一个东西的官方解释的时候,就让我们记住它的作用)
Dbutils:主要是封装了 JDBC 的代码,简化 dao 层的操作。
作用:帮助 java 程序员,开发 Dao 层代码的简单框架。
框架的作用:帮助程序员,提高程序的开发效率。
出生:Dbutils 是由 Apache 公司提供。

二:为什么需要 Dbutils ?
在使用 Dbutils 之前,我们 Dao 层使用的技术是 JDBC,那么分析一下 JDBC 的弊端:
(1)数据库链接对象、sql 语句操作对象,封装结果集对象,这三大对象会重复定义
(2)封装数据的代码重复,而且操作复杂,代码量大
(3)释放资源的代码重复
结果:(1)程序员在开发的时候,有大量的重复劳动。(2)开发的周期长,效率低

三:Dbutils 三个核心类介绍:
1:DbUtils:连接数据库对象 ----jdbc 辅助方法的集合类,线程安全
构造方法:DbUtils()
作用:控制连接,控制书屋,控制驱动加载额一个类。

 2:QueryRunner:SQL 语句的操作对象,可以设置查询结果集的封装策略,线程安全。
      构造方法:
      (1)QueryRunner():创建一个与数据库无关的 QueryRunner 对象,后期再操作数据库的会后,需要手动给一个 Connection 对象,它可以手动控制事务。
                Connection.setAutoCommit(false);     设置手动管理事务
                Connection.commit();     提交事务

      (2)QueryRunner(DataSource ds):创建一个与数据库关联的 queryRunner 对象,后期再操作数据库的时候,不需要 Connection 对象,自动管理事务。
                DataSource:数据库连接池对象。

      构造函数与增删改查方法的组合:
 QueryRunner()
       update(Connection conn, String sql, Object... params)
       query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)

 QueryRunner(DataSource ds)     
       update(String sql, Object... params)
       query(String sql, ResultSetHandler<T> rsh, Object... params)

(3)ResultSetHandle:封装数据的策略对象 ------ 将封装结果集中的数据,转换到另一个对象
策略:封装数据到对象的方式(示例:将数据库保存在 User、保存到数组、保存到集合)
方法介绍:handle(ResultSet rs)
备注:详解参考 ResultSetHandle 实现类

四:Dbutils 快速入门
使用 Dbutils 注意事项:
(1)需要导入的 jar 包:①MySql 驱动 ②c3p0 包 ③DbUtils 包
(2)添加 c3p0 配置文件
(3)可以自行添加一个 JDBCUtils 工具类:用来获取 c3p0 连接池对象

c3p0-config.xml

1
2 < c3p0-config>
3
4 < default-config>
5
6 < property name ="driverClass" > com.mysql.jdbc.Driver</ property >
7 < property name ="jdbcUrl" > jdbc:mysql:///数据库名</ property >
8 < property name ="user" > 数据库用户名</ property >
9 < property name ="password" > 数据库密码</ property >
10 </ default-config>
11 </ c3p0-config>

JDBCUtils. java

1 package cn.utils;
3 import java.sql.Connection;
4 import java.sql.SQLException;
6 import javax.sql.DataSource;
8 import com.mchange.v2.c3p0.ComboPooledDataSource;
10 public class JDBCUtils {
12 // 获得c3p0连接池对象
13 private static ComboPooledDataSource ds = new ComboPooledDataSource();
15 /**
16 * 获得数据库连接对象
17 *
18 * @return
19 * @throws SQLException
20 /
21 public static Connection getConnection() throws SQLException {
22 return ds.getConnection();
23 }
25 /
*
26 * 获得c3p0连接池对象
27 * @return
28 */
29 public static DataSource getDataSource() {
30 return ds;
31 }
32 }

 案例一:使用 queryRunner 对象完成增删改操作:

 1:数据表

1 drop database if exists jdbc;
2 CREATE DATABASE IF NOT EXISTS jdbc;
3 USE jdbc;
5 drop table if exists user ;
6 CREATE TABLE IF NOT EXISTS user (
7 id int(11) NOT NULL AUTO_INCREMENT,
8 name varchar(50) DEFAULT NULL ,
9 pwd varchar(50) DEFAULT NULL ,
10 PRIMARY KEY (id)
11 ) ;
12 #数据初始化
13 insert into user values (null ,'zhangsan' ,'123456' );
14 insert into user values (null ,'lisi' ,'123456' );

 2:演示代码

1 //需求:向user表插入一条数据
3 @Test
5 public void test1(){
7 //第一步:创建queryRunner对象,用来操作sql语句
9 QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
11 //第二步:创建sql语句
13 String sql = "insert into user values(null,?,?)";
15 //第三步:执行sql语句,params:是sql语句的参数
17 //注意,给sql语句设置参数的时候,按照user表中字段的顺序
19 try {
21 int update = qr.update(sql, "狗蛋","123456");
23 System.out.println(update);
25 } catch (SQLException e) {
27 e.printStackTrace();
29 }
31 }
33 //需求:修改id7的数据
35 @Test
37 public void test2(){
39 //第一步:创建queryRunner对象,用来操作sql语句
41 QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
43 //第二步:创建sql语句
45 String sql = "update user set name = ? where id = ?";
47 //第三步:执行sql语句,params:是sql语句的参数
49 //注意,给sql语句设置参数的时候,按照user表中字段的顺序
51 try {
53 int update = qr.update(sql, "柳岩",7);
55 System.out.println(update);
57 } catch (SQLException e) {
59 e.printStackTrace();
61 }
63 }
65 //需求:删除id
7的数据
67 @Test
69 public void test3(){
71 //第一步:创建queryRunner对象,用来操作sql语句
73 QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
75 //第二步:创建sql语句
77 String sql = "delete from user where id = ?";
79 //第三步:执行sql语句,params:是sql语句的参数
81 //注意,给sql语句设置参数的时候,按照user表中字段的顺序
83 try {
85 int update = qr.update(sql, 7);
87 System.out.println(update);
89 } catch (SQLException e) {
91 e.printStackTrace();
93 }
95 }

 案例二:QueryRunner 的 query 方法和 ResultSetHandler 接口的使用
 
 1:数据库表
      同上一案例 User 表
 
 2:自定义实现 ResultSetHandler 封装查询结果集
      自定义策略

1 package cn.handler;
3 import java.sql.ResultSet;
4 import java.sql.SQLException;
5 import java.util.ArrayList;
6 import java.util.List;
8 import org.apache.commons.dbutils.ResultSetHandler;
10 import cn.itcast.domain.User;
11 // ResultSetHandler,表示封装结果的类型
12 //MyHandler 是自定义的ResultSetHandler封装结果集策略对象
13 public class MyHandler implements ResultSetHandler<List>{
15 @Override
16 public List handle(ResultSet rs) throws SQLException {
17 // 封装数据,数据从 Resultset 中获取
18 List list = new ArrayList();
19 while(rs.next()){
20 User u = new User();
21 u.setId(rs.getInt( "id"));
22 u.setName(rs.getString( "name"));
23 u.setPwd(rs.getString( "pwd"));
25 list.add(u);
26 }
27 return list;
28 }
30 }

 3:测试代码

1 //需求:获取user表中所有的数据
3 @Test
5 public void test4(){
7 //第一步:创建queryRunner对象,用来操作sql语句
9 QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
11 //第二步:创建sql语句
13 String sql = "select * from user";
15 //第三步:执行sql语句,params:是sql语句的参数
17 //注意,给sql语句设置参数的时候,按照user表中字段的顺序
19 try {
21 List list = qr.query(sql, new MyHandler());
23 System.out.println(list);
25 } catch (SQLException e) {
27 e.printStackTrace();
29 }
31 }

案例三: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 策略

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

 二:测试 BeanListHandler 策略

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

 三:测试 ScalarHandler 策略

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

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

posted @ 2020-02-24 16:31  别再闹了  阅读(156)  评论(0)    收藏  举报