QueryRunner使用总结

Posted zgrey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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再存到一个map里,其key为指定的列。
ScalarHandler:将结果集第一行的某一列放到某个对象中。//重点

案例

先导入所需要的包
技术图片
创建一个DButils类JDBCUtils.java:

/**
 * 创建数据库连接池
 */
public class JDBCUtils {
	// 创建一个ThreadLoacl对象,用当前线程作为key
	private static ThreadLocal<Connection> tc = new ThreadLocal<Connection>();
	// 读取的是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<Order> findAllUser() throws SQLException {
		String sql = "select * from order1";
		return qr.query(sql, new BeanListHandler<Order>(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使用总结的主要内容,如果未能解决你的问题,请参考以下文章

QueryRunner的使用

QueryRunner使用之可变条件的处理

python常用代码片段总结

BootStrap有用代码片段(持续总结)

BootStrap实用代码片段(持续总结)

QueryRunner的使用