QueryRunner使用总结

    使用JDBC技术是一件繁琐的事情,为了使数据库更加高效,有一种简化jdbc技术的操作--DBUtils。DbUtils(org.apache.commons.dbutils.DbUtils)是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。DbUtils类主要负责装载驱动、关闭连接的常规工作。

     QreryRunner类(org.apache.commons.dbutils.QueryRunner) 是Dbutils的核心类之一,它显著的简化了SQL查询,并与ResultSetHandler协同工作将使编码量大为减少。它包含以下几个方法:

1.       query(Connection conn, String sql, Object[] params, ResultSetHandler rsh):执行选择查询,在查询中,对象阵列的值被用来作为查询的置换参数。

2.       query(String sql, Object[] params, ResultSetHandler rsh):方法本身不提供数据库连接,执行选择查询,在查询中,对象阵列的值被用来作为查询的置换参数。

3.       query(Connection conn, String sql, ResultSetHandler rsh):执行无需参数的选择查询。

4.       update(Connection conn, String sql, Object[] params):被用来执行插入、更新或删除(DML)操作。

其中ResultSetHandler接口(org.apache.commons.dbutils.ResultSethandler)执行处理一个结果集对象,将数据转变并处理为任何一种形式,供其他应用使用。实现类如下:

ArrayHandler:把结果集中的第一行数据转成对象数组。
ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中。
BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。//重点
MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。//重点
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
ColumnListHandler:将结果集中某一列的数据存放到List中。
KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里(List),再把这些map再存到一个map里,其key为指定的列。
ScalarHandler:将结果集第一行的某一列放到某个对象中。//重点

案例

先导入所需要的包

QueryRunner使用总结_第1张图片

创建一个DButils类JDBCUtils.java

/**
 * 创建数据库连接池
 */
public class JDBCUtils {
	// 创建一个ThreadLoacl对象,用当前线程作为key
	private static ThreadLocal tc = new ThreadLocal();
	// 读取的是C3P0-config默认配置创建数据库连接池对象
	private static DataSource ds = new ComboPooledDataSource();

	// 获取数据库连接池对象
	public static DataSource getDataSource() {
		return ds;
	}

	// 从连接池中获取连接
	public static Connection getConnection() throws SQLException {
		Connection conn = tc.get();
		if (conn == null) {
			conn = ds.getConnection();
			// 将conn存放到集合tc中
			tc.set(conn);
			System.out.println("首次创建连接:" + conn);
		}
		return conn;
	}

	// 开启事务
	public static void startTransaction() {
		try {
			// 获取连接
			Connection conn = getConnection();
			// 开启事务
			/*
			 * setAutoCommit总的来说就是保持数据的完整性,一个系统的更新操作可能要涉及多张表,需多个SQL语句进行操作
			 * 循环里连续的进行插入操作,如果你在开始时设置了:conn.setAutoCommit(false);
			 * 最后才进行conn.commit(),这样你即使插入的时候报错,修改的内容也不会提交到数据库,
			 */
			conn.setAutoCommit(false);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public static void commit() {
		try {
			Connection conn = tc.get();
			if (conn != null) {
				conn.commit();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void rollback() {
		try {
			// 从集合tc中得到一个连接
			Connection conn = tc.get();
			if (conn != null) {
				// 该方法用于取消在当前事务中进行的更改,并释放当前Connection对象持有的所有数据库锁。此方法只有在手动事务模式下才可用
				conn.rollback();
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

添加数据

// 添加数据
	public void add(Order order) throws Exception {
		Connection connection = JDBCUtils.getConnection();
		String sql = "insert into order1(id) values(?)";
		qr.update(connection, sql, order.getId());
	}

查询数据,调用query()方法去执行查询语句. 


	public List findAllUser() throws SQLException {
		String sql = "select * from order1";
		return qr.query(sql, new BeanListHandler(Order.class));
	}

因为我们用的C3P0数据库连接池获取的DataSource, 所以这里直就可以过去到当前的Connection.

修改数据

public void update(Order order) throws SQLException {
		String sql = "update order1 set state=? where id=?";
		qr.update(sql, order.getState(), order.getId());
}

删除数据

	public void deleteById(String id) throws SQLException {
		String sql = "delete from order1 where id=?";
		qr.update(sql, id);

	}

你可能感兴趣的:(QueryRunner使用总结)