java常用工具类之数据库连接类(可以连接多种数据库)

2014-07-26  来源:本站原创  分类:Java  人气:2 

这篇文章主要介绍了java常用工具类之数据库连接类,可以连接多种数据库,代码中包含详细注释,需要的朋友可以参考下

依赖包下载:http://xiazai.jb51.net/201407/tools/java-db-dependency(jb51.net).rar

数据库连接类源码:

package com.itjh.javaUtil;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.dbcp.ConnectionFactory;
import org.apache.commons.dbcp.DriverManagerConnectionFactory;
import org.apache.commons.dbcp.PoolableConnectionFactory;
import org.apache.commons.dbcp.PoolingDriver;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.pool.ObjectPool;
import org.apache.commons.pool.impl.GenericObjectPool;

/**
 * 连接数据库的综合类。</br>
 * 依赖jar包:commons.dbcp-1.4,commons.dbutils-1.3,commons.pool-1.5.4包。
 *
 * @author 宋立君
 * @date 2014年07月03日
 */

public class DBUtil {

    private String dri = null;
    private String url = null;
    private String username = null;
    private String password = null;
    private String poolName = null; // 连接池名称
    private ObjectPool connectionPool = null; // 连接池
    // 对应的定时查询类
    private QueryThread queryThread = null;

    /**
     * 功能:构造函数
     *
     * @author 宋立君
     * @date 2014年07月03日
     * @param dri
     *      驱动全类名,例如:com.mysql.jdbc.Driver。
     * @param url
     *      数据库url连接,例如:
     *      "jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8"
     * @param userName
     *      数据库用户名,例如:root
     * @param password
     *      数据库密码,例如:abc
     * @param poolName
     *      创建的数据库连接池的名称,例如mypool,注意一个web容器此名称不能重复。
     */
    public DBUtil(String dri, String url, String userName, String password,
            String poolName) {
        this.dri = dri;
        this.url = url;
        this.username = userName;
        this.password = password;
        this.poolName = poolName;
    }

    /**
     * 执行sql。
     *
     * @param conn
     *      连接
     * @param pstm
     *      PreparedStatement
     * @return int 执行sql对应的影响行。
     * @throws SQLException
     * @author 宋立君
     * @date 2014年07月03日
     */
    public int execute(Connection conn, PreparedStatement pstm)
            throws SQLException {
        try {
            return pstm.executeUpdate();
        } finally {
            Close(conn);
        }
    }

    /**
     * 查询sql。
     *
     * @param conn
     *      连接
     * @param pstm
     *      PreparedStatement
     * @return List<Map<String,Object>> 查询的结果集
     * @throws SQLException
     * @author 宋立君
     * @date 2014年07月03日
     */
    public List<Map<String, Object>> query(Connection conn,
            PreparedStatement pstm) throws SQLException {
        try {
            return resultSetToList(pstm.executeQuery());
        } finally {
            Close(conn);
        }
    }

    /**
     * 功能:ResultSet 转为List<Map<String,Object>>
     *
     *
     * @param rs
     *      ResultSet 原始数据集
     * @return List<Map<String,Object>>
     * @throws java.sql.SQLException
     * @author 宋立君
     * @date 2014年07月03日
     */
    private List<Map<String, Object>> resultSetToList(ResultSet rs)
            throws java.sql.SQLException {
        if (rs == null)
            return Collections.EMPTY_LIST;

        ResultSetMetaData md = rs.getMetaData(); // 得到结果集(rs)的结构信息,比如字段数、字段名等
        int columnCount = md.getColumnCount(); // 返回此 ResultSet 对象中的列数
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
        Map<String, Object> rowData = new HashMap<String, Object>();
        while (rs.next()) {
            rowData = new HashMap<String, Object>(columnCount);
            for (int i = 1; i <= columnCount; i++) {
                rowData.put(md.getColumnName(i), rs.getObject(i));
            }
            list.add(rowData);
        }
        return list;
    }

    /**
     * 查询sql语句。
     *
     * @param sql
     *      被执行的sql语句
     * @return List<Map<String,Object>>
     * @throws SQLException
     * @author 宋立君
     * @date 2014年07月03日
     */
    public List<Map<String, Object>> query(String sql) throws SQLException {
        List<Map<String, Object>> results = null;
        Connection conn = null;
        try {
            conn = getConnection();
            QueryRunner qr = new QueryRunner();
            results = qr.query(conn, sql, new MapListHandler());
        } finally {
            Close(conn);
        }
        return results;
    }

    /**
     * 根据参数查询sql语句
     *
     * @param sql
     *      sql语句
     * @param param
     *      参数
     * @return List<Map<String,Object>>
     * @throws SQLException
     * @author 宋立君
     * @date 2014年07月03日
     */
    public List<Map<String, Object>> query(String sql, Object param)
            throws SQLException {
        List<Map<String, Object>> results = null;
        Connection conn = null;
        try {
            conn = getConnection();
            QueryRunner qr = new QueryRunner();
            results = (List<Map<String, Object>>) qr.query(conn, sql, param,
                    new MapListHandler());
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            Close(conn);
        }
        return results;
    }

    /**
     * 执行sql语句
     *
     * @param sql
     *      被执行的sql语句
     * @return 受影响的行
     * @throws Exception
     * @author 宋立君
     * @date 2014年07月03日
     */
    public int execute(String sql) throws Exception {
        Connection conn = getConnection();
        int rows = 0;
        try {
            QueryRunner qr = new QueryRunner();
            rows = qr.update(conn, sql);
        } finally {
            Close(conn);
        }
        return rows;
    }

    /**
     * 执行含参数的sql语句
     *
     * @param sql
     *      被执行的sql语句
     * @param params
     *      参数
     * @return 返回受影响的行
     * @throws Exception
     * @author 宋立君
     * @date 2014年07月03日
     */
    public int execute(String sql, Object[] params) throws Exception {
        Connection conn = getConnection();
        int rows = 0;
        try {
            QueryRunner qr = new QueryRunner();
            rows = qr.update(conn, sql, params);
        } finally {
            Close(conn);
        }
        return rows;
    }

    /**
     * 关闭连接
     *
     * @param conn
     * @throws SQLException
     * @author 宋立君
     * @date 2014年07月03日
     */
    public void Close(Connection conn) throws SQLException {
        if (conn != null) {
            conn.close();
        }
        DbUtils.closeQuietly(conn);
    }

    /**
     * 启动连接池
     *
     * @author 宋立君
     * @date 2014年07月03日
     */
    private void StartPool() {
        try {
            Class.forName(dri);
        } catch (ClassNotFoundException e1) {
            e1.printStackTrace();
        }
        if (connectionPool != null) {
            ShutdownPool();
        }
        try {
            connectionPool = new GenericObjectPool(null);
            ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(
                    url, username, password);
            PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(
                    connectionFactory, connectionPool, null, "SELECT 1", false,
                    true);
            Class.forName("org.apache.commons.dbcp.PoolingDriver");
            PoolingDriver driver = (PoolingDriver) DriverManager
                    .getDriver("jdbc:apache:commons:dbcp:");
            driver.registerPool(poolName, poolableConnectionFactory.getPool());

        } catch (Exception e) {
            e.printStackTrace();
        }
        // 开启查询程序
        queryThread = new QueryThread(this);
        queryThread.start();
    }

    /**
     * 关闭连接池
     *
     * @author 宋立君
     * @date 2014年07月03日
     */
    private void ShutdownPool() {
        try {
            PoolingDriver driver = (PoolingDriver) DriverManager
                    .getDriver("jdbc:apache:commons:dbcp:");
            driver.closePool(poolName);
            // 关闭定时查询
            queryThread.setStartQuery(false);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 得到一个连接
     *
     * @return
     * @author 宋立君
     * @date 2014年07月03日
     */
    public synchronized Connection getConnection() {
        Connection conn = null;
        try {
            if (connectionPool == null)
                StartPool();
            conn = DriverManager.getConnection("jdbc:apache:commons:dbcp:"
                    + poolName);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }
}

/**
 * 当连接池启动后会自动定时查询数据库,防止数据库连接超时。
 *
 * @author 宋立君
 * @date 2014年07月03日
 */
class QueryThread extends Thread {

    private DBUtil dbUtil = null;
    // 是否开启查询
    private boolean startQuery = true;

    /**
     * 功能:对应的数据库连接。
     *
     * @author 宋立君
     * @date 2014年07月03日
     * @param dbUtil
     *      数据库连接
     */
    public QueryThread(DBUtil dbUtil) {
        this.dbUtil = dbUtil;
    }

    public void run() {
        while (true) {
            try {
                if (startQuery) {
                    this.dbUtil.query("select 1");
                }
                // System.out.println(startQuery+"  123");
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    Thread.sleep(120000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public void setStartQuery(boolean startQuery) {
        // System.out.println("startQuery shut:"+startQuery);
        this.startQuery = startQuery;
    }
}
相关文章
  • java常用工具类之数据库连接类(可以连接多种数据库) 2014-07-26

    这篇文章主要介绍了java常用工具类之数据库连接类,可以连接多种数据库,代码中包含详细注释,需要的朋友可以参考下 依赖包下载:http://xiazai.jb51.net/201407/tools/java-db-dependency(jb51.net).rar 数据库连接类源码: package com.itjh.javaUtil; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepar

  • java常用工具类之Excel操作类及依赖包下载 2014-11-06

    这篇文章主要介绍了java常用工具类Excel操作类及依赖包下载,需要的朋友可以参考下 依赖包下载:http://xiazai.jb51.net/201407/tools/java-excel-dependency(jb51.net).rar Excel工具类ExcelUtil.java源码: package com.itjh.javaUtil; import java.io.File; import java.io.FileInputStream; import java.io.FileNot

  • java常用工具类之DES和Base64加密解密类 2014-12-09

    这篇文章主要介绍了java常用工具类之DES和Base64加密解密类,需要的朋友可以参考下 一.DES加密和解密 package com.itjh.javaUtil; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SecureRando

  • 项目经验分享--Java常用工具类集合 2013-11-01

    目录(?)[-] 写在前面 数据库连接工具类 数据库连接工具类仅仅获得连接对象 ConnDBjava 数据库连接工具类包含取得连接和关闭资源 ConnUtiljava 格式转换工具类 日期转换工具类 CommUtiljava 日期转换类 DateConverterjava 功能更强大的格式化工具类 FormatUtilsjava 文件操作工具类 目录操作工具类 CopyDirjava 文件目录部分处理工具类 DealDirjava 目录处理工具类 DealWithDirjava 删除文件夹工具类

  • java常用工具集 2012-09-07

    我发现很多人没办法高效地解决问题的关键原因是不熟悉工具,不熟悉工具也还罢了,甚至还不知道怎么去找工具,这个问题就大条了.我想列下我能想到的一个Java程序员会用到的常用工具. 一.编码工具 1.IDE: Eclipse 或者 IDEA ,熟悉尽可能多的快捷键,< Eclipse常见快捷键列表 > 2.插件: (1) Findbugs ,在release之前进行一次静态代码检查是必须的 (2) Clover ,关心你的单元测试覆盖率 (3) Checkstyle 代码风格检查 3.构建和部署工具

  • java常用工具类 2015-02-05

    package com.cucpay.tradeportal.util; import java.io.UnsupportedEncodingException; import java.lang.reflect.Field; import java.net.URLDecoder; import java.net.URLEncoder; import java.nio.charset.CharacterCodingException; import java.nio.charset.Charse

  • java常用工具介绍 2014-10-30

    jstatd 启动jvm监控服 务.它是一个基于rmi的应用,向远程机器提供本机jvm应用程序的信息.默认端口1099. 实例: jstatd -J-Djava.security.policy=my.policy my.policy文件需要自己建立,内如如下: grant codebase "file:$JAVA_HOME/lib/tools.jar" { permission java.security.AllPermission; }; 这是安全策略文件,因为jdk对jvm做了ja

  • 常用工具之 vb转化C# 数据连接串 正则表达式查询 源码世界 脚本字典 2015-02-14

    vb转化C# 数据连接串 正则表达式查询 源码世界 脚本字典

  • java中常用工具类之字符串操作类和MD5加密解密类 2013-11-04

    这篇文章主要介绍了java中常用工具类之字符串操作类和MD5加密解密类,需要的朋友可以参考下 java中常用的工具类之String和MD5加密解密类 我们java程序员在开发项目的是常常会用到一些工具类.今天我分享一下我的两个工具类,大家可以在项目中使用. 一.String工具类 package com.itjh.javaUtil; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInput

  • java连接Mysql数据库的工具类 2014-06-04

    这篇文章主要介绍了java连接Mysql数据库的工具类,非常的实用,推荐给大家,需要的朋友可以参考下 一个封装好的链接Mysql数据库的工具类,可以方便的获取Connection对象关闭Statement.ResultSet.Statment对象等等 package myUtil; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sq

  • Java图像处理工具类 2014-12-20

    这里给大家分享了一个java常用的图像处理工具类,包含缩放图像.切割图像.图像类型转换.彩色转黑白.文字水印.图片水印等,有需要的小伙伴参考下. 本工具类的功能:缩放图像.切割图像.图像类型转换.彩色转黑白.文字水印.图片水印等 package net.kitbox.util; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import

  • java连接Oracle数据库的工具类 2015-02-12

    这篇文章主要介绍了java连接Oracle数据库的工具类,非常的实用,需要的小伙伴参考下. 一个封装好的链接Oracle数据库的工具类,可以方便的获取Connection对象关闭Statement.ResultSet.Statment对象等等 package myUtil; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.Re

  • 19个Android常用工具类汇总 2015-02-20

    这篇文章主要介绍了19个Android常用工具类汇总,需要的朋友可以参考下 主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java. 目前包括HttpUtils.DownloadManagerPro.ShellUtils.PackageUtils.PreferencesUtils.JSONUtils.FileUtils.ResourceUtils.StringUtils.ParcelUtils.RandomUtils.ArrayUtils.ImageUtils.ListUtil

  • Java 摘自网络的一个数据库连接及操作类DB[以SQL Server 2005为例] 2011-02-14

    一共分三个类: 1.数据库连接类DB.java: (注意要改跟数据库相关的 className.url.password.user 之类的数据) import java.sql.*; /** * 描述: 数据库连接类 Copyright * * @author * @version */ public class DB { // static String driver = "com.mysql.jdbc.Driver"; private static final String dri

  • commons-lang常用工具类StringEscapeUtils使用 2014-11-06

    在apache commons-lang(2.3以上版本)中为我们提供了一个方便做转义的工具类,主要是为了防止sql注入,xss注入攻击的功能. commons-lang常用工具类StringEscapeUtils使用 - wjoygz - pauls private zone 1.escapeSql 提供sql转移功能,防止sql注入攻击,例如典型的万能密码攻击' ' or 1=1 ' ' 1StringBuffer sql = new StringBuffer("select key_sn,

  • Java 常用类(八) 2015-02-08

    1.String类:不可变的字符序列(如:String str= "china"; str+="JavaEE") 1.关于String类常用方法! 2.String类与基本类型.包装类:与字符数据.字节数组 1.字符串 与基本数据类型.包装类之间转换 ①字符串 --->基本数据类型.包装类:调用相应的包装类的parseXxx(String str); ①基本数据类型.包装类--->字符串:调用字符串的重载的valueOf()方法 2.字符串与字节数组间的

  • php常用工具类 2015-04-15

    <?php /** * 常用工具类 * @author wj * @date 2015-4-15 */ class Tool { /** * js 弹窗并且跳转 * @param string $_info * @param string $_url * @return js */ static public function alertLocation($_info, $_url) { echo "<script type='text/javascript'>alert('$

  • 初学java常用开发工具介绍 2014-01-06

    Java的应用越来越广泛,学习Java的人也越来越多.学过程序设计的人知道,使用Basic进行程序设计,可以使用QBasic.Visual Basic等开发工具:使用C语言进行程序设计,可以使用Turbo C.Visual C++.C++ Builder等开发工具.这些开发工具集成了编辑器和编译器,是集成开发工具,很方便使用.学习Java程序设计,同样需要方便易用的开发工具.Java的开发工具很多,而且各有优缺点,初学者往往不知道有哪些常用的开发工具,或者由于面临的选择比较多而产生困惑.本文对初

  • java处理高并发高负载类网站的优化方法 2015-02-10

    java处理高并发高负载类网站中数据库的设计方法(java教程,java处理大量数据,java高负载数据) 一:高并发高负载类网站关注点之数据库 没错,首先是数据库,这是大多数应用所面临的首个SPOF.尤其是Web2.0的应用,数据库的响应是首先要解决的. 一般来说MySQL是最常用的,可能最初是一个mysql主机,当数据增加到100万以上,那么,MySQL的效能急剧下降.常用的优化措施是M-S(主 -从)方式进行同步复制,将查询和操作和分别在不同的服务器上进行操作.我推荐的是M-M-Slave

  • System 类 和 Runtime 类的常用用法介绍 2014-05-19

    这篇文章主要介绍了System 类 和 Runtime 类的常用用法,有需要的朋友可以参考一下 System类的常用用法 1,主要获取系统的环境变量信息 public static void sysProp()throws Exception{ Map<String,String> env = System.getenv(); //获取系统的所有环境变量 for(String name : env.keySet()){ System.out.println(name + " : &q