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
总体说明 :
========================================
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,在将这个map集合做为另一个Map的value,另一个Map集合的key是指定的字段的值。
MapHandler 将结果集中第一条记录封装到了Map集合中,key就是字段名称,value就是字段值
MapListHandler 将结果集中每一条记录封装到了Map集合中,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.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 list = qr.query(sql, new BeanListHandler(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());
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
MapHandler 将结果集中第一条记录封装到了Map
MapListHandler 将结果集中每一条记录封装到了Map
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.class),email);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/*查多条*/
public List findByUid(String uid) {
/*通过uid查询当前用户的所有order
* 循环遍历所有order,为其加载所有的orderitem*/
try
{
/*得到当前用户的所有订单*/
String sql="select * from orders where uid=?";
List orderList=qr.query(sql,new BeanListHandler(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
/*查询单个值*/
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);
}
}