最近做了个后台应用程序,刚开始用Spring+iBatis来做的,后来因为种种原因,不让用Spring、iBatis以及一些开源的工具包。
 
于是用JDBC重写了原来的Service实现,项目做完了。
 
这个JDBC是以前业余时候写的,主要针对没有事物控制的应用,比如MySQL的一些应用。现在放出来大家评论评论不足,也好改进改进。
 
jdbc.properties
jdbc.url=jdbc:mysql://192.168.1.101:3306/testdb?autoReconnect=true&zeroDateTimeBehavior=convertToNull 

jdbc.username=root 

jdbc.password=leizhimin
 
DBToolkit.java
package lavasoft.common; 



import org.apache.commons.logging.Log; 

import org.apache.commons.logging.LogFactory; 



import java.io.IOException; 

import java.sql.*; 

import java.util.List; 

import java.util.Properties; 



/** 

* JDBC工具类 



* @author leizhimin 2009-11-24 9:28:03 

*/ 

public class DBToolkit


        private static final Log
log = LogFactory.getLog(DBToolkit.class); 

        private static String
url = null; 

        private static String
username = null; 

        private static String
password = null; 

        private static Properties
props = new Properties(); 



        static { 

                try { 

                        props.load(DBToolkit.class.getResourceAsStream("/jdbc.properties")); 

                } catch (IOException e) { 

                        log.error("#ERROR# :系统加载sysconfig.properties配置文件异常,请检查!",
e); 

                } 

                url = (props.getProperty("jdbc.url")); 

                username = (props.getProperty("jdbc.username")); 

                password = (props.getProperty("jdbc.password")); 

                //注册驱动类 

                try { 

                        Class.forName("com.mysql.jdbc.Driver"); 

                } catch (ClassNotFoundException e) { 

                        log.error("#ERROR# :加载数据库驱动异常,请检查!", e); 

                } 

        } 



        /** 

         * 创建一个数据库连接 

         * 

         * @return 一个数据库连接 

         */ 

        public static Connection
getConnection() { 

                Connection conn = null; 

                //创建数据库连接 

                try { 

                        conn = DriverManager.getConnection(url, username, password); 

                } catch (SQLException e) { 

                        log.error("#ERROR# :创建数据库连接发生异常,请检查!", e); 

                } 

                return conn; 

        } 



        /** 

         * 在一个数据库连接上执行一个静态SQL语句查询 

         * 

         * @param conn            数据库连接 

         * @param staticSql 静态SQL语句字符串 

         * @return 返回查询结果集ResultSet对象 

         */ 

        public static ResultSet
executeQuery(Connection conn, String staticSql) { 

                ResultSet rs = null; 

                try { 

                        //创建执行SQL的对象 

                        Statement stmt = conn.createStatement(); 

                        //执行SQL,并获取返回结果 

                        rs = stmt.executeQuery(staticSql); 

                } catch (SQLException e) { 

                        log.error("#ERROR# :执行SQL语句出错,请检查!\n" + staticSql, e); 

                } 

                return rs; 

        } 



        /** 

         * 在一个数据库连接上执行一个静态SQL语句 

         * 

         * @param conn            数据库连接 

         * @param staticSql 静态SQL语句字符串 

         */ 

        public static void executeSQL(Connection
conn, String staticSql) { 

                try { 

                        //创建执行SQL的对象 

                        Statement stmt = conn.createStatement(); 

                        //执行SQL,并获取返回结果 

                        stmt.execute(staticSql); 

                } catch (SQLException e) { 

                        log.error("#ERROR# :执行SQL语句出错,请检查!\n" + staticSql, e); 

                } 

        } 



        /** 

         * 在一个数据库连接上执行一批静态SQL语句 

         * 

         * @param conn        数据库连接 

         * @param sqlList 静态SQL语句字符串集合 

         */ 

        public static void executeBatchSQL(Connection
conn, List<String> sqlList) { 

                try { 

                        //创建执行SQL的对象 

                        Statement stmt = conn.createStatement(); 

                        for (String sql : sqlList) { 

                                stmt.addBatch(sql); 

                        } 

                        //执行SQL,并获取返回结果 

                        stmt.executeBatch(); 

                } catch (SQLException e) { 

                        log.error("#ERROR# :执行批量SQL语句出错,请检查!", e); 

                } 

        } 



        public static void closeConnection(Connection
conn) { 

                if (conn == null) return; 

                try { 

                        if (!conn.isClosed()) { 

                                //关闭数据库连接 

                                conn.close(); 

                        } 

                } catch (SQLException e) { 

                        log.error("#ERROR# :关闭数据库连接发生异常,请检查!", e); 

                } 

        } 

}
 
这个类的实现中,有几点说明下:
1、此类没有实例,一切静态化。
2、此类线程安全。
3、此类将数据库连接交给了使用者去控制,提高连接的利用率,常规的做法是每个SQL执行完成后,做一个关闭操作。
通过此类,实现了原来iBatis实现的DAO和Service,因为传递了连接,改用JDBC实现时候去掉了DAO层,只有Service层,Service中的每个操作数据库的方法都会接收一个数据库连接参数。 以方便更高层对Connection的利用,最大限度的利用数据库连接,从而提高系统的效率。
4、此类SQL异常时候,用户还有机会去关闭数据库连接。
5、此类没有事物控制,如果需要的话,可以在Service此工具类中跑出SQLException,然后在Service中调用的时候进行控制,一旦发生异常,则回滚。一切都交给开发者自行处理控制,相比框架式的一刀切更能灵活控制事物,并能最大限度利用数据库连接的资源。
6、此类的方法可以嵌套调用,为级联查询提供方便。以前iBatis的级联查询,我用此类全实现了。
 
此类也存在一些不足:
比如,无法去封装预定义SQL,也许有办法,但绝对不是轻而易举就能实现的。
此类也无法对结果集自动封装为JavaBean或者List集合,这是比较麻烦的,实际上要实现自动封装,Apache的Commons DBUtils做的比较好。

本文出自 “
” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/233549

自己实现的JDBC工具类的更多相关文章

  1. MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  2. MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  3. java使用注解和反射打造一个简单的jdbc工具类

    a simple jdbc tools 如有转载和引用,请注明出处,谢谢 1. 定义我们需要的注解 要想实现对数据库的操作,我们必须知道数据表名以及表中的字段名称以及类型,正如hibernate 使用 ...

  4. 开源JDBC工具类DbUtils

    本篇将会详细地介绍Apache公司的JDBC帮助工具类DbUtils以及如何使用.在上一篇中我们已经通过将以前对dao层使用JDBC操作数据库的冗余代码进行了简易封装形成自己的简单工具类JdbcUti ...

  5. MySQL JDBC事务处理、封装JDBC工具类

    MySQL数据库学习笔记(十)----JDBC事务处理.封装JDBC工具类 一.JDBC事务处理: 我们已经知道,事务的概念即:所有的操作要么同时成功,要么同时失败.在MySQL中提供了Commit. ...

  6. DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

    DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类) 一.DAO模式简介 DAO即Data Access Object,数据访问接口.数据访问:故名思义就是与数据库打交道.夹在业务逻辑与数据 ...

  7. JDBC第三篇--【事务、元数据、改造JDBC工具类】

    这是我JDBC的第一篇 http://blog.csdn.net/hon_3y/article/details/53535798 这是我JDBC的第二篇 http://blog.csdn.net/ho ...

  8. JDBC【事务、元数据、改造JDBC工具类】

    1.事务 一个SESSION所进行的所有更新操作要么一起成功,要么一起失败 举个例子:A向B转账,转账这个流程中如果出现问题,事务可以让数据恢复成原来一样[A账户的钱没变,B账户的钱也没变]. 事例说 ...

  9. JDBC工具类完整版!

    package com.aaa.util; import java.sql.*; import java.util.ArrayList; import java.util.HashMap; impor ...

  10. jdbc工具类1.0

    package cn.zhouzhou; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManag ...

随机推荐

  1. dijkstra算法学习

    dijkstra算法学习 一.最短路径 单源最短路径:计算源点到其他各顶点的最短路径的长度 全局最短路径:图中任意两点的最短路径 Dijkstra.Bellman-Ford.SPFA求单源最短路径 F ...

  2. How to find your web part

         When we deploy a web part, we can find it on any pages through the follow steps:      Firstly, ...

  3. 预装win8的笔记本如何重装win7

    测试电脑联想T440. 开机按F1,然后Enter,进入Bios设置. 先关闭Secure Boot,然后设置为Legacy Boot. 之后才能设置U盘为第一启动盘. 进入老毛桃的PE系统,使用Di ...

  4. Qt Qwdget 汽车仪表知识点拆解1 速度表示

    先贴上效果图,注意,没有写逻辑,所以这些都是乱动的 这里线主要说一下中间显示速度的显示制作的方式,在这里,自己专门写了一个数字的仪表 考虑的一般的汽车是没有办法把瞬时速度提升到四位数的,所以我这里就放 ...

  5. [Linux] umount目录提示device is busy的解决方法

    使用sshfs等方式挂载的目录出现问题时,使用umount卸载经常提示device is busy,如果仔细阅读错误提示就可以找到命令lsof和fuser命令. 其实原因就是有进程占用当前目录,导致不 ...

  6. Python 随笔01---列表

    列表 1.取出列表中的元素方法?? 2.删除列表中的元素del.remove对比?? 3.linux 常用操作命令

  7. 剑指offer:斐波那契数列

    目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:斐波那契数列 题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n< ...

  8. 通过NTP(Network Time Protocal)协议进行时间同步

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAwUAAAKOCAYAAAD3ZbXWAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjw

  9. koajs框架学习

    目录: 概述 hello world 中间件 路由中间件koa-router body解析中间件koa-bodyparser 授之以渔 一.概述 koa 是由 Express 原班人马打造的,致力于成 ...

  10. php数据缓存到文件类设计

    // 自定义缓存类 class Cache_Filesystem { // 缓存写保存 function set ($key, $data, $ttl) { //打开文件为读/写模式 $h = fop ...