DbUtils :提供如关闭连接、装载 JDBC 驱动程序等常规工作的工具类,里面的所有方法都是静态的。主要方法如下:
(1)可以实现增、删、改、查、批处理、
(2)考虑了事务处理需要共用 Connection。
(3)该类最主要的就是简单化了 SQL 查询,它与 ResultSetHandler 组合在一起使用可以完成大部分的数据库操作,
能够大大减少编码量。
QueryRunner 类提供了两个构造方法:
public int[] batch(Connection conn,String sql,Object[][] params)throws SQLException: INSERT, UPDATE, or DELETE 语句
public int[] batch(String sql,Object[][] params)throws SQLException: INSERT, UPDATE, or DELETE 语句
public <T> T insertBatch(Connection conn,String sql,ResultSetHandler<T> rsh,Object[][] params)throws SQLException:只支持 INSERT
public <T> T insertBatch(String sql,ResultSetHandler<T> rsh,Object[][] params)throws SQLException:只支持 INSERT
1)不需要传递 Connection 对象:
前提是不考虑事务而且 QueryRunner 对象创建时指定数据源,这样在 QueryRunner 的所有增删改查方法中都会从数
据源中自己获取连接
2)必须传递 Connection 对象
如果有事务,必须传递 Connection 对象,因为同一个事务的多条语句必须在一个 Connection 连接中完成
该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。
ResultSetHandler 接口提供了一个单独的方法:Object handle (java.sql.ResultSet rs)
该方法的返回值将作为 QueryRunner 类的 query()方法的返回值。
代码测试
@Test
public void testResultSetHandler() {
// 1.创建 QueryRunner 的实例
QueryRunner qr = new QueryRunner();
Connection conn = null;
try {
// 2.获取连接
conn = JDBCTools.getConnection();
class MyResultSetHandler implements ResultSetHandler{
@Override
public Object handle(ResultSet rs) throws SQLException {
Student stu = new Student();
if (rs.next()) {
stu.setId(rs.getInt(1));
stu.setSname(rs.getString(2));
stu.setSex(rs.getString(3));
stu.setMajor(rs.getString(4));
stu.setClasses(rs.getString(5));
}
return stu;
}
}
String sql = "select sno,sname,sex,major,classes from t_stu where sno =?";
// 3、使用 query 方法
// QueryRunner 的 query 方法的返回值取决于其 ResultSetHandler 参数的 handle 方法的返回值
Object obj = qr.query(conn, sql, new MyResultSetHandler(),1);
System.out.println(obj);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCTools.free(null, null, conn);
}
}
将结果集中的第一行数据封装到一个对应的 JavaBean 实例中。
/*
* BeanHandler: 把结果集的第一条记录转为创建 BeanHandler 对象时传入的 Class 参数对应的对象.
* 当 JavaBean 的属性名与字段名不一致时,可以通过指定别名告知属性名
*/
public static void main(String[] args) throws SQLException {
//1、连接池
DataSource ds = new ComboPooledDataSource("mypool");
//2、直接使用 QueryRunner
QueryRunner qr = new QueryRunner(ds);
String sql = "select pid as id,pname,price,description from t_goods where pid =?";
Goods goods = qr.query(sql, new BeanHandler<Goods>(Goods.class), 1);
System.out.println(goods);
}
将结果集中的每一行数据都封装到一个对应的 JavaBean 实例中,存放到 List 里。
/*
* BeanListHandler: 把结果集转为一个 List, 该 List 不为 null, 但可能为空集合(size() 方法返回 0) 若
* SQL 语句的确能够查询到记录, List 中存放创建 BeanListHandler 传入的 Class 对象对应的对象.
*/
public static void main(String[] args) throws SQLException {
//1、连接池
DataSource ds = new ComboPooledDataSource("mypool");
//2、直接使用 QueryRunner
QueryRunner qr = new QueryRunner(ds);
String sql = "select pid as id,pname,price,description from t_goods";
List<Goods> query = qr.query(sql, new BeanListHandler<Goods>(Goods.class));
for (Goods goods : query) {
System.out.println(goods);
}
}
将结果集中的第一行数据封装到一个 Map 里,key 是列名,value 就是对应的值。
public static void main(String[] args) throws SQLException {
// 1、连接池
DataSource ds = new ComboPooledDataSource("mypool");
// 2、直接使用 QueryRunner
QueryRunner qr = new QueryRunner(ds);
String sql = "select did,count(*) from employee where did = 1";
Map<String, Object> map = qr.query(sql, new MapHandler());
Set<Entry<String, Object>> entrySet = map.entrySet();
for (Entry<String, Object> entry : entrySet) {
// System.out.println(entry.getKey() +"-->" + entry.getValue());
if ("did".equals(entry.getKey())) {
System.out.println("部门编号:" + entry.getValue());
} else {
System.out.println("人数:" + entry.getValue());
}
}
}
将结果集中的每一行数据都封装到一个 Map 里,然后再存放到 List
public static void main(String[] args) throws SQLException {
//1、连接池
DataSource ds = new ComboPooledDataSource("mypool");
//2、直接使用 QueryRunner
QueryRunner qr = new QueryRunner(ds);
String sql = "select did,count(*) from employee group by did";
List<Map<String, Object>> query = qr.query(sql, new MapListHandler());
for (Map<String, Object> map : query) {
Set<Entry<String, Object>> entrySet = map.entrySet();
for (Entry<String, Object> entry : entrySet) {
//System.out.println(entry.getKey() +"-->" + entry.getValue());
if("did".equals(entry.getKey())){
System.out.println("部门编号:" + entry.getValue());
}else{
System.out.println("人数:" + entry.getValue());
}
}
}
}
/*
* ScalarHandler: 把结果集转为一个数值(可以是任意基本数据类型和字符串, Date 等)返回
* ScalarHandler()只取第一行第一列
* ScalarHandler(int columnIndex):取第一行的第 columnIndex 列
* ScalarHandler(String columnName):取第一行的列名为 columnName 列的值
*/
@Test
public static void main(String[] args) throws SQLException {
//1、连接池
DataSource ds = new ComboPooledDataSource("mypool");
//2、直接使用 QueryRunner
QueryRunner qr = new QueryRunner(ds);
// String sql = "select count(*) from t_goods";
String sql = "select max(price) from t_goods";
Object query = qr.query(sql, new ScalarHandler());
System.out.println(query);
}
public class DBUtilsTool {
//创建数据源,用的是 c3p0-config.xml 文件中
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
//获取数据源对象
public static ComboPooledDataSource getDataSource() {
return dataSource;
}
//获取连接
public static Connection getConnection() throws SQLException{
return dataSource.getConnection();
}
public static void closeQuietly(Connection conn){
DbUtils.closeQuietly(conn);
}
public static void closeQuietly(Statement st){
DbUtils.closeQuietly(st);
}
public static void closeQuietly(ResultSet rs){
DbUtils.closeQuietly(rs);
}
}