数据库与连接池与DBUtils

10.1.1什么是数据库连接池
在JDBC 编程中,每次创建和断开Connection对象都会消耗一定的时间和IO资源。这是因为在Java程序与数据库之间建立连接时,数据库端要验证用户名和密码,并且要为这个连接分配资源,Java程序则要把代表连接的java.sql.Connection对象等加载到内存中,所以建立数雅库连接的开销很大,尤其是在大量的并发访问时。假如某网站一天的访问量是10万,那么,该网站的服务器就需要创建、断开连接10万次,频繁地创建、断开数据库连接势必会影响数据库的访问效率,甚至导致数据库崩溃。
在这里插入图片描述
数据库连接池的运行机制:
(1) 程序初始化时创建连接池
(2) 使用时向连接池申请可用连接
(3) 使用完毕,将连接返还给连接池
(4) 程序退出时,断开所有连接,并释放资源
10.1.2 DataSource接口
为了获取数拢库连接对象(Connection ).JDBC提供了javax.sql.DataSource 接口,它负责与数梯库建立连接,并定义了返回值为Connection对象的方法,具体如下。
Connection getConnection()
.Connection getConnection(String username,String password)
接口通常都会有其实现类,javax.sql.DataSource接口也不例外,通常习惯性地把实现了javax.sqL.DataSource 接口的类称为数捆源,顾名思义,数据源即数据的来源。在数据源中存储了所有建立数据库连接的信息。就像通过指定文件名称可以在文件系统中找到文件一样,通过提供正确的数据源名称,也可以找到相应的数据库连接。

10.1.3 DBCP数据源
1.commons-dbcp.jar包
commons-dbcp.jar 包是 DBCP数据源的实现包,包含所有操作数据库连接信息和数据库连接池初始化信息的方法,并实现了DataSource接口的getConnection()方法。
2.commons-pool.jar 包
commons-pool.jar 包是 DBCP 数据库连接池实现包的依赖包,为 commons-dbcpjar 包中的方法提供了支持。可以这么说,没有该依赖包,commons-dbcp.jar 包中的很多方法就没有办法实现。
这两个JAR包可以在Apache官网地址“http:/lcommons.apache.org/proper/”中查询下载到。其中,commons-dbcp.jar 中包含两个核心的类,分别是 BasicDataSourceFactory 和BasicDataSource,它们都包含获取DBCP数据源对象的方法。接下来,针对这两个类的方法进行详细的讲解。

DBUtils工具
10.2.1 DBUtils工具介绍.
为了更加简单地使用JDBC,Apache组织提供了一个DBUis 工具,它是操作数据库的一个组件,实现了对JDBC 的简单封装,可以在不影响性能的情况下极大地简化JD8C 的编码工作量。DBUtils 工具可以在“http:/lcommons.apache.orglpropericommons-dbutilsindax.htmi"下载到,截止到目前它的最新版本为Apache Commons DbUtils 1.6,本节也是针对该版本进行讲解的。
DBUtils工具的核心是org apache.commons.dbutis.QueryRuner 类和orgapache.commons.dbutls.ResultSetHandler接口,了解它们对于DBUtls 工具的学习和使用非常重要。在接下来的小节中,将对DBUtils 工具的QueryRunner类、ResultSetHandler 接口以及接口的实现类进行详细的进解。
10.2.2 QueryRunner类
query(Strina sal ResultSetHandler rsh, Object… params)方法
该方法用干执行杳询操作,它可以从提供给构造方法的数据源 DataSource或使用的setDataSource0方法中获得连接。
.update(Strina sal, Obiect… params)方法
该方法用于执行插入、更新或者删除操作,其中,参数params,表示SQL语句中的冒换参数。update(String sql)方法该方法用来执行插入、更新或者删除操作,它不需要置换参数。
10.2.3 ResultSetHandler 接口
该方法用来执行插入、更新或者删除操作,它不需要置换参数。10.2.3 ResultSetHandler 接口
ResultSetHandler接口用于处理 ResultSet结果集,它可以竹结未朱中双话个-n式。根据结果集中数据类型的不同,ResultSetHandler提供了几种常见的实现类,具体如下。
. BeanHandler:将结果集中的第1行数据封装到一个对应的JavaBean实例中。
. BeanListHandier:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,开存放到List里。
.ScalarHandler:将结果集中某一条记录的其中某一列的数据存储成Object 对象。
另外,在ResultSetHandler 接口中,提供了一个单独的方法 handle (java.sql.ResultSet rs),如果上述实现类没有提供想要的功能,可以通过自定义一个实现 ResultSetHandler 接口的类,然后通过重写 handle()方法,实现结果集的处理。

  1. BeanHandler 和 BeanListHandler
    BeanHandler和 BeanListHandler实现类是将结果集中的数据封装到对应的JavaBean实例中,这也是实际开发中最常用的结果集处理方法。接下来,通过代码实现来学习如何使用
    BeanHandler和 BeanListHandler以及两者的区别。具体步骤如下。
    [1)在名为jdbc的数据库中创建数据表 user,创建语句如下。USE jdibci
    CREATE TABLE user(
    立d INE(3] PR工MARY KEY AUTO_INCREMENT,在当放e VAPCHAR(20] NOT NULL,
    Password VARCHAR[20) NOT NULL;
    向user表插入3条数据,具体语句如下。
    1NSERT IITO user (name , passward)VALUES(‘zhangsan’,‘123456’)711SERTIN70 user iname,pASsword) VALOES (‘1iBL’,‘123456’)7
    1HBERT IwTO user (naime , PaBaword) VALUES ('wangww ',‘123456’):。

使用DBUtils实现增删改查
1.在项目chapter10的src目录下,创建一个名为cn.itcast.jdbc.utils的包,然后在该包下创建C3p0Utils类,用于创建数据源:

C3p0Utils.java

package cn.itcast.jdbc.utils;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3p0Utils {
	private static DataSource ds;
	static {
		ds = new ComboPooledDataSource();
	}
	public static DataSource getDataSource() {
		return ds;
	}
}

2.在项目chapter10的src目录下,创建一个名为cn.itcast.jdbc.demo的包,然后在该包下创建DBUtilsDao类,用于实现对user表增删改查的基本操作:

DBUtilsDao.java

package cn.itcast.jdbc.demo;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import cn.itcast.chapter10.example.User;
import cn.itcast.jdbc.utils.C3p0Utils;
public class DBUtilsDao {
	// 查询所有,返回List集合
	public List findAll() throws SQLException {
		// 创建QueryRunner对象
		QueryRunner runner = new QueryRunner(C3p0Utils.getDataSource());
		// 写SQL语句
		String sql = "select * from user";
		// 调用方法
		List list = (List) runner.query(sql,
                     new BeanListHandler(User.class));
		return list;
	}
	// 查询单个,返回对象
	public User find(int id) throws SQLException {
		// 创建QueryRunner对象
		QueryRunner runner = new QueryRunner(C3p0Utils.getDataSource());
		// 写SQL语句
		String sql = "select * from user where id=?";
		// 调用方法
		User user = (User) runner.query(sql, 
                 new BeanHandler(User.class), new Object[] { id });
		return user;
	}
	// 添加用户的操作
	public Boolean insert(User user) throws SQLException {
		// 创建QueryRunner对象
		QueryRunner runner = new QueryRunner(C3p0Utils.getDataSource());
		// 写SQL语句
		String sql = "insert into user (name,password) values (?,?)";
		// 调用方法
		int num = runner.update(sql,
				new Object[] { user.getName(), user.getPassword() });
		if (num > 0)
			return true;
		return false;
	}
	// 修改用户的操作
	public Boolean update(User user) throws SQLException {
		// 创建QueryRunner对象
		QueryRunner runner = new QueryRunner(C3p0Utils.getDataSource());
		// 写SQL语句
		String sql = "update  user set name=?,password=? where id=?";
		// 调用方法
		int num = runner.update(sql, new Object[] { user.getName(),
                     user.getPassword(),user.getId() });
		if (num > 0)
			return true;
		return false;
	}
	// 删除用户的操作
	public Boolean delete(int id) throws SQLException {
		// 创建QueryRunner对象
		QueryRunner runner = new QueryRunner(C3p0Utils.getDataSource());
		// 写SQL语句
		String sql = "delete from user where id=?";
		// 调用方法
		int num = runner.update(sql, id);
		if (num > 0)
			return true;
		return false;
	}
}

3.测试DBUtilsDao类中的增删改查操作:

(1)在cn.itcast.jdbc.demo包中创建类DBUtilsDaoTest1对增加操作进行测试:
DBUtilsDaoTest1.java

package cn.itcast.jdbc.demo;
import java.sql.SQLException;
import cn.itcast.chapter10.example.User;
public class DBUtilsDaoTest1 {
	private static DBUtilsDao dao = new DBUtilsDao();
	public static void testInsert() throws SQLException {
		User user = new User();
		user.setName("zhaoliu");
		user.setPassword("666666");
		boolean b = dao.insert(user);
		System.out.println(b);
	}
	public static void main(String[] args) throws SQLException {
		testInsert();
	}
}

(2)在cn.itcast.jdbc.demo包中创建类DBUtilsDaoTest2对修改操作进行测试:

DBUtilsDaoTest2.java

package cn.itcast.jdbc.demo;
import java.sql.SQLException;
import cn.itcast.chapter10.example.User;
public class DBUtilsDaoTest2 {
	private static DBUtilsDao dao = new DBUtilsDao();
	public static void testupdate() throws SQLException {
		User user = new User();
		user.setName("zhaoliu");
		user.setPassword("666777");
		user.setId(4);
		boolean b = dao.update(user);
		System.out.println(b);
	}
	public static void main(String[] args) throws SQLException {
		testupdate();
	}
}

(3)在cn.itcast.jdbc.demo包中创建类DBUtilsDaoTest3对删除操作进行测试:

DBUtilsDaoTest3.java

package cn.itcast.jdbc.demo;
import java.sql.SQLException;
public class DBUtilsDaoTest3 {
	private static DBUtilsDao dao = new DBUtilsDao();
	public static void testdelete() throws SQLException {
		boolean b = dao.delete(4);
		System.out.println(b);
	}
	public static void main(String[] args) throws SQLException {
		testdelete();
	}
}

(4)在cn.itcast.jdbc.demo包中创建类DBUtilsDaoTest4对查询操作进行测试:

DBUtilsDaoTest4.java

package cn.itcast.jdbc.demo;
import java.sql.SQLException;
import cn.itcast.chapter10.example.User;
public class DBUtilsDaoTest4 {
	private static DBUtilsDao dao = new DBUtilsDao();
	public static void testfind() throws SQLException {
		User user = dao.find(2);
		System.out.println(user.getId() + "," + user.getName() + ","
				+ user.getPassword());
	}
	public static void main(String[] args) throws SQLException {
		testfind();
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值