JDBC 之 DbUtils

DbUtils

commons-dbutils Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能

 

QueryRunner

该类简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。

QueryRunner类提供了两个构造方法:

默认的构造方法

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

 

主要方法:

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的简单的使用:

package com.jdbc.dbutils;

import com.jdbc.beans.Persion;
import com.jdbc.utils.JDBCTools;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.*;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

public class DbUtilsTest {

    public void test(){
        QueryRunner queryRunner=new QueryRunner();
        Connection connection= JDBCTools.getConnection();
        String sql="insert into classes values('xxx',29,'nan',?)";
        try {
            queryRunner.update(connection,sql,120);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCTools.release(connection,null);
        }
    }


    /**
     * 测试查询方法ResultSetHandler
     */
    public void testQuery() {
        QueryRunner queryRunner=new QueryRunner();
        Connection connection = JDBCTools.getConnection();
        String sql="select * from classes where name='xxx'";
        try {
            queryRunner.query(connection, sql, new ResultSetHandler<Persion>() {
                @Override
                public Persion handle(ResultSet resultSet) throws SQLException {
                    if(resultSet.next()){
                        String name = resultSet.getString(1);
                        int age = resultSet.getInt(2);
                        String string = resultSet.getString(3);
                        int anInt = resultSet.getInt(4);
                        Persion persion = new Persion(name, age, string, anInt);
                        System.out.println(persion);
                    }
                    return null;
                }
            });
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCTools.release(connection,null);
        }
    }


    /**
     * 测试查询方法BeanListHandler
     */
    public void testBeanlisthandler() {
        QueryRunner queryRunner=new QueryRunner();
        Connection connection = JDBCTools.getConnection();
        String sql="select * from classes where name='xxx'";
        try {
            List<Persion> query = queryRunner.query(connection, sql, new BeanListHandler<Persion>(Persion.class));
            System.out.println(query);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCTools.release(connection,null);
        }
    }


    /**
     * 测试查询方法BeanHandler
     * 注意sql的别名
     */
    public void testBeanhandler() {
        QueryRunner queryRunner=new QueryRunner();
        Connection connection = JDBCTools.getConnection();
        String sql="select name,age,xiangbie xingbie,xuehao id from classes where name='xxx'";
        try {
            Persion query = queryRunner.query(connection, sql, new BeanHandler<Persion>(Persion.class));
            System.out.println(query);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCTools.release(connection,null);
        }
    }

    /**
     * 测试查询方法MapHandler
     * 返回sql对应的第一条记录对应的map对象;
     * map中key是列的名字(不是别名)
     */
    public void testMapHandler(){
        Connection connection = null;
        QueryRunner queryRunner = new QueryRunner();

        String sql="select * from classes where name='xxx'";

        try {
            connection = JDBCTools.getConnection();
            Map<String, Object> map = queryRunner.query(connection,
                    sql, new MapHandler());
            System.out.println(map);
        } catch (Exception e) {
            e.printStackTrace();
        } finally{
            JDBCTools.release(connection,null);
        }
    }


    /**
     * 测试查询方法MapHandler
     * map中key是列的名字(不是别名)
     */
    public void testMapListHandler(){
        Connection connection = null;
        QueryRunner queryRunner = new QueryRunner();

        String sql="select * from classes where name='xxx'";

        try {
            connection = JDBCTools.getConnection();
            List<Map<String, Object>> query = queryRunner.query(connection,
                    sql, new MapListHandler());
            System.out.println(query);
        } catch (Exception e) {
            e.printStackTrace();
        } finally{
            JDBCTools.release(connection,null);
        }
    }

    /**
     * ScalarHandler: 可以返回指定列的一个值或返回一个统计函数的值.
     * 如果是多列的话,默认返回第一列的值;
     */
    public void testScalarHandler(){
        Connection connection = null;
        QueryRunner queryRunner = new QueryRunner();

        String sql="select xuehao from classes where name='xxx'";
        try {
            connection = JDBCTools.getConnection();
            Object count = queryRunner.query(connection, sql,
                    new ScalarHandler());
            System.out.println(count);//输出的是xuehao;
        } catch (Exception e) {
            e.printStackTrace();
        } finally{
            JDBCTools.release(connection,null);
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值