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 | 初始化连接 |