JavaWeb学习之DButils和连接池

时光毁灭记忆、已成空白 提交于 2020-04-28 01:54:27

DButils

DButils是JDBC的简化开发工具包。需要导入commons-dbutils-1.6.jar才能够正常使用DButils工具类

DButils封装了对JDBC的操作,简化了JDBC操作,可以少些代码。DButils的三个核心功能:

1、QueryRunner提供了对sql语句操作的API

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

3、DButils类,是一个工具类,定义了关闭资源与事物处理的方法

QueryRunner核心类

1、update(Connection conn,String sql,Object...params),用于完成表数据增加、删除、修改的操作

//添加
	public static void add() throws SQLException {
		QueryRunner qr = new QueryRunner();
		String sql = "insert into users(username,pwd) values(?,?)";
		Object[] obj = { "houyi", "123456" };
		int row = qr.update(conn,sql, obj);
		conn.close();
		if (row > 0) {
			System.out.println("添加成功");
		} else {
			System.out.println("添加失败");
		}
	}
    //修改
	public static void update() throws SQLException {
		QueryRunner qr = new QueryRunner();
		String sql = "update users set username=? ,pwd=? where id=?";
		int row = qr.update(conn, sql, "zhangfei", "123", 3);
		conn.close();
		if (row > 0) {
			System.out.println("修改成功");
		} else {
			System.out.println("修改失败");
		}
	}
    //删除
	public static void delete() throws SQLException {
		QueryRunner qr = new QueryRunner();
		String sql = "delete from users where id=?";
		int row = qr.update(conn, sql, 2);
		conn.close();
		if (row > 0) {
			System.out.println("删除成功");
		} else {
			System.out.println("删除失败");
		}
	}

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

      esultSetHandler结果集处理类

ArrayHandler

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

ArrayListHandler

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

BeanHandler

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

BeanListHandler

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

ColumnListHandler

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

ScalarHandler

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

MapHandler

将结果集第一行封装到Map集合中,Key 列名, Value 该列数据

MapListHandler

将结果集第一行封装到Map集合中,Key 列名, Value 该列数据,Map集合存储到List集合

// 查询ArrayHandler
	public static void find1() throws SQLException {
		QueryRunner qr = new QueryRunner();
		String sql = "select * from users";
		Object[] obj = qr.query(conn, sql, new ArrayHandler());
		for (Object o : obj) {
			System.out.print(o + "\t");
		}
	}

	// 查询ArrayListHandler
	public static void find2() throws SQLException {
		QueryRunner qr = new QueryRunner();
		String sql = "select * from users";
		List<Object[]> list = qr.query(conn, sql, new ArrayListHandler());
		for (Object[] o : list) {
			for (Object o2 : o) {
				System.out.println(o2);
			}
		}
	}

	// 查询BeanHandler
	public static void find3() throws SQLException {
		QueryRunner qr = new QueryRunner();
		String sql = "select * from users";
		User u = qr.query(conn, sql, new BeanHandler<User>(User.class));
		System.out.println(u);
	}

	// 查询BeanListHandler
	public static void find4() throws SQLException {
		QueryRunner qr = new QueryRunner();
		String sql = "select * from users";
		List<User> list = qr.query(conn, sql, new BeanListHandler<User>(User.class));
		for (User u : list) {
			System.out.println(u);
		}
	}

	// 查询ColumnListHandler
	public static void find5() throws SQLException {
		QueryRunner qr = new QueryRunner();
		String sql = "select username from users";
		List<String> list = qr.query(conn, sql, new ColumnListHandler<String>());
		System.out.println(list);
	}

	// 查询ScalarHandler(单数据)
	public static void find6() throws SQLException {
		QueryRunner qr = new QueryRunner();
		String sql = "select count(*) from users";
		long num = qr.query(conn, sql, new ScalarHandler<Long>());
		System.out.println(num);
	}

	// 查询MapHandler
	public static void find7() throws SQLException {
		QueryRunner qr = new QueryRunner();
		String sql = "select * from users";
		Map<String, Object> map = qr.query(conn, sql, new MapHandler());
		for (String key : map.keySet()) {
			System.out.println(key + "..." + map.get(key));
		}
	}

	// 查询MapListHandler
	public static void find8() throws SQLException {
		QueryRunner qr = new QueryRunner();
		String sql = "select * from users";
		List<Map<String, Object>> list = qr.query(conn, sql, new MapListHandler());
		for (Map<String, Object> map : list) {
			for (String key : map.keySet()) {
				System.out.println(key + "..." + map.get(key));
			}
		}
	}

连接池

在实际开发中,获得连接或者释放资源是非常消耗系统资源的两个过程,为了解决这个问题就采用连接池技术来共享连接Connection。

连接池原理:

把连接Connection放到池中,这样就能够重复使用Connection。通过池来获取对象,当使用完Connection后,调用Connection的close()方法关闭Connection。这里并不是真正的关闭Connection,而是把Connection归还给池。池就可以反复利用这个Connection对象了

Java为数据库连接池提供了公共的接口:javax.sql.DateSource,各个厂商只需要让自己的连接池实现这个接口即可。

DBCP连接池

1、导入jar包

2、编写工具类

 连接数据库表的工具类,采用DBCP连接池的方式完成,Java中提供了一个连接池的规范接口:

DateSource:是Java中提供的连接池,作为DriverManager工具的替代项。在DBCP包中提供了DataSource接口的实现类,我们要用的具体的连接池BasicDataSource类

package com.oracle.demo;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;

public class JDBCUtils {
	public static final String DRIVER = "com.mysql.jdbc.Driver";
	public static final String URL = "jdbc:mysql://localhost:3306/login?characterEncoding=utf-8";
	public static final String USERNAME = "root";
	public static final String PASSWORD = "123456";
	/*
	 * 创建连接池BasicDataSource
	 */
	public static BasicDataSource dataSource = new BasicDataSource();

	// 静态代码块
	static {
		// 对连接池对象 进行基本的配置
		dataSource.setDriverClassName(DRIVER); // 这是要连接的数据库的驱动
		dataSource.setUrl(URL); // 指定要连接的数据库地址
		dataSource.setUsername(USERNAME); // 指定要连接数据的用户名
		dataSource.setPassword(PASSWORD); // 指定要连接数据的密码
	}

	/*
	 * 返回连接池对象
	 */
	public static DataSource getDataSource() {
		return dataSource;
	}
}
// 添加
	public static void add() throws SQLException {
		QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
		String sql = "insert into users(username,pwd) values(?,?)";
		Object[] obj = { "houyi", "123456" };
		int row = qr.update(sql, obj);
		conn.close();
		if (row > 0) {
			System.out.println("添加成功");
		} else {
			System.out.println("添加失败");
		}
	}

常见的配置项

分类

属性

描述

必须项

driverClassName

数据库驱动名称

url

数据库的地址

username

用户名

password

密码

基本项(扩展)

maxActive

最大连接数量

minIdle

最小空闲连接

maxIdle

最大空闲连接

initialSize

初始化连接

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!