zoukankan      html  css  js  c++  java
  • 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);
     
    	}
    
  • 相关阅读:
    $('div div')和$('div >div')的区别
    [转]35岁前程序员要规划好的四件事,健康居首位
    程序员应该改变的20个思维习惯
    JQuery总结
    Javahome 与 Path 与ClassPath的含义
    jsp 位置
    访问 IIS 元数据库失败 权限问题
    xp添加文件夹写入权限
    dataset 对象
    js的一些代码
  • 原文地址:https://www.cnblogs.com/zgrey/p/13365622.html
Copyright © 2011-2022 走看看