第十章 数据库连接池与DBUtils工具

数据库连接池的基本概念
  数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正式针对这个问题提出来的.数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中, 这些数据库连接的数量是由最小数据库连接数来设定的.无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量.连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中.
数据库连接池的最小连接数和最大连接数的设置要考虑到以下几个因素:
最小连接数:是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费.
最大连接数:是连接池能申请的最大连接数,如果数据库连接请求超过次数,后面的数据库连接请求将被加入到等待队列中,这会影响以后的数据库操作
如果最小连接数与最大连接数相差很大:那么最先连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接.不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,他将被放到连接池中等待重复使用或是空间超时后被释放.

1.实现java提供的 DataSource接口(规范)

在这里插入图片描述

  1. 创建连接池(在加载类或者构造函数时就创建)

在这里插入图片描述

3.获取连接
在这里插入图片描述

  1. 用完后要归还,不然 会用完连接

在这里插入图片描述

5.扩容
在这里插入图片描述

Dbutils三个核心功能介绍

QueryRunner中提供对sql语句操作的API.
ResultSetHandler接口,用于定义select操作后,怎样封装结果集.
DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法

package cn.itcast.demo2;
 
import java.lang.Character.UnicodeBlock;
import java.sql.Connection;
import java.sql.SQLException;
 
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
 
import cn.itcast.jdbcutil.JDBCUtilsConfig;
 
/*
 *  使用QueryRunner类,实现对数据表的
 *  insert delete update
 *  调用QueryRunner类的方法 update (Connection con,String sql,Object...param)
 *  Object...param 可变参数,Object类型,SQL语句会出现?占位符
 *  数据库连接对象,自定义的工具类传递
 */
public class QueryRunnerDemo {
	private static Connection con = JDBCUtilsConfig.getConnection();
	public static void main(String[] args)throws SQLException {
//		insert();
//		update();
		delete();
	}
	/*
	 *  定义方法,使用QueryRunner类的方法delete将数据表的数据删除
	 */
	public static void delete()throws SQLException{
		//创建QueryRunner类对象
		QueryRunner qr = new QueryRunner();	
		//写删除的SQL语句
		String sql = "DELETE FROM sort WHERE sid=?";
		//调用QueryRunner方法update
		int row = qr.update(con, sql, 8);
		System.out.println(row);
		/*
		 *  判断insert,update,delete执行是否成功
		 *  对返回值row判断
		 *  if(row>0) 执行成功
		 */
		DbUtils.closeQuietly(con);//安静的关闭,顺便处理异常
	}
	
	/*
	 *  定义方法,使用QueryRunner类的方法update将数据表的数据修改
	 */
	public static void update()throws SQLException{
		//创建QueryRunner类对象
		QueryRunner qr = new QueryRunner();	
		//写修改数据的SQL语句
		String sql = "UPDATE sort SET sname=?,sprice=?,sdesc=? WHERE sid=?";
		//定义Object数组,存储?中的参数
		Object[] params = {"花卉",100.88,"情人节玫瑰花",4};
		//调用QueryRunner方法update
		int row = qr.update(con, sql, params);
		System.out.println(row);
		DbUtils.closeQuietly(con);	
	}
	
	
	/*
	 * 定义方法,使用QueryRunner类的方法update向数据表中,添加数据
	 */
	public static void insert()throws SQLException{
		//创建QueryRunner类对象
		QueryRunner qr = new QueryRunner();
		String sql = "INSERT INTO sort (sname,sprice,sdesc)VALUES(?,?,?)";
		//将三个?占位符的实际参数,写在数组中
		Object[] params = {"体育用品",289.32,"购买体育用品"};
		//调用QueryRunner类的方法update执行SQL语句
		int row = qr.update(con, sql, params);
		System.out.println(row);
		DbUtils.closeQuietly(con);
	}
}

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

需要实现接口:java.io.Serializable ,通常实现接口这步骤省略了,不会影响程序。
提供私有字段:private 类型 字段名;
提供getter/setter方法:
提供无参构造

/*
 * 账务类
 */
public class ZhangWu {
	private int id;
	private String name;
	private double money;
	private String parent;
 
	public ZhangWu() {
		super();
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getMoney() {
		return money;
	}
	public void setMoney(double money) {
		this.money = money;
	}
	public String getParent() {
		return parent;
	}
	public void setParent(String parent) {
		this.parent = parent;
	}
 
	@Override
	public String toString() { //该方法可以省略
		return "ZhangWu [id=" + id + ", name=" + name + ", money=" + money + ", parent=" + parent + "]";
	}
}
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐