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 + " "); } } // 查询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 |
初始化连接 |