DBCP连接池

实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况我们采用连接池技术,来共享连接Connection。这样我们就不需要每次都创建连接,释放连接了,这些操作都交给了连接池。
1.连接池概述
(1)概念
用池链接Connection,这样可以重复使用Connection。有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的colse()方法也不会真的关闭Connection,而是把Connection"归还"给池。池就可以在利用这个Connection对象了。
(2)规范
java为数据连接池提供了公共的接口,javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便地切换不同厂商的连接池!
常见得连接池:DBCP、C3P0。
2.DBCP连接池
DBCP也是一个开源的连接池,是Apache Common成员之一,在企业开发中也比较常见,tomcat内置的连接池

连接池jar包中,定义好一个类BasicDataSource
实现类数据源的规范接口javax.sql.DataSource

public class DataSoruceDemo {
	public static void main(String[] args) {
		//创建DataSource接口的实现类对象
		//实现类,org.apache.commons.dbcp
		BasicDataSource dataSource=new BasicDataSource();
		//连接数据库的4个最基本信息,通过对象方法setXXX设置进来
		dataSource.setDriverClassName("com.mysql.jdbc.Driver");
		dataSource.setUrl("jdbc:mysql://localhost:3306/mybase");
		dataSource.setUsername("root");
		dataSource.setPassword("root");
		
		try {
			//调用对象方法getConnection获取数据库的连接
			Connection connection = dataSource.getConnection();
			System.out.println(connection);
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException("数据库连接失败");
		}
	}
}

常见配置项
在这里插入图片描述
查询和添加案例

public class QueryRunnerDemo {
	public static void main(String[] args){
		//insert();
		select();
	}
	//数据查询
	public static void select(){
		String sql="SELECT * FROM sort";
		try{
		List<Object[]> query = qr.query(sql, new ArrayListHandler());
		for (Object[] objects : query) {
			for (Object object : objects) {
				System.out.print(object+"\t");
			}
			System.out.println();
		}
		}catch(SQLException e){
			throw new RuntimeException("数据查询失败");
		}
	}

	//定义2个方法,实现数据表的添加,数据表查询
	//QueryRunner类对象,写在类成员位置
	private static QueryRunner qr=new QueryRunner(JDBCUtils.getDatasource());
	//数据表添加数据
	public static void insert(){
		String sql="INSERT INTO sort(sname,sprice,sdesc)VALUES (?,?,?)";
		Object[] object={"水果",100.12,"新鲜采摘"};
		try {
			int update = qr.update(sql,object);
			System.out.println(update);
		} catch (Exception e) {
			throw new RuntimeException("数据添加失败");
		}
	}

}

登陆注册案例
dao

public class LanDingDao {
	// 创建QueryRunnery类的对象,构造方法中,传递工具中获取的数据源
	private QueryRunner qr = new QueryRunner(JDBCUtils.getDatasource());

	/*
	 * 创建注册功能,接收用户的输入用户名和密码 返回注册结果true注册成功false注册失败,用户名被占用
	 * 
	 * 实现思想: 检查用户名是否被占用 将用户输入的用户名,作为users表查询条件 如果有结果集,说明用户名已经有了,返回false
	 * 
	 * 没有结果集,用户名可以使用 用户名和密码Insert 写入到数据表,并且返回true
	 * 
	 */
	public boolean register(String username, String password) {
		try {
			// 拼写SQL语句,检查用户是否被占用,用户名作为条件查询
			String sql = "SELECT username FROM landing WHERE username=?";
			// 调用qr对象方法query查询结果集
			String query = qr.query(sql, new ScalarHandler<String>(), username);
			// 如果用户名不存在,query变量,表示一个用户名,用户名不存在,query变量结果集null
			if (query != null)
				return false;
			// 用户名可以
			// 拼写添加用户名密码的SQL语句
			sql = "INSERT INTO landing (username,password) VALUES(?,?)";
			// 创建对象数组,保存?占位符的实际参数
			Object[] object = { username, password };
			// 调用qr对象方法update写入
			qr.update(sql, object);
			return true;
		} catch (SQLException e) {
			throw new RuntimeException("注册失败失败");
		}
	}

	/*
	 * 创建登陆功能,接收用户的输入的用户名和密码 返回登陆的结果true 登陆成功 fase 登陆失败
	 *
	 * 实现思想 用户名和密码,作为数据表landing的查询条件, 查询表结果集 有结果集,返回true 没有结果集,返回false
	 */
	public boolean login(String username, String password) {
		try {
			// 拼接查询数据表的SQL
			String sql = "SELECT * FROM landing WHERE username=? and password=?";
			Object[] object = {username,password };
			// 调用qr方法query查询数据表
			Object[] query = qr.query(sql, new ArrayHandler(), object);
			// 对数组进行判断
			if (query.length == 0) {
				return false;
			} else {
				return true;
			}
		} catch (SQLException e) {
			throw new RuntimeException("登陆查询失败");

		}

	}

}

工具类

/*
 * 使用DBCP实现数据库的连接池
 * 连接池配置,自定义类
 * 最基本四项完整
 * 对于数据库连接池其他配置,自定义
 */
public class JDBCUtils {
	//创建出BasicDataSource类对象
	private static BasicDataSource datasource=new BasicDataSource();
	
	//静态代码块,对象BasicDataSource对象中的配置,自定义
	static{
		datasource.setDriverClassName("com.mysql.jdbc.Driver");
		datasource.setUrl("jdbc:mysql://localhost:3306/mybase");
		datasource.setUsername("root");
		datasource.setPassword("root");
		//对象连接池中的连接数量配置
		datasource.setInitialSize(10);//初始化的连接数
		datasource.setMaxActive(8);//最大连接数
		datasource.setMaxIdle(5);//最大空闲数
		datasource.setMinIdle(1);//最小空闲
	}

	//定义静态方法,返回BasicDataSource类的对象
	public static DataSource getDatasource() {
		return datasource;
	}
	
	
}

实现和用户的交互部分
提供菜单,让用户选择菜单,根据菜单,调用不同的功能

public class UserOperator {
	private static Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {
		LanDingDao dao = new LanDingDao();
		// 调用选择方法,获取用户的选择内容
		while (true) {
			String chooser = chooser();
			// 对选择序号判断
			switch (chooser) {
			case "1":
				// 接收键盘输入,调用登陆功能
				System.out.println("选择的是登陆,请输入请输入你的用户名");
				String username = sc.next();
				System.out.println("请输入密码");
				String password = sc.next();
				// 调用Dao包中的LanDingDao类中的方法longin传递用户名和密码

				boolean login = dao.login(username, password);
				if (login) {
					System.out.println("登陆成功");
				} else {
					System.out.println("登陆失败,请检查你的用户名和密码");
				}
				break;
			case "2":
				// 接收键盘输入,调用注册功能
				System.out.println("选择的是注册,请输入你的用户名");
				username = sc.next();
				System.out.println("请输入你的密码");
				password = sc.next();
				// 调用Dao包中的LanDao类中的方法register传递用户名密码
				boolean register = dao.register(username, password);
				if (register) {
					System.out.println("注册成功");
				} else {
					System.out.println("注册失败!用户名已存在,请尝试" + username + "_123");
				}
				break;
			case "3":
				System.exit(0);
			default:
				System.out.println("没有此功能");
			}
		}

	}

	/*
	 * 定义方法,选择菜单 返回选择内容
	 */
	public static String chooser() {
		System.out.println("欢迎光临");
		System.out.println("请选择菜单功能");
		System.out.println("1.登陆 2.注册 3.退出 ");
		return sc.next();
	}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值