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 rsh = new BeanHandler(javaBean.class);
本方法多用于在 处理把单行结果集封装成JavaBean对象。(对象时通过反射完成创建的)
*BeanListHandler
List list = > new BeanListHandler(javaBean.class);
本方法多用于把多行结果集封装成对象,并且把对象添加到集合中,新版本中可能不需要进行类型的转换,
的到集合可以通过foreach循环来进行遍历。
*MapHandler
Map map = new MapHandler();
本方法是用来吧单行结果集封装到一个Map中其中map的键是表中的列名称,值对应表的列值。
*MapListHandler
List> 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 map = qr.query(sql, new MapHandler(),"1003");
System.out.println(map);
}
//MapListHandler用来处理多行结果集,是把多行结果集中的每行数据封装成一个对象在map中,然后把多个Map
//封装到一个集合中,写成了List>
public void fun7() throws SQLException {
QueryRunner qr = new QueryRunner(JDBCUtils.getDataSouse());
String sql = "select * from student";
List> mapList = qr.query(sql, new MapListHandler());
for(Map 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());
}
}