之前一直对apache的DbUtils很好奇,也很佩服其中的设计上的智慧。于是就自己模拟实现了一个更加简便的小框架。我们只需要在配置文件中写上数据库层面的连接信息,就可以随心所欲的实现自己的需求了。

设计思路

依赖

  • apache-commons-logging.jar
  • apache-commons-beanutils.jar
  • mysql-connector.jar

技术细节

其中最主要的是是使用了反射技术和泛型操作,实现了对bean对象的属性的解析以及实例化相关的bean对象。

public class Converter<T> {

    public static <T> T convert2Bean(ResultSet rs, Class<T> bean) throws Exception {
        Field[] fields = bean.getDeclaredFields();
        T obj = bean.newInstance();
        for (Field field : fields) {
            String pname = field.getName();
            BeanUtils.setProperty(obj, pname, rs.getObject(pname));
        }

        return obj != null ? obj : null;
    }

    public static <T> List<T> convert2BeanList(ResultSet rs, Class<T> bean) throws Exception {
        Field[] fields = bean.getDeclaredFields();
        List<T> lists = new ArrayList<T>();
        while (rs.next()) {
            T obj = bean.newInstance();
            for (Field field : fields) {
                String pname = field.getName();
                BeanUtils.setProperty(obj, pname, rs.getObject(pname));
            }
            lists.add(obj);
        }
        return lists != null ? lists : null;
    }

}

确保数据库中字段与Bean的属性保持一致,否则convert过程会失效 :-)

测试代码

这里没有将完整的代码贴出来,但是看到

List<DateTest> dates = runner.query(conn, sql, new BeanListHandler<DateTest>(DateTest.class));

List<DateTest> dates = runner.query(conn, sql, new BeanListHandler<DateTest>(DateTest.class),params);

足以说明问题了吧。

public static void main(String[] args) throws Exception {
        String sql = "select * from datetest";
        QueryRunner runner = new QueryRunner();
        DbHelper.register();
        Connection conn = DbHelper.getConn();
        List<DateTest> dates = runner.query(conn, sql, new BeanListHandler<DateTest>(DateTest.class));
        for (DateTest date : dates) {
            System.out.println(date.toString());
        }
        System.out.println("------------------------------------------------------");
    }
public static void main(String[] args) throws Exception {
        String sql = "select * from dataset where name=? and age=?";
        Object[] params = {'mark',20};
        QueryRunner runner = new QueryRunner();
        DbHelper.register();
        Connection conn = DbHelper.getConn();
        List<DateTest> dates = runner.query(conn, sql, new BeanListHandler<DateTest>(DateTest.class),params);
        for (DateTest date : dates) {
            System.out.println(date.toString());
        }
        System.out.println("------------------------------------------------------");
    }

Quick Start

源码以及打包好的jar文件,已上传至我的GitHub上面了。希望有兴趣的朋友能一起研究一下,让我们一起为开源奉献自己的光和热吧。

点击获取源码及jar

自制DbHelper实现自动化数据库交互的更多相关文章

  1. .NET应用程序与数据库交互的若干问题

    我们知道,在应用程序中与数据库进行交互是一个比较耗时的过程,首先应用程序需要与应用程序建立连接,然后将请求发送到数据库,数据库执行操作,然后将结果集返回.所以在程序中,要尽量晚的与数据库建立连接,并且 ...

  2. 说说Java程序和数据库交互的乱码解决

    本文就本人遇到的问题进行讲解 1.通过jdbc直连方式,连接Mysql数据库,从程序向数据库中写入数据出现的乱码解决方案. 当通过程序向Student表中写入一条数据时,写入数据库的内容会产生乱码. ...

  3. OAF_JDBC系列1 - 数据库交互取值方式(案例)

    2014-06-15 Created By BaoXinjian

  4. 辅助的写与数据库交互的XML文件的类

    现在企业级WEB应用中与数据库交互的XML文件都是通过插件自动生成的,不过有些时候修改比较老的项目的时候也是需要手动的来做这一动作的!如下代码就是一个实现上述的功能的辅助类,在此记录一下以备后用! p ...

  5. slivelight5和数据库交互

    最近开始研究sliverlight和数据库交互了,无奈网上资料较少,查阅了大量资料终于成功了,但是我记得还有别的方法,希望大家讨论一下 数据访问层我的用的是ado.net实体数据模型 然后新建了一个w ...

  6. Java豆瓣电影爬虫——减少与数据库交互实现批量插入

    节前一个误操作把mysql中record表和movie表都清空了,显然我是没有做什么mysql备份的.所以,索性我把所有的表数据都清空的,一夜回到解放前…… 项目地址:https://github.c ...

  7. IDEA项目搭建八——使用MybatisPlus简化数据库交互

    一.MybatisPlus简化数据库交互 我们使用Mybatis发现需要在mapper.xml中写很多重复的简单CRUD(增删改查),使用MybatisPlus可以大大简化这部分代码,官方文档http ...

  8. FineReport单行与数据库交互的方法

    1.   问题描述 我们在做一张报表填报的时候经常会遇到需要在一行进行添加动作,将该行数据直接与数据库交互,执行存储过程过程.我们可以通过每一行增加帆软“插入”按钮实现插入动作,并且在控件事件中增加和 ...

  9. java与数据库交互常用到的一些方法

    下面我整理了一下java中常用的几个与数据库交互的常用方法,仅供参考: 1.执行SQL(dao层的实现类中) (1)SQL查询: //import org.hibernate.Query;//impo ...

随机推荐

  1. python AES加密解密 pycryptodome

    环境 pyhton3.6 博主为了解码 AES 用了1天的时间,安了各种包,然而走了很多坑,在这里给大家提供一个简便的方法 首先在命令行(推荐)  pip install Crypto 你会发现安装下 ...

  2. Redis安装与卸载

    Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.它支持丰富的数据类型,和高速的内存读写.正在逐步取代memca ...

  3. [COGS 2401]Time is Money

    Description 题库链接 给你 \(n\) 个节点 \(m\) 条边的无向连通图.每条边有两个权值 \(c,t\) ,要你生成一棵边集为 \(\mathbb{E}\) 的生成树使得 \[\su ...

  4. no zuo no die

    #include <iostream> #include <cstring> #include <cstdio> using namespace std; name ...

  5. [HNOI2014]江南乐

    Description 小A是一个名副其实的狂热的回合制游戏玩家.在获得了许多回合制游戏的世界级奖项之后,小A有一天突然想起了他小时候在江南玩过的一个回合制游戏.    游戏的规则是这样的,首先给定一 ...

  6. [bzoj1558][JSOI2009]等差数列

    题目:给定n个数,m个操作,每次给一段区间加一个等差数列或者询问一段区间至少要用多少个等差数列来表示.$n,m\leqslant 10^{5}$ 题解:老套路,维护差分数组,修改操作变成了两个单点加和 ...

  7. Linux LCD 显示图片【转】

    转自:https://blog.csdn.net/niepangu/article/details/50528190 BMP和JPEG图形显示程序1)  在LCD上显示BMP或JPEG图片的主流程图首 ...

  8. CentOs源码安装mysql-5.6.34(cmake)

    安装环境: VM11 CentOs6.7x86_64(Basic Server +Base System:Base\Compatlibility libraries\Debuggin Tools+De ...

  9. SQL Server 2008 维护计划实现数据库备份(最佳实践)

    一.背景 之前写过一篇关于备份的文章:SQL Server 维护计划实现数据库备份,上面文章使用完整备份和差异备份基本上能解决数据库备份的问题,但是为了保障数据更加安全,我们需要再次完善我们的备份计划 ...

  10. MySQL创建用户与授权(CentOS6.5)

    1.相关SQL语句 #创建用户与授权方法 ##本地访问 create user 'zend'@'localhost' IDENTIFIED BY '123456'; grant ALL privile ...