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:将结果集第一行的某一列放到某个对象中。//重点

案例

先导入所需要的包

创建一个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<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);

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值