DBUtils 的快速入门

Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。

一、什么是DBUtils?

1. 介绍

a. DBUtils 是 Java 操作数据库一个封装好的工具,可以简单快捷的使用数据库
b. 对于数据库的读操作,可以把结果集 ResultSet 封装成 ListSetArray等 Java 集合
c. 对于写操作,只要编写 SQL 语句
d. 可以使用数据源、JBDI

2. 作用

DBUtils 封装了 JDBC 操作,简化了过程,让编程更简洁

二、DBUtils 的三个核心对象

1. QueryRunner 类

主要的方法:
query():执行 DQL操作
update():执行 DML 操作
batch():执行批处理操作

2. ResultSetHandler 接口
用于DQL操作后,封装查询的结果集
3. DBUtils 类
是一个工具类,定义了关闭资源和事务处理的方法

三、DBUtils 的简单使用

  1. 导入 jar 包,用到MySQL数据库、C3P0、DBUtils,至少导入这三个 jar 包
  2. 创建一个 QueryRunner 对象,需要数据源
//创建一个 QueryRunner 对象,括号里面需要一个数据源,在另外的包创建
QueryRunner runner = new QueryRunner(C3P0Util.getDataSource());

数据源文件如下图所示,C3P0Util.java 和 C3P0-config.xml 具体代码在文章最后列出

  1. 定义SQL语句
//定义SQL语句,比如查询学生表的全部信息
String sql = "select * from student";
  1. DQL 的时候,使用 ArrayListHandler() 封装结果集
//执行sql语句并封装查询结果
List<Object[]> objectList = runner.query(sql, new ArrayListHandler());
  1. 最后再使用 DBUtils 的 close() 方法释放资源

四、QueryRunner 对象

1. 构造函数
new QueryRunner():事务可以自己控制
也就是说,这个对象调用的方法(query、update、batch)的参数中都需要Connection 对象
2. 普通方法
  1. query:(具体例子下面讲

    ArrayHandler:适合单行多列的情况
    ArrayListHandler:适合多行多列
    ColumnListHandler:适合多行单
    KeyedHandler:适合去多条记录,每条记录封装到 Map 中,再将 Map 封装到另外一个 Map 中,key 为指定字段的值
    MapHandler:适合适合取一行数据,把每一行数据的属性名和属性值封装到 Map
    MapListHandler:适合取多条记录,将记录封装到 Map 中 ,再将 Map 封装到 List
    ScalaHandler:适合取单行单列的数据
    BeanHandler:适合去读一行数据,并且封装到指定的对象
    BeanListHandler:适合读取多行数据,并且封装到指定的对象中,并且添加到集合

  2. update

Insert:添加数据

@Test
public void testInsert() throws SQLException{
	//1. 得到一个QueryRunner对象
	QueryRunner runner = new QueryRunner(C3P0Util.getConnection());
	//2. 定义SQL语句
	String sql = "insert into stu value(?,?,?,?)";
	//3.定义一个参数数组
	Object[] params = {"1","花无缺",27,"男"}
	//4. 执行DML操作
	int count = runner.update(conn,sql,params);
}

Update:修改数据

@Test
public viod testUpdate() throws SQLException{
	QueryRunner runner = new QueryRunner(C3P0Util.getConnection());
	String sql = "update ste set s_name=?,where s_id=?";
	Object[] params = {"叶孤城","13"};
	int count = runner.update(sql,params);
}

Delete:删除数据

@Test
public viod testDelete() throws SQLException{
	QueryRunner runner = new QueryRunner(C3P0Util.getConnection());
	String sql = "delete from stu where sid=?";
	Object[] params = {"13"};
	int count = runner.delete(sql,params);
}
  1. batch:批量操作
@Test
public void testBatch() throws SQLException{
	//1. 得到一个QueryRunner对象
	QueryRunner runner = new QueryRunner(C3P0Util.getConnection());
	//2. 定义SQL语句
	String sql = "insert into stu value(?,?,?,?)";
	//3.定义一个参数数组
	Object[] params = {
		{"1","花无缺",27,"男"}
		{"2","小鱼儿",27,"男"}
	}
	//4. 执行DML操作
	int[] count = runner.batch(sql,params);
}

五、ResultSetHandler 接口

方法有很多,上面query方法里面有提,用法都差不多,都是先构建 QueryRunner 对象,定义SQL语句,在执行方法,这里类举一个,其他的就不一一列举了

MapHandler:取出一行数据,把每一行的数据的属性名和属性值封装到 Map

@Test
public void testMap() throws SQLException{
	//1. 得到一个QueryRunner对象
	QueryRunner runner = new QueryRunner(C3P0Util.getConnection());
	//2. 定义查询所有的SQL语句
	String sql = "select * from stu where s_id=?";
	//3.执行SQL语句,并封装查询结果
	Map<String,Object> map = runner.query(sql,new MapHandler(),"13");
	
	for(Map.Entry<string,Object> entry:map.entrySet()){
		String key =entry.getKey();
		Object value = entry.getValue();
		System.out.println(key);
		System.out.println(value);
	}
}

六、DBUtils 的事务开发

@Test
public void testInsert() throws SQLException{
	//1. 得到一个QueryRunner对象
	QueryRunner runner = new QueryRunner();
	//2. 得到数据库的连接
	Connection conn = C3P0Util.getConnection();
	//设置事务不自动提交
	conn.setAutoComit(false);
	//3. 定义插入的SQL语句
	String sql = "insert into stu value(?,?,?,?)";
	//4.定义一个参数数组
	Object[] params = {"1","花无缺",27,"男"}
	//4. 执行DML操作
	int count = runner.update(conn,sql,params);
	try{
		System.out.println(1/0);//假设让程序出错,使它事务回滚
		conn.commit();//提交事务
		System.out.println("插入数据"+(count == 1? "成功":"失败"));
	}catch(Exception e){
		e.prinltStackTrace();
		conn.rollback();//回滚事务
		System.out.println("事务回滚了...");
	}
}

七、C3P0Util.java 和 C3P0-config.xml 具体代码(选看)

C3P0Util:

package cn.csdn.utils;

import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;
/**
 * 使用C3P0连接池得到数据库的连接对象
 *
 * @author 长歌
 * @2020年4月22日下午4:21:31
 */
public class C3P0Util {
	private C3P0Util() {
	}
	// C3P0得到数据源的方式
	private static DataSource dataSource = new ComboPooledDataSource();
	/**
	 * 返回数据源对象
	 */
	public static DataSource getDataSource() {
		return dataSource;
	}
	/**
	 * 得到数据库的连接对象
	 */
	public static Connection getConnection() {
		try {
			return dataSource.getConnection();
		} catch (SQLException e) {
			throw new RuntimeException("创建数据库连接失败...");
		}
	}
	/**
	 * 关闭数据库资源
	 * @param autoCloseables
	 */
	public static void close(AutoCloseable... autoCloseables) {
		if (autoCloseables == null || autoCloseables.length == 0) {
			return;
		}
		for (AutoCloseable autoCloseable : autoCloseables) {
			if (autoCloseable == null) {
				continue;
			}
			// 不关闭conn对象
			if (autoCloseable.getClass() != Connection.class) {
				try {
					autoCloseable.close();
				} catch (Exception e) {
					System.err.println("关闭数据库资源失败:" + autoCloseable);
					autoCloseable = null;
				}
			}
		}
	}

}

C3P0-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
	<default-config>
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/csdn</property>
		<property name="user">root</property>
		<property name="password">root</property>
		
		<property name="initialPoolSize">10</property>
		<property name="maxIdleTime">30</property>
		<property name="maxPoolSize">100</property>
		<property name="minPoolSize">10</property>
	</default-config>
</c3p0-config>
posted @ 2021-10-08 09:26  长歌→  阅读(144)  评论(0编辑  收藏  举报