DbUtils 是一个jdbc的工具,使用的范围内非常广,主要是为了简化jdbc的代码。 核心类:QueryRunner; ResultSetHandler(是一个接口,主要是完成ORM映射,把结果街转化成 我们需要的java对象)
对于结果集的处理有以下几个结果集处理器: *BenaHandler //把单行结果集的数据封装成javaBean对象,返回值是ResultSetHandler ResultSetHandler <javaBean类型> rsh = new BeanHandler<javaBean类型>(javaBean.class); 本方法多用于在 处理把单行结果集封装成JavaBean对象。(对象时通过反射完成创建的)
BeanListHandler List<javaBean类型> list = <List<javaBean类型>> new BeanListHandler<javaBean类型>(javaBean.class); 本方法多用于把多行结果集封装成对象,并且把对象添加到集合中,新版本中可能不需要进行类型的转换, 得到集合可以通过foreach循环来进行遍历。
MapHandler Map <String,Object> map = new MapHandler(); 本方法是用来吧单行结果集封装到一个Map中其中map的键是表中的列名称,值对应表的列值。
MapListHandler List<Map<String,Object>> listmap = new MapListHandler(); 本方法是用来多行结果集的处理,把每行的结果封装成一个map,最后把所有的,安排都装刀片一个集合中 返回值是一个集合,但是集合中存放的是map,
ColumnHandler List nameList = new ColumnHandler(); 本方法是用来出来单列,单行或者多行的数据
ScalarHandler 本方法是用于处理单行单列的数据,多用于聚合函数的查询,但是以一个点需要注意,就是当聚合函数是涉及到 数字类型的时候,一定要注意返回值类型的转换。有的人会选用Integer,long等类型,这些严格来说都是不合法 的,例如,long类型最大只能容纳20的阶乘,21的阶乘就会包异常,所以我们要选用Number(这个是所有数据类型) 的父类,并且对外提供的有Number.intValue(),和Number.LongValue(),等方法。
具体的代码如下: import java.sql.SQLException; import java.util.List; import java.util.Map; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.ResultSetHandler; import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.commons.dbutils.handlers.MapHandler; import org.apache.commons.dbutils.handlers.MapListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler;
public class Demo1 { //总结:使用DBUtils工具的步骤就是, /**
首先要创建一个QueryRunner对象 然后给出sql语句 通过QueryRunner对象来执行SQL语句,并且针对不用的SQL语句使用不同的结果集处理器。 并且本对象会自动关闭连接。 / /* 测试增删改(她们的模板差不多)@throws SQLException */ public void fun1() throws SQLException { student stu = new student(); stu.setSid(“1007”); stu.setSname(“蒋干”); stu.setSage(“35”); stu.setSgender(“男”); add(stu); }/**
增加方法@throws SQLException */ //创建一个QueryRunner 对象,并且传递一个连接池参数,这样以后调用的本方法时候就不用 //再提供Connection了,如果没有提供,那么调用本方法时,就必须要提供Connection public void add(student stu) throws SQLException { QueryRunner qr = new QueryRunner(JDBCUtils.getDataSouse()); String sql = “insert into student values(?,?,?,?)”; qr.update(sql, stu.getSid(),stu.getSname(),stu.getSage(),stu.getSgender());} public void fun2() throws SQLException { student stu = new student(); stu.setSid(“1007”); stu.setSname(“蒋干 不知不觉”); stu.setSage(“35”); stu.setSgender(“男”); update(stu); } //修改 public void update(student stu) throws SQLException { QueryRunner qr = new QueryRunner(JDBCUtils.getDataSouse()); String sql = “update set sname=?,sage=?,sgender=? where sid =d?”; qr.update(sql, stu.getSid(),stu.getSname(),stu.getSage(),stu.getSgender());
} public void fun3() throws SQLException { delete(“1007”); } //删除方法 public void delete(String id) throws SQLException { QueryRunner qr = new QueryRunner(JDBCUtils.getDataSouse()); String sql = “delete from studnt where id=?”; qr.update(sql, id); }
/**
查询语句@throws SQLException */ //BeanHandler结果集处理器用来处理,把单行查询得到的结果集抓换成对象 public void fun4() throws SQLException { //创建对象 QueryRunner qr = new QueryRunner(JDBCUtils.getDataSouse()); ResultSetHandler rsh = new BeanHandler(student.class); String sql = “select * from student where sid=?”; student stu = qr.query(sql, rsh, “1007”);} //BeanListHandler用于处理多行结果集,把多个结果分别封装成对象,并且添加到一个集合中 //不过得到的结果需要进行强转,可以使用增强for循环集合的遍历。 public void fun5() { QueryRunner qr = new QueryRunner(JDBCUtils.getDataSouse()); String sql = “select * from student”; List rshList = (List) new BeanListHandler(student.class); for(student L:rshList) { System.out.println(L); } } //MapHandler是把得到的单行结果集封装到一个map中 //其中map的键对应的是列名称,值对应的是列的值 。 public void fun6() throws SQLException { QueryRunner qr = new QueryRunner(JDBCUtils.getDataSouse()); String sql = “select * from student where id=?”; Map<String,Object> map = qr.query(sql, new MapHandler(),“1003”); System.out.println(map); }
//MapListHandler用来处理多行结果集,是把多行结果集中的每行数据封装成一个对象在map中,然后把多个Map //封装到一个集合中,写成了List<Map<String,Object>> public void fun7() throws SQLException { QueryRunner qr = new QueryRunner(JDBCUtils.getDataSouse()); String sql = “select * from student”; List<Map<String,Object>> mapList = qr.query(sql, new MapListHandler()); for(Map<String,Object> map:mapList) { System.out.println(map); } } //用来处理单列多(单)行的数据,封装到集合中 public void fun8() throws SQLException { QueryRunner qr = new QueryRunner(JDBCUtils.getDataSouse()); String sql = “select sname from student”; List nameList = qr.query(sql, new ColumnListHandler()); System.out.println(nameList); } //scalarHandler通常用在聚合函数查询的结果集处理,对单列单行进行处理 public void fun9() throws SQLException { QueryRunner qr = new QueryRunner(JDBCUtils.getDataSouse()); String sql = “select count(1) from student”; //这是个重点如果你此时强转用的是Integer 或者long类型的话,都是不行的,因为数据类型的大小可能 //不够使用发的,比如long类型的可以容纳20的阶乘,但是21的阶乘就超出范围,但是数据类型共同的父类 //就是Number,用这个是绝对不会出现超出范围的情况 //处理方法可以是,number.intValue(),或者是number.LongValue(); Number num = (Number)qr.query(sql, new ScalarHandler()); System.out.println(num.intValue()); } }