DBUtils工具的使用和详解

DbUtils 是一个jdbc的工具,使用的范围内非常广,主要是为了简化jdbc的代码。
核心类:QueryRunner; ResultSetHandler(是一个接口,主要是完成ORM映射,把结果街转化成
我们需要的java对象)
核心方法:
 * update();用来执行DDL(DDL:create alert,drop;);
 * query();用来执行DML(DML:insert update delete;);
 * batch(); 用来执行批处理;
调用本方法之前,需要先创建对象,代码如下:
QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
//当使用的是无参的构造器时,可以不提供连接池对象,但是在接下来的调用方法是,必须为方法提供Connection
对象。

对于结果集的处理有以下几个结果集处理器:
*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<Object> 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<student> rsh = new BeanHandler<student>(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<student> rshList = (List<student>) new BeanListHandler<student>(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<Object> 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());
   }
}

猜你喜欢

转载自blog.csdn.net/dawiebazhanlang/article/details/80320996
今日推荐