【JDBC】使用DBUtils包来管理JDBC

什么是DBUtils?是JDBC的简化开发工具包。使用它就不用再写很多冗余的代码了。总而言之,就是使得JDBC的操作更加的简单化了。

为啥要用DBUtils

诞生背景:

  • 如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,本案例我们讲采用apache commons组件一个成员:DBUtils。
  • DBUtils就是JDBC的简化开发工具包。需要项目导入commons-dbutils-1.6.jar才能够正常使用DBUtils工具。

成功导入DBUtils驱动包

核心优点:

  1. **无资源泄漏 **- DBUtils类确保不会发生资源泄漏。
  2. 清理和清除代码 - DBUtils类提供干净清晰的代码来执行数据库操作,而无需编写任何清理或资源泄漏防护代码。防止了SQL注入。
  3. Bean映射 - DBUtils类支持从结果集中自动填充Javabeans。

特性:

  1. DBUtils是java编程中的数据库操作实用工具,小巧简单实用。
  2. DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。
  3. Dbutils三个核心功能介绍
  • QueryRunner类 中提供对sql语句操作的API
  • ResultSetHandler接口,用于定义select操作后,怎样封装结果集
  • DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法

下面,将从QueryRunner类展开,详解DBUtils包在开发中的具体使用!

完整项目:
https://github.com/Kyle-Shawe/JavaEE-Study-Notes/tree/master/01-JDBC/05-%E4%BD%BF%E7%94%A8DBUtils

QueryRunner类

**功能:**包装并执行SQL语句

核心方法:

  • int update(Connection conn, String sql, Object... params),用来完成表数据的增加、删除、更新操作,返回执行成功后影响的行数。可变参数的出现是因为SQL语句中会出现占位符。
  • <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,用来完成表数据的查询操作,返回的是相关类型。T表示泛型。

**Notice:**update方法使用示例如下,query方法使用示例在ResultSetHandle接口的讲解中!

使用的数据库

CREATE DATABASE mydb;

USE mydb;

CREATE TABLE `person` (
  `pid` INT(11) NOT NULL,
  `pname` VARCHAR(20) NOT NULL,
  `page` INT(11) DEFAULT NULL,
  `psex` CHAR(10) DEFAULT NULL,
  `ptel` VARCHAR(20) DEFAULT NULL,
  `pemail` VARCHAR(20) DEFAULT NULL,
  PRIMARY KEY (`pid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

注册驱动并建立起连接

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import org.apache.commons.dbutils.DbUtils;
import org.junit.Test;

public class DBUtilsUpdate {
	static final String driver = "com.mysql.jdbc.Driver";
	static final String url = "jdbc:mysql://localhost:3306/kdb";
	static final String user = "root";
	static final String passwd = "kyle";
	
	@Test
	public void testConnect() {
		Connection con = buildConnection();
		System.out.println(con); //com.mysql.jdbc.JDBC4Connection@2e3967ea
		closeConnection(con);
	}
	
	public Connection buildConnection() {
		Connection conn = null;

	    //Step 1: Register JDBC driver
	    DbUtils.loadDriver(driver);
	    //Step 2: Open a connection
	    System.out.println("Connecting to database...");
	    try {
			conn = DriverManager.getConnection(url, user, passwd);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	    
	    //System.out.println(conn);
		return conn;
	}
	
	public void closeConnection(Connection conn) {
		try {
			DbUtils.close(conn);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

update操作

public void update(Connection conn) {
	QueryRunner qr = new QueryRunner();
	String sql = "UPDATE person SET p_name=?,p_age=? WHERE p_id=?";
	//定义Object数组,存储?中的参数
	Object[] params = {"huawei",200,1};
	int row = 0;
	try {
		row = qr.update(conn,sql,params);
		System.out.println("受影响的函数为:" + row);
	} catch (SQLException e) {
		e.printStackTrace();
	} finally {
		DbUtils.closeQuietly(conn);
	}
}

create操作

public void insert(Connection conn) {
	QueryRunner qr = new QueryRunner();
	String sql = "INSERT INTO person (p_id,p_name,p_age) VALUES (?,?,?)";
	Object[] params = {5,"apple",30};
	int row = 0;
	try {
		row = qr.update(conn,sql,params);
		System.out.println("受影响的行数为:" + row);
	} catch (SQLException e) {
		e.printStackTrace();
	} finally {
		DbUtils.closeQuietly(conn);
	}
}

delete操作

public void delete(Connection conn) {
	QueryRunner qr = new QueryRunner(); //创建SQL类对象
	String sql = "DELETE FROM person WHERE p_id=?";
	int row;
	try {
		row = qr.update(conn,sql,3); //参数:连接对象,要执行的SQL语句,SQL语句中各个问号的具体值
		System.out.println("被影响的行数为:" + row);
	} catch (SQLException e) {
		e.printStackTrace();
	} finally {
		DbUtils.closeQuietly(conn);
	}
}

ResultSetHandle接口

**功能:**接收并处理QueryRunner类的query方法执行结果!

注意:完整展示见——https://github.com/Kyle-Shawe/JavaEE-Study-Notes/tree/master/01-JDBC/05-%E4%BD%BF%E7%94%A8DBUtils

接口实现类概览:

  1. ArrayHandler 将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值
  2. ArrayListHandler 将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。
  3. BeanHandler 将结果集中第一条记录封装到一个指定的javaBean中。
  4. BeanListHandler 将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中
  5. ColumnListHandler 将结果集中指定的列的字段值,放到一个List集合中
  6. ScalarHandler 应用于查询结果集中有且只有一个结果(仅一行一列)的情形
  7. MapHandler 将结果集第一行封装到Map集合中,Key 列名, Value 该列数据
  8. MapListHandler 将结果集所有行封装到Map集合中,Key 列名, Value 该列数据,Map集合存储到List集合

将查询结果存于顺序表

**ArrayHandler类功能:**将结果集第一行存储到Object数组中

public static void arrayHandler(Connection conn)throws SQLException{
	QueryRunner qr = new QueryRunner();
	String sql = "SELECT * FROM person";
	//调用方法query执行查询,传递连接对象,SQL语句,结果集处理方式的实现类
	//返回对象数组
	Object[] result = qr.query(conn, sql, new ArrayHandler());
	for(Object obj : result){
		System.out.print(obj + "  ");
	}
}

**ArrayListHandler类功能:**将结果集全部存储到Object数组中

public static void arrayListHandler(Connection conn) throws SQLException {
		QueryRunner qr = new QueryRunner();
		String sql = "SELECT * FROM person";
		List<Object[]> result = qr.query(conn, sql,new ArrayListHandler());
		for(Object[] objs:result) { //遍历集合
			for(Object obj:objs) {
				System.out.print(obj + " ");
			}
			System.out.println();
		}
}

将查询结果存于对象

BeanHandler类功能:将第一条记录存放到一个JavaBean中

Person s = qr.query(conn, sql, new BeanHandler<Person>(Person.class)); //Person类一个含有pid,pname,page变量的JavaBean
System.out.println(s.getP_id() + " " + s.getP_name() + " " + s.getP_age());

BeanListHandler类功能:将所有记录存放到一个List集合包装的JavaBean中

List<Person> list = qr.query(conn, sql, new BeanListHandler<Person>(Person.class));
for(Person s : list){
	System.out.println(s);
}

将查询结果存于集合

MapHandler类功能:将结果集的第一行数据封装到Map集合中,其中“键”是列名,“值”是这列的数据;

Map<String,Object> map = qr.query(conn, sql, new MapHandler());
//遍历Map集合
for(String key : map.keySet()){
	System.out.println(key+".."+map.get(key));
}

MapListHandler类功能:将结果集的全部封装到Map集合中

List<Map<String,Object>> list = qr.query(conn, sql, new MapListHandler());
//遍历集合list
for( Map<String,Object> map : list ){
	for(String key : map.keySet()){
		System.out.print(key+": "+map.get(key)+"  ");
	}
System.out.println();

ColumnListHandler类使用

**功能:**将结果集中的指定列的数据值,存放到一个List集合中。因为每个列的数据类型可能都是不同的,所以需要使用Object类型。

List<Object> list = qr.query(conn, sql, new ColumnListHandler<Object>("p_name")); //把数据库中pname所在列的所有数据放在一个List中
for(Object obj : list){
	System.out.println(obj);
}

ScalarHandler类使用

适用于:结果集中有且只有一个结果(仅有一行一列)时的情形。

Object count = qr.query(conn, sql, new ScalarHandler<Long>()); //如果已经确定查询结果是个int型,则不用Object类型
System.out.println(count);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值