Apache—DBUtils框架

 Apache—DBUtils框架
一.简介
commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,
它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。
API介绍:
org.apache.commons.dbutils.QueryRunner
org.apache.commons.dbutils.ResultSetHandler
工具类
org.apache.commons.dbutils.DbUtils

二.DbUtils类
DbUtils :提供如关闭连接、装载JDBC驱动程序等常规工作的工具类,里面的所有方法都是静态的。主要方法如下:
public static void close(…) throws java.sql.SQLException: DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是NULL,如果不是的话,它们就关闭Connection、Statement和ResultSet。


public static void closeQuietly(…): 这一类方法不仅能在Connection、Statement和ResultSet为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLEeception。


public static void commitAndCloseQuietly(Connection conn): 用来提交连接,然后关闭连接,并且在关闭连接时不抛出SQL异常。


public static boolean loadDriver(java.lang.String driverClassName):这一方装载并注册JDBC驱动程序,如果成功就返回true。使用该方法,你不需要捕捉这个异常ClassNotFoundException。

三.QueryRunner类
该类简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。
QueryRunner类提供了两个构造方法:
默认的构造方法
需要一个 javax.sql.DataSource 来作参数的构造方法。


QueryRunner类的主要方法
public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh) throws SQLException:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭

public Object query(String sql, Object[] params, ResultSetHandler rsh) throws SQLException: 几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源(DataSource) 或使用的setDataSource 方法中重新获得 Connection。

public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException : 执行一个不需要置换参数的查询操作。

public int update(Connection conn, String sql, Object[] params) throws SQLException:用来执行一个更新(插入、更新或删除)操作。

public int update(Connection conn, String sql) throws SQLException:用来执行一个不需要置换参数的更新操作。

利用DbUtils实现CRUD例子

1.JdbcUtils工具类,采用C3P0

public class JdbcUtils {

private static DataSource ds; //初始化连接池对象
static{
try {
ds = new ComboPooledDataSource(); //创建连接池
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}

//加载驱动,获取链接
public static Connection getConnection() throws SQLException{
Connection conn = ds.getConnection(); //获得连接
return conn;
}

//释放资源
public static void release(Connection conn,Statement st,ResultSet rs){
try{
if(rs!=null)
rs.close();
}catch (Exception e) {
e.printStackTrace();
rs=null;
}
try{
if(st!=null) st.close();
}catch (Exception e) {
e.printStackTrace();
st=null;
}
try{
//MyConnection
if(conn!=null) conn.close();
}catch (Exception e) {
e.printStackTrace();
conn=null;
}
}

2. 编写Dao,使用DBUtils

//使用dbutils完成数据库的crud


public class Demo1 {
@Test 添加方法
public void add() throws SQLException{

//获得DbUtils工具中的发送对象,传递给他一个连接池
QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());

//sql语句,以数组的形式传递参数

String sql = "insert into users(id,name,password,email,birthday) values(?,?,?,?,?)";
Object params[] = {1,"aaa","123","aa@sina.com",new Date()};

//调用dbutils工具中的更新方法
runner.update(sql, params);
}

@Test 更新方法
public void update() throws SQLException{
QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
String sql = "update users set name=? where id=?";
Object params[] = {"xxx",1};
runner.update(sql, params);
}

@Test 删除方法
public void delete() throws SQLException{
QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
String sql = "delete from users where id=?";
runner.update(sql, 1);
}

@Test 查找方法
public void find() throws SQLException{
QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
String sql = "select * from users where id=?";
User user=(User) runner.query(sql, 1, new BeanHandler(User.class)); //其实dbutils和昨天自定义框架的实现是一样的,都是需要提供一个类供转换器封装对象
System.out.println(user);
}

@Test 查找所有信息方法
public void getAll() throws SQLException{
QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
String sql = "select * from users";
List list = (List) runner.query(sql, new BeanListHandler(User.class));
System.out.println(list);
}

//批量向表中插入10条记录
@Test
public void batch() throws SQLException{
QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
String sql = "insert into users(id,name) values(?,?)";

Object params[][] = new Object[10][]; //以二维数组的形式传递数据
for(int i=0;i<params.length;i++){
params[i] = new Object[]{i+1,"aa"+i}; //遍历设置属性
}
runner.batch(sql, params); //批量发送语句
}
}

四.ResultSetHandler接口
该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。
ResultSetHandler 接口提供了一个单独的方法:Object handle (java.sql.ResultSet .rs)


ResultSetHandler 接口的实现类
ArrayHandler:把结果集中的第一行数据转成对象数组。
ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。

ScalarHandler把结果集中的第一行数据封装到一个对象中返回

BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。


ColumnListHandler:将结果集中某一列的数据存放到List中。
KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。


MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List

//测试dbutils框架的结果集处理器
public class Demo2 {

@Test 把结果集中的第一行数据转成对象数组。
public void testArrayHandler() throws SQLException{

QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
String sql = "select *from users";
Object result[] = (Object[]) runner.query(sql, new ArrayHandler());
System.out.println(result);
}


@Test 将结果集中某一列的数据存放到List中
public void testColumnListHandler() throws SQLException{
QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
String sql = "select *from users";
List list = (List) runner.query(sql, new ColumnListHandler("id"));
System.out.println(list);
}

@Test 将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。
public void testKeyedHandler() throws SQLException{
QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
String sql = "select *from users";
Map<Integer,Map<String,Object>> map = (Map) runner.query(sql, new KeyedHandler("id"));

for(Map.Entry<Integer, Map<String,Object>> entry : map.entrySet()){ //map.entryset
Map<String,Object> innermap = entry.getValue();
for(Map.Entry<String, Object> innerEntry : innermap.entrySet()){
System.out.println(innerEntry.getKey() + "=" + innerEntry.getValue());
}
}
}

@Test 把结果集中的第一行数据封装到一个对象中返回
public void testScalarHandler() throws SQLException{
QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
String sql = "select count(*) from users";
long count = (Long) runner.query(sql, new ScalarHandler(1)); //Long,在数据库中int是bigint
System.out.println(count);
}


}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值