`
kitssilence
  • 浏览: 12737 次
  • 性别: Icon_minigender_1
  • 来自: 襄樊
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Dbutil 使用总结

阅读更多

增删改查,想必是每个程序员都会遇到的数据库操作。 作为java程序员来说,同样如此,而且操作的手段可多了。 比如 JDBC,Hiberante, Ibaties等等。
JDBC 太啰嗦了,现在鲜有人写,Hiberante 太复杂, Ibaties居于2者之间。 有没有更简单的? 无需配置,轻量级,编写简单,易学易用?我想 Dbutils 就是。

官方网站: http://commons.apache.org/dbutils/

对 DBUtils 的感觉,优点与不足,看我一一道来:
1. 让我爱上DBUtils的原因是因为它很小,涉及面不多,会jdbc就会它,学习成本几乎为0,仿照官网的例子上手只要5分钟,简单才是王道。

2. 没有那么多异常处理的烦恼,当年学JDBC给我的第一映像就是一层又一层的try…catch….

3. 包装结果集,你有我也有,让大量的包装实现(将结果集转换成List,Array,Map,javabean….)代码化为乌有。代码看看谁比谁清爽。而且可以自定义。ibaties还需要配置

4. 性能,用什么操作数据库最快:JDBC。 而DBUtils,就是JDBC的简单封装。

5. 关连查询,尤其是一对多。其实Hiberante和ibaties也是分2步骤查询的。优势也没多大

6. 插入数据主键返回,这点在实现上不足。我记得ibaties也是在执行完成插入之后,又执行了“SELECT @@IDENTITY AS ID” 的操作。同样,这里也可以在执行完成后,执行SELECT LAST_INSERT_ID()获得自增主键。这里或者干脆自己写一个,怎么写?等一会就列出来。

/**
     * 插入数据库,返回自动增长的主键
     *
     * @param sql -
     *            执行的sql语句
     * @return 主键
     */

    public int insertForKey(String sql, Object[] params) {
        int key = 0;

        try {
            PreparedStatement statement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

            ParameterMetaData pmd = statement.getParameterMetaData();
            if (params.length < pmd.getParameterCount()) {
                throw new SQLException("Too many parameters: expected " + pmd.getParameterCount() + ", was given " + params.length);
            }

            for (int i = 0; i < params.length; i++) {
                statement.setObject(i + 1, params[i]);
            }

            statement.executeUpdate();
            ResultSet resultSet = statement.getGeneratedKeys();
            if (resultSet.next()) {
                key = resultSet.getInt(1);
            }
        }
        catch (SQLException e) {
            e.printStackTrace();
        }

        return key;
    }

7. 最大不足
1. 事务处理。这个一般放在service层,ibaties和hibernate都自己实现和封装了。现在要不自己实现,要不取它山之石。这个地方提供的也就是原始的jdbc事务方式,当然这个也不能归责于dbutils,毕竟,它仅仅是说对jdbc的封装
2. 和Hibernate这种全自动的orm mapping来说,其中sql是自己写的,如果一个库有50个表,一个表中有50个字段。 难道insert的时候要自己一个一个的拼装column吗。(当然这里推荐通过反射的方式帮自己实现自动生成sql的方法)

项目运用:
目前用它写过2个小项目,感觉非常的不错。没遇到什么技术上不能实现的瓶颈。

基础封装分享DbUtils can be used to build a DAO framework though 这里和大家分享一下:

public class BaseDao<T> {

    private Class<T> clazz;

    @Resource(name = "dataSource")
    private DataSource datasource;

    protected static final Logger logger = LoggerFactory.getLogger("com.device.grant.dao");

    @SuppressWarnings("unchecked")
    public BaseDao() {
        this.clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }

    /**
     * 查询并转换成 List 集合列表
     *
     * @param sql -
     *            执行SQL
     *
     * @param params -
     *            SQL 必备参数
     * @return List<T> - 返回集合列表,没有则返回空集合
     */

    public List<T> queryList(String sql, Object[] params) {
        Connection connection = null;
        List<T> value = null;
        try {
            connection = datasource.getConnection();
            QueryRunner run = new QueryRunner();
            value = (List<T>) run.query(connection, sql, new BeanListHandler<T>(clazz), params);
        } catch (Exception e) {
            logger.error("queryList - the SQL is " + sql + ",params is " + params, e);

            value = Collections.emptyList();
        } finally {
            DbUtils.closeQuietly(connection);
        }

        return value;
    }

    /**
     * 获取单个 javaBean 对象
     *
     * @param sql -
     *            执行SQL脚本
     *
     * @param params -
     *            执行脚本参数
     * @return T - 查询的对象
     */

    public T get(String sql, Object[] params) {
        Connection connection = null;

        T object = null;
        try {
            connection = datasource.getConnection();
            QueryRunner run = new QueryRunner();
            object = run.query(connection, sql, new BeanHandler<T>(clazz), params);
        } catch (SQLException e) {
            logger.error("get - the sql is " + sql + ", params is " + params, e);
        } finally {
            DbUtils.closeQuietly(connection);
        }

        return object;
    }

    /**
     * 统计当前操作的记录数
     *
     * @param sql -
     *            统计SQL
     * @param params -
     *            参数
     * @return int - 返回的行数, -1 表示异常
     */

    public int count(String sql, Object[] params) {
        Connection connection = null;

        int count = -1;

        try {
            connection = datasource.getConnection();
            QueryRunner run = new QueryRunner();
            count = run.query(connection, sql, new ResultSetHandler<Integer>() {
                public Integer handle(ResultSet rs) throws SQLException {
                    rs.next();
                    return rs.getInt(1);
                }
            }, params);
        } catch (Exception e) {
            logger.error("count - the sql is " + sql + ", params is " + params, e);
        }finally {
            DbUtils.closeQuietly(connection);
        }

        return count;
    }

    /**
     * 修改
     *
     * @param sql -
     *            SQL 修改命令
     * @param params -
     *            修改执行参数
     *
     * @return boolean - 是否执行成功
     */

    public boolean update(String sql, Object[] params) {
        return deleteOrUpdateOrInsert(sql, params);
    }

    /**
     * 删除
     *
     * @param sql -
     *            SQL 删除命令
     * @param params -
     *            修改执行参数
     *
     * @return boolean - 是否执行成功
     */

    public boolean delete(String sql, Object[] params) {
        return deleteOrUpdateOrInsert(sql, params);
    }

    /**
     * 删除
     *
     * @param sql -
     *            SQL 删除命令
     * @param params -
     *            修改执行参数
     *
     * @return boolean - 是否执行成功
     */

    public boolean insert(String sql, Object[] params) {
        return deleteOrUpdateOrInsert(sql, params);
    }
   
    /**
     * 修改或删除或新增执行
     *
     * @param sql -
     *            SQL 命令脚本
     * @param params -
     *            参数
     * @return boolean - 执行结果
     */

    private boolean deleteOrUpdateOrInsert(String sql, Object[] params) {
        Connection connection = null;
        boolean flag = false;
        try {
            connection = datasource.getConnection();
            QueryRunner run = new QueryRunner();
            if (run.update(connection, sql, params) > 0) {
                flag = true;
            }
        } catch (Throwable e) {
            logger.error("deleteOrUpdateOrInsert- the sql is " + sql + ", params is " + params, e);
        } finally {
            DbUtils.closeQuietly(connection);
        }

        return flag;
    }
分享到:
评论

相关推荐

    Apache DBUtils使用总结

    在使用 DBUtils 时,需要注意以下几点: 1. **混用 JDBC 和 DBUtils**:DBUtils 并不是完全替代 JDBC 的解决方案,而是对其进行了一层简单的封装。在需要的地方,你可以将 DBUtils 与原生的 JDBC 代码混合使用,以...

    DButils使用实例

    总结来说,DButils作为一个优秀的数据库操作工具,极大地简化了Java程序员在处理数据库时的工作,提高了代码的可读性和维护性。通过学习和掌握DButils的使用,开发者可以更专注于业务逻辑,而不是基础的数据库操作。

    Dbutils学习源码总结

    apache下面有很多值得学习的开源项目,尤其是commons系列,在此,特封装了其组织下的dbutils根据,方便了喜欢使用sql开发的java朋友,里面有各种实用的封装类和对数据库操作的接口,欢迎下载!

    commons-dbutils使用简单范例--简化jdbc编程

    3. **执行SQL查询**:使用DBUtils的QueryRunner类,通过其`query()`或`execute()`方法执行SQL语句。`query()`用于查询,返回ResultSetHandler处理的结果;`execute()`用于更新操作,如插入、删除、更新。 4. **处理...

    dbutils

    3. **异常处理**:`dbutils` 使用统一的异常处理机制,将JDBC的检查异常转化为运行时异常,简化了异常处理流程。 4. **连接池集成**:虽然`dbutils` 不自带连接池,但它可以很好地与第三方连接池(如C3P0、DBCP、...

    -dbutils使用说明.pdf

    总结起来,Apache Commons dbutils是Java开发中一个强大的工具,它简化了JDBC操作,提高了开发效率,减少了出错的可能性。无论是在大型互联网项目还是小型应用中,dbutils都能作为一个可靠的助手,帮助开发者高效地...

    commons-dbutils-1.7.jar

    总结,Apache Commons DBUtils作为Java中的数据库操作利器,以其简洁、安全、高效的特点,极大地简化了开发人员与数据库交互的工作。它在处理日常的CRUD操作时表现出色,是Java开发者不可或缺的工具之一。了解并熟练...

    -dbutils使用说明.docx

    总结起来,这些知识点展示了如何使用Apache Commons DBUtils库进行数据库操作,包括连接管理、查询执行、结果处理以及基本的DAO设计模式。在实际项目中,这样的工具和设计可以大大提高开发效率和代码的健壮性。

    DBUtils操作数据库以及事物的管理

    DBUtils是一个轻量级的Java数据库访问工具类库,它简化了JDBC的使用步骤,使得开发者能够更方便地进行数据库操作。相比于传统的JDBC编程方式,DBUtils提供了更加简洁、高效的API,并且在一定程度上提高了代码的...

    dbutils数据库连接池

    总结起来,dbutils是一个强大的工具,可以帮助我们有效地管理数据库连接,提高应用程序的性能和稳定性。结合不同的数据库接口(如psycopg2),可以满足各种数据库操作需求。通过学习和实践,我们可以更好地理解和...

    dbutils框架

    总结,Apache DBUtils是一个强大的数据库操作助手,它的设计原则是简洁、高效,旨在降低数据库操作的复杂度。通过使用DBUtils,开发人员可以更加专注于业务逻辑,提高开发效率,同时得益于其良好的异常处理和资源...

    数据库连接池和DBUtils使用1

    总结来说,数据库连接池和DBUtils是Java开发中优化数据库性能的重要工具。通过合理使用,不仅可以提高程序效率,还能有效管理和监控数据库连接,降低系统资源消耗。无论是自定义连接池还是选择第三方库,理解其工作...

    DBUtils jar包 官方原版的

    总结起来,DBUtils是一个强大的Java数据库操作辅助工具,它简化了数据库连接的管理,提供了安全、高效的SQL执行机制,并允许开发者自定义结果处理,极大地提升了开发效率和代码质量。通过使用DBUtils jar包,我们...

    dbutils1.6

    总结来说,DBUtils 1.6是一个优秀的数据库操作工具,提供了高效、易用的API,使得JDBC编程变得更加简单。通过研究其源码和文档,开发者能够深入理解数据库操作的最佳实践,并将其应用于实际项目中,提升开发效率和...

    dbutils工具包和源文件

    3. **异常处理**: `dbutils` 使用`DBUtilsException` 抛出数据库相关的异常,这使得错误处理更为清晰。 4. **连接池支持**: 虽然`dbutils`自身不包含连接池,但它可以与第三方连接池如C3P0、DBCP或HikariCP等配合...

    dbutils jar包及使用介绍

    **dbutils jar包及使用介绍** Apache Commons DBUtils是一个轻量级的Java数据库连接工具库,它是Apache软件基金会的一个开源项目。它简化了数据库操作,为开发者提供了简单易用的API,使得处理JDBC(Java Database ...

    dbutils工具类的使用

    总结来说,dbutils是Java开发中一款实用的数据库操作工具,通过它我们可以更高效、安全地进行数据库操作,减少手动管理数据库连接的复杂性,提高开发效率。掌握dbutils的使用,无疑会提升开发者的代码质量,使项目...

    dbutils-1.7 bin和src

    在实际应用中,你可以这样使用DBUtils: ```java import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.ResultSetHandler; public class DBUtilsExample { public List&lt;User&gt; ...

    dbutils工具类

    总结来说,`dbutils`工具类简化了Java中的数据库操作,提供了一套简洁、高效的API,使得开发者可以更专注于业务逻辑,而不是底层的数据库操作。结合合适的连接池,`dbutils`能够在保持性能的同时,降低开发复杂度。...

    Commons DbUtils源码阅读之实例及测试应用

    总结来说,Apache Commons DbUtils是一个强大的数据库操作助手,它的源码阅读有助于我们更好地理解和掌握数据库操作的最佳实践。通过实例应用和测试,我们可以深入理解DbUtils的工作原理,并将其有效地应用到实际...

Global site tag (gtag.js) - Google Analytics