JDBC(5)DBUtils类详解

1 、DbUtils 类

DbUtils :提供如关闭连接、装载 JDBC 驱动程序等常规工作的工具类,里面的所有方法都是静态的。主要方法如下:

  • public static void close(…) throws java.sql.SQLException: DbUtils 类提供了三个重载的关闭方法。这些方法检查
    所提供的参数是不是 NULL,如果不是的话,它们就关闭 Connection、Statement 和 ResultSet。
  • public static void closeQuietly(…): 这一类方法不仅能在 Connection、Statement 和 ResultSet 为 NULL 情况下避免
    关闭,还能隐藏一些在程序中抛出的 SQLEeception。
  • public static void commitAndClose(Connection conn)throws SQLException 用来提交连接的事务,然后关闭连接
  • public static void commitAndCloseQuietly(Connection conn): 用来提交连接的事务,然后关闭连接,并且在关闭
    连接时不抛出 SQL 异常。
  • public static void rollback(Connection conn)throws SQLException 允许 conn 为 null,因为方法内部做了判断
  • public static void rollbackAndClose(Connection conn)throws SQLException
  • rollbackAndCloseQuietly(Connection)
  • public static boolean loadDriver(java.lang.String driverClassName):这一方装载并注册 JDBC 驱动程序,如果成功就返回 true。使用该方法,你不需要捕捉这个异常 ClassNotFoundException。/ QueryRunner 类该类封装了 SQL 的执行,是线程安全的。

(1)可以实现增、删、改、查、批处理。
(2)考虑了事务处理需要共用 Connection。
(3)该类最主要的就是简单化了 SQL 查询,它与 ResultSetHandler 组合在一起使用可以完成大部分的数据库操作,
能够大大减少编码量。

QueryRunner 类提供了两个构造方法:

  • QueryRunner():默认的构造方法
  • QueryRunner(DataSource ds):需要一个 javax.sql.DataSource 来作参数的构造方法。

使用 QueryRunner 类实现更新(增、删、改、批处理)

(1 )更新

  • public int update(Connection conn, String sql, Object… params) throws SQLException:用来执行一个更新(插入、更新或删除)操作。
  • public int update(Connection conn, String sql) throws SQLException:用来执行一个不需要置换参数的更新操作。

(2 )插入

  • public T insert(Connection conn,String sql,ResultSetHandler rsh)throws SQLException:其中 rsh - The handler used to create the result object from the ResultSet of auto-generated keys.。返回值: An object generated by the handler。即自动生成的键值。
  • public T insert(Connection conn,String sql,ResultSetHandler rsh, Object… params) throws SQLException:只支持INSERT
  • public T insert(String sql,ResultSetHandler rsh)throws SQLException:只支持 INSERT
  • public T insert(String sql,ResultSetHandler rsh,Object… params)throws SQLException:只支持 INSERT

(3 )批处理

INSERT, UPDATE, or DELETE 语句
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
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

(4 )是否需要传递 Connection?

1)不需要传递 Connection 对象:
前提是不考虑事务而且 QueryRunner 对象创建时指定数据源,这样在 QueryRunner 的所有增删改查方法中都会从数据源中自己获取连接。
2)必须传递 Connection 对象
如果有事务,必须传递 Connection 对象,因为同一个事务的多条语句必须在一个 Connection 连接中完成。

使用 QueryRunner 类实现查询

  • public Object query(Connection conn, String sql, ResultSetHandler rsh,Object… params) throws SQLException:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理PreparedStatement 和 ResultSet 的创建和关闭。
  • public Object query(String sql, ResultSetHandler rsh, Object… params) throws SQLException:几乎与第一种方法一
    样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源(DataSource) 或使用的 setDataSource 方法中重新获得 Connection。
  • public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException : 执行一个不需要置换参数的查询操作。
  • public Object query( String sql, ResultSetHandler rsh) throws SQLException : 执行一个不需要置换参数的查询操作。

ResultSetHandler 接口

该接口用于处理 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);
	}
}

BeanHandler 实现类

将结果集中的第一行数据封装到一个对应的 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);
}

BeanListHandler 实现类

将结果集中的每一行数据都封装到一个对应的 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);
	}
}

MapHandler 实现类

将结果集中的第一行数据封装到一个 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());
		}
	}
}

MapListHandler 实现类

将结果集中的每一行数据都封装到一个 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 实现类

/*
* 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);
}

JDBC 修改成 DbUtils 版

public class DBUtilsTool {
	//创建数据源,用的是 c3p0-config.xml 文件中<default-config>
	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);
	}
}

如果有收获!!! 希望老铁们来个三连,点赞、收藏、转发
创作不易,别忘点个赞,可以让更多的人看到这篇文章,顺便鼓励我写出更好的博客
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值