QueryRunner的用法解析

QueryRunner

QueryRunner

概述

简单说明

示例增删改查

添加数据

删除数据

修改数据

查询操作


概述

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

dbutils它是对JDBC的简单封装,极⼤简化jdbc编码的⼯作量

DbUtils

提供了关闭连接,装载JDBC驱动,回滚提交事务等⽅法的⼯具类【⽐较少使⽤,因为我们学了连接池, 就应该使⽤连接池连接数据库】

ResultSetHandler接⼝

该接⼝规范了对ResultSet的操作,要对结果集进⾏什么操作,传⼊ResultSetHandler接⼝的实现类即

可。

QueryRunner

该类简化了SQL查询,配合ResultSetHandler使⽤,可以完成⼤部分的数据库操作,重载了许多的查

询,更新,批处理⽅法。⼤⼤减少了代码量

     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为指定的列。

简单说明

总体说明 :
========================================

1 ,不加事务,自动关闭	
	
	private QueryRunner qr = new QueryRunner(C3p0Util.getDataSource());
	
2 ,加事务,手动关闭	
	
	Connection conn = C3p0Util.getConn();
	private QueryRunner qr = new QueryRunner(conn);
	conn.close();
	

增删改
=========================================	
	
//	增
@Test
public void add() throws SQLException {
	String sql = "insert into items values(null,?,?,?,?,?)";
	Items items = new Items();
	items.setId(0);
	items.setCreatetime(new Date());
	items.setDetail("xx");
	items.setName("xx");
	items.setPic("xx");
	items.setPrice(123.456);
	int i = qr.update(sql,items.getName(),items.getPrice(),items.getDetail(),items.getPic(),items.getCreatetime());
	System.out.println(i);
}
//	删
@Test
public void del() throws SQLException {
	String sql ="delete from items where id=?";
	int i = qr.update(sql,7);
	System.out.println(i);
}
//	改
@Test
public void upd() throws SQLException {
	String sql = "update items set name=?,price=?,detail=?,pic=?,createtime=? where id=?";
	Items items = new Items();
	items.setId(5);
	items.setCreatetime(new Date());
	items.setDetail("xx");
	items.setName("xx");
	items.setPic("xx");
	items.setPrice(123.456);
	int i = qr.update(sql,items.getName(),items.getPrice(),items.getDetail(),items.getPic(),items.getCreatetime(),items.getId());
	System.out.println(i);
}
	
	
查 :	
===========================================	
	
1 ,各种结果集	
	
	ArrayHandler		将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值
	ArrayListHandler	将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。
	BeanHandler			将结果集中第一条记录封装到一个指定的javaBean中。
	BeanListHandler		将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中
	ColumnListHandler	将结果集中指定的列的字段值,封装到一个List集合中
	KeyedHandler		将结果集中每一条记录封装到Map<String,Object>,在将这个map集合做为另一个Map的value,另一个Map集合的key是指定的字段的值。
	MapHandler			将结果集中第一条记录封装到了Map<String,Object>集合中,key就是字段名称,value就是字段值
	MapListHandler		将结果集中每一条记录封装到了Map<String,Object>集合中,key就是字段名称,value就是字段值,在将这些Map封装到List集合中。
	ScalarHandler		它是用于单数据。例如:select count(*) from 表操作。
	
2 ,常用结果集 :	
	
	BeanHandler
	
	BeanListHandler
	
	ScalarHandler
	
3 ,例子 :	
	
	@Test
	public void getOne() throws SQLException {
		String sql = "select * from items where id=?";
		Items i = qr.query(sql, new BeanHandler<Items>(Items.class),1);
		System.out.println(i);
	}
	//	查多条
	@Test
	public void getMany() throws SQLException {
		String sql = "select * from items where id in(?,?)";
		Object[] arr = new Object[2];
		arr[0]=1;
		arr[1]=2;
		List<Items> list = qr.query(sql, new BeanListHandler<Items>(Items.class),arr);
		for (Items items : list) {
			System.out.println(items);
		}
	}
	//	查一个数字
	@Test
	public void getInt() throws SQLException {
		String sql = "select count(1) c from items";
		Integer i = qr.query(sql, new ScalarHandler<Integer>());
		System.out.println(i);
	}

示例增删改查

示例利用了黑马程序员封装好的包TXQueryRunner类 https://download.csdn.net/download/mocas_wang/12454033

public class userDao {
    private QueryRunner qr=new TxQueryRunner();

添加数据

public void add(user user)
    {
       
        try
        {
            String sql="insert into tb_user values (?,?,?,?,?,?)";
            Object[] params={user.getUid(),user.getUsername(),
                    user.getPassword(),user.getEmail(),user.getCode(),user.isState()};
            qr.update(sql,params);

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

删除数据

 public void delete(String cid) {
          try
          {
               String sql="delete from category where cid=?";
               qr.update(sql,cid);

          }
          catch (SQLException e)
          {
               throw new RuntimeException(e);

          }


     }

修改数据

public void edit(book book) {
        try {
            String sql = "update book set bname=?,price=?,author=?,image=?,cid=?  where bid=?";
            Object[] params = { book.getBname(), book.getPrice(),
                    book.getAuthor(), book.getImage(), book.getCategory().getCid(),book.getBid()};
            qr.update(sql, params);
        } catch(SQLException e) {
            throw new RuntimeException(e);
        }
    }
 /*修改分类*/
public void edit(category category) {
   try
    {
         String sql="update category set cname=? where cid=?";
         qr.update(sql,category.getCname(),category.getCid());
     }
     catch (SQLException e)
     {
          throw new RuntimeException(e);

      }
}

查询操作

各种结果集    
    
    ArrayHandler        将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值
    ArrayListHandler    将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。
    BeanHandler            将结果集中第一条记录封装到一个指定的javaBean中。
    BeanListHandler        将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中
    ColumnListHandler    将结果集中指定的列的字段值,封装到一个List集合中
    KeyedHandler        将结果集中每一条记录封装到Map<String,Object>,在将这个map集合做为另一个Map的value,另一个Map集合的key是指定的字段的值。
    MapHandler            将结果集中第一条记录封装到了Map<String,Object>集合中,key就是字段名称,value就是字段值
    MapListHandler        将结果集中每一条记录封装到了Map<String,Object>集合中,key就是字段名称,value就是字段值,在将这些Map封装到List集合中。
    ScalarHandler        它是用于单数据。例如:select count(*) from 表操作。

/*查单个*/
public user findByEmail(String  email)
{
   
    try
     {
      String sql="select * from tb_user where email=?";
      return qr.query(sql,new BeanHandler<user>(user.class),email);

     } catch (SQLException e) {
      throw new RuntimeException(e);
     }
}
        /*查多条*/
    public List<order> findByUid(String uid) {
        /*通过uid查询当前用户的所有order
        * 循环遍历所有order,为其加载所有的orderitem*/
        try
        {
            /*得到当前用户的所有订单*/
            String sql="select * from orders where uid=?";
            List<order> orderList=qr.query(sql,new BeanListHandler<order>(order.class),uid);
  
            /*
             * 3. 返回订单列表
             */
            return orderList;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

    }
         /*查询map所有条目*/
    private void loadOrderItems(order order) throws SQLException {
        String sql="select * from orderitem i,book b where i.bid=b.bid and oid=?";
        /*
         * 因为一行结果集对应的不再是一个javabean,所以不能再使用BeanListHandler,而是MapListHandler
         */
        List<Map<String,Object>> mapList = qr.query(sql, new MapListHandler(), order.getOid());
        /*
         * mapList是多个map,每个map对应一行结果集
         * 一行:
         * {iid=C7AD5492F27D492189105FB50E55CBB6, count=2, subtotal=60.0, oid=1AE8A70354C947F8B81B80ADA6783155, bid=7, bname=精通Hibernate,price=30.0, author=张卫琴, image=book_img/8991366-1_l.jpg, cid=2}
         * ...
         *
         * 我们需要使用一个Map生成两个对象:OrderItem、Book,然后再建立两者的关系(把Book设置给OrderItem)
         */
        /*
         * 循环遍历每个Map,使用map生成两个对象,然后建立关系(最终结果一个OrderItem),把OrderItem保存起来
         */
        List<orderItem> orderItemList = toOrderItemList(mapList);
        order.setOrderItemList(orderItemList);
    }
         /*查询单个值*/
    public int getStateByOid(String oid)
    {

        try
        {
            String sql="select state from orders where oid=?";
            return (Integer)qr.query(sql,new ScalarHandler(),oid);

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

 public int getCountByCid(String cid) {
        try{
            String sql="select count(*) from book where cid=?";
            Number cnt= (Number) qr.query(sql,new ScalarHandler(),cid);
            return cnt.intValue();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

 

 

 

 

 

 

 

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值