Apache dbutils使用示例

来源:互联网 发布:淘宝刷单的后果 编辑:程序博客网 时间:2024/05/19 19:59

commons-dbutils是Apache组织提供的一个开源JDBC工具类,是对JDBC简单的封装,使用dbutils在不影响性能的情况下,能极大第简化对数据库的操作;dbutils有两个API:

org.apache.commons.dbutils.QueryRunnerorg.apache.commons.dbutils.ResultSetHandler

dbutils jar包

commons-dbutils-1.2.jar

下面分别描述下这两个类,首先,QueryRunner类,该类简单化了SQL查询,它与ResultSetHander组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量.QueryRunner类提供了两个构造方法:

    默认的构造方法
需要一个 javax.sql.DataSource 来作参数的构造方法

   QueryRunner类的主要方法:

public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh) throws SQLException:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭。此方法提供的conn,需手动关闭,这个可以用在事物中执行多条sql语句public Object query(String sql, Object[] params, ResultSetHandler rsh) throws SQLException: 几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源(DataSource) 或使用的setDataSource 方法中重新获得 Connection, 该方法会自行处理PreparedStatement和ResultSet的创建和关闭。连接会被连接池自动回收public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException : 执行一个不需要置换参数的查询操作。public int update(Connection conn, String sql, Object[] params) throws SQLException:用来执行一个更新(插入、更新或删除)操作。这个可以用在事物中执行多条sql语句public int update(Connection conn, String sql) throws SQLException:用来执行一个不需要置换参数的更新操作。int[] batch(Connection conn, String sql, Object[][] params)           Execute a batch of SQL INSERT, UPDATE, or DELETE queries. ,批处理SQL语句,需要数据库连接需要手动关闭,该方法会自行处理PreparedStatement和ResultSet的创建和关闭 int[] batch(String sql, Object[][] params)           Execute a batch of SQL INSERT, UPDATE, or DELETE queries. ,连接会被连接池自动回收DataSource getDataSource()           Returns the DataSource this runner is using.  int update(String sql)           Executes the given INSERT, UPDATE, or DELETE SQL statement without any replacement parameters.  int update(String sql, Object param)           Executes the given INSERT, UPDATE, or DELETE SQL statement with a single replacement parameter.  int update(String sql, Object[] params)           Executes the given INSERT, UPDATE, or DELETE SQL statement.

ResultSetHandler接口

该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式,其提供了一个单独的方法

Object handle (java.sql.ResultSet .rs)
ResultSetHandler 接口的实现类

ArrayHandler:把结果集中的第一行数据转成对象数组。
ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。
BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。

ColumnListHandler:将结果集中某一列的数据存放到List中。
KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。
MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List

//示例:

        //工具类,jdbcC3p0Utils,定义了获取DataSource的接口和getConnection的接口,这里使用C3P0创建连接池

package cn.itcast.utils;import java.sql.Connection;import java.sql.SQLException;import javax.sql.DataSource;import com.mchange.v2.c3p0.ComboPooledDataSource;public class JdbcC3p0Utils {private static DataSource ds = null;static{ds = new ComboPooledDataSource("mysql");}public static DataSource getDataSource(){return ds;}public static Connection getConnection(){try {if(ds!=null)return ds.getConnection();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{return null;}}}

//不带connection的Update方法示例

//更新操作

@Testpublic void update() throws SQLException{String sql = "update account set money=money+10";Object param = "aaa";QueryRunner qr = new QueryRunner(JdbcC3p0Utils.getDataSource());//重连接池中自动获取连接,执行完sql语句后,连接自动被连接池收回qr.update(sql);//不带参数的操作}
//删操作
@Testpublic void del() throws SQLException{String sql = "delete from account where money<?";Object param = 1000;  //preparstatement 和resultset创建和关闭将会自动被执行QueryRunner qr = new QueryRunner(JdbcC3p0Utils.getDataSource());qr.update(sql, param); //带参数操作}
//增操作
@Testpublic void add() throws SQLException{String sql = "insert into account(name,money) values(?,?)";Object[] param = {"fff", 2000};QueryRunner qr = new QueryRunner(JdbcC3p0Utils.getDataSource());qr.update(sql, param); //参数存在数组中}

//带connection的update方法示例

此中方法,需要手动指定数据库连接,操作完成后再手动关闭此连接

//改操作
public void update() throws SQLException{Connection conn = JdbcC3p0Pools.getConnection2();//手动创建一个连接String sql = "update account set money=money-100";QueryRunner qr = new QueryRunner(); //使用默认的构造函数qr.update(conn, sql);conn.close();//手动关闭连接}
//删操作
public void del() throws SQLException{Connection conn = JdbcC3p0Pools.getConnection2();//手动创建一个连接String sql = "delete from account where money<?";Object param = 1000;QueryRunner qr = new QueryRunner(); //使用默认的构造函数qr.update(conn, sql, param);conn.close();//手动关闭连接}
//增操作
@Testpublic void update() throws SQLException{Connection conn = JdbcC3p0Pools.getConnection2();//手动创建一个连接String sql = "insert into account(name,money) values(?,?)";Object[] param = {"fff", 2000};QueryRunner qr = new QueryRunner();qr.update(conn,sql, param); //参数存在数组中conn.close();}
dbutils的查询操作,介绍查询操作前,先介绍下ResultSetHander接口,此接口负责对查询结果进行转换;下面分别介绍dbutils中实现了此接口的各个类
ArrayHandler
此类会将查询结果集中的第一行结果存到一个数组对象中,示例:
@Testpublic void arrayHandlerTest() throws SQLException{String sql = "select * from account";QueryRunner qr = new QueryRunner(JdbcC3p0Utils.getDataSource());Object[] array = (Object[]) qr.query(sql, new ArrayHandler());System.out.println(Arrays.asList(array));}
结果:
[2, bbb, 710.0]
ArrayLishHandler
此类会将查询结果集中的每一行都存到一个数组对象中,然后再将这些数组对象存到一个list列表中,示例:
@Testpublic void arrayListHandlerTest() throws SQLException{String sql = "select * from account";QueryRunner qr = new QueryRunner(JdbcC3p0Utils.getDataSource());List<Object[]> lst = (List) qr.query(sql, new ArrayListHandler());for(Object[] array:lst){System.out.println(Arrays.asList(array));}}
结果:
[2, bbb, 710.0][3, ccc, 610.0][12, eee, 610.0][13, fff, 1600.0]
BeanHandler
这个类会结果集的第一行封装到对应的javabean中去,示例:
@Testpublic void beanHandlerTest() throws SQLException{String sql = "select * from account";QueryRunner qr = new QueryRunner(JdbcC3p0Utils.getDataSource());Account account = (Account) qr.query(sql, new BeanHandler(Account.class));//封装到Account类中去System.out.println(account.getId()+"\t"+account.getName()+"\t"+account.getMoney());}
结果:
2bbb710.0
BeanListHander
此类将查询到的结果集的每一行数据都封装到对应的javabean对象中去,然后再将这些对象存到一个list中去,示例:
@Testpublic void beanListHandlerTest() throws SQLException{String sql = "select * from account";QueryRunner qr = new QueryRunner(JdbcC3p0Utils.getDataSource());List<Account> list = (List) qr.query(sql, new BeanListHandler(Account.class));for(Account account:list){System.out.println(account.getId()+"\t"+account.getName()+"\t"+account.getMoney());}}
结果:
2bbb710.03ccc610.012eee610.013fff1600.0

ColumnListHander

将查询到的结果集的某一列数据封装到一个list中去,有如下构造函数

ColumnListHandler() //默认第一列ColumnListHandler(int columnIndex) //通过序号指定某一列ColumnListHandler(String columnName)//通过列名指定某一列

示例:

@Testpublic void columnListHandlerTest() throws SQLException{String sql = "select * from account";QueryRunner qr = new QueryRunner(JdbcC3p0Utils.getDataSource());List<Object> list = (List) qr.query(sql, new ColumnListHandler(2));System.out.println(list);}

结果:

[bbb, ccc, eee, fff]
KeyedHandler

此类会将查到的结果集的每一行存到一个map中,key值为列值,value为每行列对应的值;然后再将这个map存到另一个map里。其key为指定的key;KeyedHander构造函数有如下几种:

KeyedHandler()

KeyedHandler(int columnIndex)

KeyedHandler(String columnName)

KeyedHandler(RowProcess convert)

如下所示:

aaa
id1nameaaamoney1000
bbb
id2namebbbmoney2000
示例:

@Testpublic void keyedHandlerTest() throws SQLException{String sql = "select * from account";QueryRunner qr = new QueryRunner(JdbcC3p0Utils.getDataSource());Map<String,Map> map = (Map) qr.query(sql, new KeyedHandler(2));//指定第二列的,即name对应的值为keyfor(Entry<String, Map> entry:map.entrySet()){System.out.println(entry.getKey()+":"+entry.getValue());Map<String, Object> map2 = entry.getValue();for(Entry<String, Object> entry2: map2.entrySet()){System.out.println("\t"+entry2.getKey()+":"+entry2.getValue());}}}
结果:

fff:{id=13, name=fff, money=1600.0}id:13name:fffmoney:1600.0ccc:{id=3, name=ccc, money=610.0}id:3name:cccmoney:610.0bbb:{id=2, name=bbb, money=710.0}id:2name:bbbmoney:710.0eee:{id=12, name=eee, money=610.0}id:12name:eeemoney:610.0

MapHandler

将结果集中的第一行数据封装到一个Map中,列名为key,对应值为value.

示例:

@Testpublic void MapHandlerTest() throws SQLException{String sql = "select * from account";QueryRunner qr = new QueryRunner(JdbcC3p0Utils.getDataSource());Map<String, Object> map = (Map<String, Object>) qr.query(sql, new MapHandler());//指定第二列的,即name对应的值为keyfor(Entry<String, Object>entry: map.entrySet()){System.out.println(entry.getKey()+"="+entry.getValue());}}
结果

id=1name=aaamoney=3100.0

MapListHandler

将结果集中的每一行都封装到一个Map对象中,列名为key,对应值为value,让后再将这些Map对象封装到一个list中,示例:

@Testpublic void MapListHandlerTest() throws SQLException{String sql = "select * from account";QueryRunner qr = new QueryRunner(JdbcC3p0Utils.getDataSource());List<Map> lst = (List<Map>) qr.query(sql, new MapListHandler());//指定第二列的,即name对应的值为keyfor(Map<String, Object> me: lst){System.out.println("----------");for(Entry<String, Object>entry: me.entrySet()){System.out.println(entry.getKey()+"="+entry.getValue());}}}

结果:

----------id=1name=aaamoney=3100.0----------id=5name=fffmoney=1800.0----------id=6name=fffmoney=1900.0----------id=8name=111money=900.0----------id=9name=222money=1900.0----------id=10name=333money=2900.0----------id=11name=111money=900.0----------id=12name=222money=1900.0----------id=13name=333money=2900.0




0 0
原创粉丝点击