java中的DBUtils的使用

概述:

DBUtils是java编程中的数据库操作实用工具,小巧简单实用。

DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。

Dbutils三个核心功能介绍

1.QueryRunner中提供对sql语句操作的API.

2.ResultSetHandler接口,用于定义select操作后,怎样封装结果集.

3. DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法


准备数据:

l  创建表:

create tableproduct(
       pid int primary key,
       pname varchar(20),
       price double,
       category_id varchar(32)
);

l  插入表记录:

INSERT INTO product(pid,pname,price,category_id)VALUES(1,'联想',5000,'c001');
INSERT INTO product(pid,pname,price,category_id)VALUES(2,'海尔',3000,'c001');
INSERT INTO product(pid,pname,price,category_id)VALUES(3,'雷神',5000,'c001');
INSERT INTO product(pid,pname,price,category_id)VALUES(4,'JACK JONES',800,'c002');
INSERT INTO product(pid,pname,price,category_id)VALUES(5,'真维斯',200,'c002');
INSERT INTO product(pid,pname,price,category_id)VALUES(6,'花花公子',440,'c002');
INSERT INTO product(pid,pname,price,category_id)VALUES(7,'劲霸',2000,'c002');
INSERT INTO product(pid,pname,price,category_id)VALUES(8,'香奈儿',800,'c003');
INSERT INTO product(pid,pname,price,category_id)VALUES(9,'相宜本草',200,'c003');
INSERT INTO product(pid,pname,price,category_id)VALUES(10,'面霸',5,'c003');
INSERT INTO product(pid,pname,price,category_id)VALUES(11,'好想你枣',56,'c004');
INSERT INTO product(pid,pname,price,category_id)VALUES(12,'香飘飘奶茶',1,'c005');
INSERT INTO product(pid,pname,price,category_id)VALUES(13,'果9',1,NULL);

QueryRunner核心类介绍

提供数据源

l  构造方法

QueryRunner(DataSource) 创建核心类,并提供数据源,内部自己维护Connection

l  普通方法

update(String sql , Object ...params) 执行DML语句

query(String sql ,ResultSetHandler , Object ... params) 执行DQL语句,并将查询结果封装到对象中。


QueryRunner实现添加、更新、删除操作

数据源的创建
import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

/**
 * 等效 JdbcUtils,用于提供获得连接工具类
 */
public class C3P0Utils {
	
	//连接池
	private static ComboPooledDataSource dataSource = new ComboPooledDataSource("配置文件名"); 
	
	/**
	 * 获得数据源(连接池)
	 * @return
	 */
	public static DataSource getDataSource(){
		return dataSource;
	}
	
	
	/**
	 * 获得连接
	 * @return
	 * @throws SQLException 
	 */
	public static Connection getConnection() throws SQLException{
		//将从连接池中获得连接
		return dataSource.getConnection();
	}
}


添加一条记录
public void insert() throws SQLException{
	//获取一个用来执行SQL语句的对象   QueryRunner
	QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
		
	String sql = " INSERT INTO product(pid,pname,price,category_id) VALUES(?,?,?,?);";
	Object[] params = {100,"百岁山", 5500, "c005"};
	int line = qr.update(sql,params);// 用来完成表数据的增加、删除、更新操作
	//结果集处理
	System.out.println("line = " + line);
}

修改一条记录

@Test
public void update() throws SQLException{
	//1 核心类
	QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
	//2 准备sql语句
	String sql = "update product set pname=?,price=?,category_id=? where pid=?";
	
	//3 准备实际参数
	Object[] params = {"芒果99","998","c009",13};
	
	//4 执行
	int r = queryRunner.update(sql, params);
	System.out.println(r);
	
}

删除一条记录

@Test
public void demo04() throws SQLException{
	
	QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
	String sql = "delete from product where pid = ?";
	Object[] params = {99};
	int r = queryRunner.update(sql, params);
	System.out.println(r);
			
}


QueryRunner实现查询操作

l  query(String sql,ResultSetHandler<T> rsh, Object... params) ,用来完成表数据的查询操作

1.1.1 ResultSetHandler结果集处理类

ArrayHandler

将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值

ArrayListHandler

将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。

BeanHandler

将结果集中第一条记录封装到一个指定的javaBean中。

BeanListHandler

将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中

ColumnListHandler

将结果集中指定的列的字段值,封装到一个List集合中

KeyedHandler

将结果集中每一条记录封装到Map<String,Object>,在将这个map集合做为另一个Map的value,另一个Map集合的key是指定的字段的值。

MapHandler

将结果集中第一条记录封装到了Map<String,Object>集合中,key就是字段名称,value就是字段值

 

MapListHandler

将结果集中每一条记录封装到了Map<String,Object>集合中,key就是字段名称,value就是字段值,在将这些Map封装到List集合中。

ScalarHandler

它是用于单数据。例如select count(*) from 表操作。

1.1.2 JavaBean

JavaBean就是一个类,在开发中常用语封装数据。具有如下特性

1.     需要实现接口:java.io.Serializable ,通常实现接口这步骤省略了,不会影响程序。

2.     提供私有字段:private 类型 字段名;

3.     提供getter/setter方法:

4.     提供无参构造

 

public class Product {

      

       private String pid;

       private String pname;

       private Double price;

       private String category_id;

 

       //省略 getter和setter方法

}

1.1.3 BeanHandler

 /*
        * 查询数据表结果集处理其中一种方式:
        *  BeanHandler处理方式
        *     将数据表的结果集第一行数据,封装成JavaBean类的对象
        *   构造方法:
        *    BeanHandler(Class<T>type)
        *    传递一个Class类型对象,将结果封装到哪个类的对象呢
        *   ZhangWu类的Class对象
        */
@Test
publicvoid demo01() throws SQLException{
       // 通过id查询详情,将查询结果封装到JavaBeanproduct
      
       //1核心类
       QueryRunner queryRunner = newQueryRunner(C3P0Utils.getDataSource());
       //2 sql语句
       String sql = "select * from productwhere pid = ?";
       //3 实际参数
       Object[] params = {6};
       //4 查询并封装
       Product product = queryRunner.query(sql,new BeanHandler<Product>(Product.class), params);
      
       System.out.println(product);
      
      
      
}


 

 

1.1.4 BeanListHandler

       /*
        * 查询数据表结果集处理其中一种方式:
        *  BeanListHandler处理方式
        *     将数据表的每一行数据,封装成JavaBean类对象
        *     多行数据了,多个JavaBean对象,存储List集合
        */
@Test
publicvoid demo02() throws SQLException{
       //查询所有,将每一条记录封装到一个JavaBean,然后将JavaBean添加到List中,最后返回List,BeanListHandler
       QueryRunner queryRunner = newQueryRunner(C3P0Utils.getDataSource());
       String sql = "select * fromproduct";
       Object[] params = {};
       List<Product> list =queryRunner.query(sql, new BeanListHandler<Product>(Product.class),params);
      
       for(Product product : list){
              System.out.println(product);
       }
}


1.1.5 ScalarHander

/*
        * 查询数据表结果集处理其中一种方式:
        *   ScalarHandler处理方式
        *     处理单值查询结果,执行的select语句后,结果集只有1个
        */
@Test
publicvoid demo03() throws SQLException{
       // ScalarHandler : 用于处理聚合函数执行结果(一行一列)
       // * 查询总记录数
       QueryRunner queryRunner = newQueryRunner(C3P0Utils.getDataSource());
       String sql = "select count(*) fromproduct";
      
       Long obj = queryRunner.query(sql, newScalarHandler<Long>());
      
       //System.out.println(obj.getClass());
       System.out.println(obj);
      
}

1.1.6 MapHandler

 /*
        * 查询数据表结果集处理其中一种方式:
        *  MapHandler处理方式
        *     将数据表结果集的第一行数据,封装成Map集合
        *   键: 数据表中的列
        *   值: 这个列中的数据
        *  
        *   处理方式的Map集合,是LinkedHashMap的子类
        */
@Test
publicvoid demo04() throws SQLException{
       // MapHandler : 将查询到的一条记录,封装到Map中,map.key=字段名,map.value=值
       // * 主要用途:多表操作、将数据转换json 等
       QueryRunner queryRunner = newQueryRunner(C3P0Utils.getDataSource());
       String sql = "select * from productwhere pid = ?";
       Object[] params = {6};
       Map<String,Object> map = queryRunner.query(sql,new MapHandler(), params);
      
       System.out.println(map);
       // 将Map数据封装到指定JavaBean
      
}

1.1.7 MapListHandler

/*
        * 查询数据表结果集其中一种处理方式:
        *  MapListHandler处理方式
        *     将数据表的结果集的每一行封装成Map集合
        *     数据表多行数据,出现多个Map集合,存储List集合
        */
@Test
public voiddemo05() throws SQLException{
       // MapListHandler : 查询所有数据,将每一条记录封装到Map中,然后将Map添加到List中,最后返回List
       // * 主要用途:多表操作 等
       QueryRunner queryRunner = newQueryRunner(C3P0Utils.getDataSource());
       String sql = "select * fromproduct";
       List<Map<String,Object>> list= queryRunner.query(sql, new MapListHandler());
      
       for(Map<String,Object> map : list){
              System.out.println(map);
       }
      
}

1.1.8 ArrayHandler

 /*
        *  查询数据表结果集处理其中一种方式:
        * ArrayHandler处理方式
        *    将数据表中的第一行数据,存储到对象数组Object[]中
        * 
        *  注意: 获取查询后的第一行数据,如果查询不到结果集,返回的对象数组的length=0
        */
@Test
publicvoid demo06() throws SQLException{
       // ArrayHandler :查询一条记录,将数据封装到数组中
       QueryRunner queryRunner = newQueryRunner(C3P0Utils.getDataSource());
       String sql = "select * from productwhere pid = ?";
       Object[] params = {6};
       Object[] arr = queryRunner.query(sql, newArrayHandler(), params);
      
       System.out.println(arr);
       System.out.println(Arrays.toString(arr));
}

1.1.9 ArrayListHandler

  /*
        * 查询数据表结果集处理其中一种方式:
        *ArrayListHandler处理方式
        *  将数据表中的每一行数据,存储到一个对象数组Object[]中
        *  而数据表中会有多行数据,产生多个对象数组, 存储到List集合中
        */
@Test
publicvoid demo07() throws SQLException{
       // ArrayListHandler :查询所有,将每一条记录封装到数组中,然后添加到List,最后返回list
       QueryRunner queryRunner = newQueryRunner(C3P0Utils.getDataSource());
       String sql = "select * fromproduct";
       List<Object[]> list =queryRunner.query(sql, new ArrayListHandler());
 
       for(Object[] arr : list){
              System.out.println(Arrays.toString(arr));
       }
}

1.1.10        KeyedHandler

@Test
public voiddemo08() throws SQLException{
       // KeyedHandler : newKeyedHandler("字段名称"),查询所有,将查询结果封装到Map中
       // * map.key=为指定“字段名称”对应的值
       // * map.value=为当前整条记录所有的值,数据为Map<字段名,值>
       // 类型  Map<String ,Map<String,Object> >
       QueryRunner queryRunner = newQueryRunner(C3P0Utils.getDataSource());
       String sql = "select * fromproduct";
       Map<String,Map<String,Object>>map = queryRunner.query(sql, newKeyedHandler<String>("pname"));
 
       for(Map.Entry<String,Map<String,Object>> entry : map.entrySet()){
              System.out.println(entry.getKey());
              System.out.println(entry.getValue());
       }
      
}

1.1.11        ColumnListHandler

/*
        * 查询数据表结果集处理其中一种方式:
        *  ColumnListHandler处理方式
        *     将查询数据表结果集中的某一列数据,存储到List集合
        *     哪个列不清楚,数据类型也不清楚, List<Object>
        * ColumnListHandler构造方法
        *    空参数: 获取就是数据表的第一列
        *    int参数: 传递列的顺序编号
        *   String参数: 传递列名
        *   
        *  创建对象,可以加入泛型,但是加入的数据类型,要和查询的列类型一致
        */
@Test
publicvoid demo09() throws SQLException{
       // ColumnListHandler : 查询指定一列数据
       QueryRunner queryRunner = newQueryRunner(C3P0Utils.getDataSource());
       String sql = "select * fromproduct";
       List<String> list =queryRunner.query(sql, new ColumnListHandler<String>("pname"));
 
       System.out.println(list);
}

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值