`

经典的数据库访问接口

 
阅读更多

package org.lyq.dao;

import java.io.IOException;
import java.io.InputStream;
import java.sql.CallableStatement;
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.sql.Types;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.UUID;
/** 
 * 经典的数据库访问接口 
 * @author 李永强 
 * @version 2.0 
 */
public class DBUtil {
 private static DBUtil dbUtil = null;  
    private List<Connection> idle = new ArrayList<Connection>(0);  
    private Map<Thread, Connection> busy = new HashMap<Thread, Connection>(0);  
    private Map<String, Connection> cache = new HashMap<String, Connection>(0);  
    private String dialect = "ORACLE";  
    private int maxsize = 3;  
 
    /** 
     * 私有构造不让直接创建一个DBUtil实例 读取配置文件加载数据库配置信息,创建一定数量的连接到连接池
     */ 
    private DBUtil() {  
        InputStream in = DBUtil.class.getClassLoader().getResourceAsStream("db_cfg.properties");  
        Properties prop = new Properties();  
        try {  
            prop.load(in);  
            String driver = (String) prop.get("db.driver");  
            String url = (String) prop.get("db.url");  
            String username = (String) prop.get("db.username");  
            String password = (String) prop.get("db.password");  
            if (prop.get("db.maxsize") != null) {  
                maxsize = Integer.parseInt(prop.get("db.maxsize").toString());  
            }  
            if (prop.get("db.dialect") != null) {  
                dialect = (String) prop.get("db.dialect");  
            }  
            Class.forName(driver);  
            for (int k = 0; k < maxsize; k++) {  
                Connection conn = DriverManager.getConnection(url, username, password);  
                idle.add(conn);  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        } finally {  
            try {  
                in.close();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
 
    /** 
     * 获得数据库访问接口 
     * @return 数据库访问接口DBUtil单例 
     */ 
    public static DBUtil getInstance() {  
        if (null == dbUtil) {  
            dbUtil = new DBUtil();  
        }  
        return dbUtil;  
    }  
 
    /** 
     * 获得数据库连接 
     * @return 数据库连接 
     */ 
    private synchronized Connection getConn() {  
        Connection conn = null;  
        try {  
            if (idle.size() == 0) {  
                wait();  
            }  
            conn = idle.get(0);  
            busy.put(Thread.currentThread(), conn);  
            idle.remove(0);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return conn;  
    }  
 
    /** 
     * 关闭所有对对象,归还链接到连接池 
     * @param rs  数据集对象 
     * @param ps 命令对象 
     */ 
    private synchronized void closeAll(ResultSet rs, PreparedStatement ps) {  
        if (null != rs) {  
            try {  
                rs.close();  
            } catch (SQLException e) {  
                e.printStackTrace();  
            }  
        }  
        if (null != ps) {  
            try {  
                ps.close();  
            } catch (SQLException e) {  
                e.printStackTrace();  
            }  
        }  
        Connection conn = busy.get(Thread.currentThread());  
        if (null != conn) {  
            idle.add(conn);  
            busy.remove(Thread.currentThread());  
            notify();  
        }  
    }  
 
    /** 
     * 无事务更新(不带参数) 
     * @param sql  SQL语句 :"update table set price=200.00" 
     * @return 受影响行数 
     * @throws SQLException 
     */ 
    public int update(String sql) throws SQLException {  
        int result = 0;  
        Connection conn = null;  
        PreparedStatement ps = null;  
        try {  
            conn = getConn();  
            ps = conn.prepareStatement(sql);  
            result = ps.executeUpdate();  
        } catch (SQLException e) {  
            throw e;  
        } finally {  
            closeAll(null, ps);  
        }  
        return result;  
    }  
 
    /** 
     * 无事务更新(带参数) 
     * @param sql SQL语句 :"delete from table where id=?" 
     * @param params  参数对象数组 :new Object[]{参数1,参数2,...} 
     * @return 受影响行数 
     * @throws SQLException 
     */ 
    public int update(String sql, Object[] params) throws SQLException {  
        int result = 0;  
        Connection conn = null;  
        PreparedStatement ps = null;  
        try {  
            conn = getConn();  
            ps = conn.prepareStatement(sql);  
            for (int i = 0; i < params.length; i++) {  
                ps.setObject(i + 1, params[i]);  
            }  
            result = ps.executeUpdate();  
        } catch (SQLException e) {  
            throw e;  
        } finally {  
            closeAll(null, ps);  
        }  
        return result;  
    }  
 
    /** 
     * 在事务下更新(不带参数) 
     * @param transId  事务ID 
     * @param sql  SQL语句 :"update table set price=200.00" 
     * @return 受影响行数 
     * @throws SQLException 
     */ 
    public int update(String transId, String sql) throws SQLException {  
        int result = 0;  
        Connection conn = cache.get(transId);  
        try {  
            PreparedStatement ps = conn.prepareStatement(sql);  
            result = ps.executeUpdate();  
        } catch (SQLException e) {  
            throw e;  
        }  
        return result;  
    }  
 
    /** 
     * 在事务下更新(带参数) 
     * @param transId 事务ID 
     * @param sql SQL语句 :"delete from table where id=?" 
     * @param params 参数对象数组 :new Object[]{参数1,参数2,...} 
     * @return 受影响行数 
     * @throws SQLException 
     */ 
    public int update(String transId, String sql, Object[] params)  
            throws SQLException {  
        int result = 0;  
        Connection conn = cache.get(transId);  
        try {  
            PreparedStatement ps = conn.prepareStatement(sql);  
            for (int i = 0; i < params.length; i++) {  
                ps.setObject(i + 1, params[i]);  
            }  
            result = ps.executeUpdate();  
        } catch (SQLException e) {  
            throw e;  
        }  
        return result;  
    }  
 
    /** 
     * 非事务下批量更新 
     * @param sql  SQL语句 :"insert into table(p1,p2,p3) values(?,?,?)" 
     * @param params 参数集合List<Object[]> 其中new Object[]{参数1,参数2,...} 
     * @return 受影响行数 
     * @throws SQLException 
     */ 
    public int[] batchUpdate(String sql, List<Object[]> params)  
            throws SQLException {  
        int[] result = new int[params.size()];  
        Connection conn = null;  
        PreparedStatement ps = null;  
        try {  
            conn = getConn();  
            conn.setAutoCommit(false);  
            ps = conn.prepareStatement(sql);  
            for (Object[] objects : params) {  
                for (int i = 0; i < objects.length; i++) {  
                    ps.setObject(i + 1, objects[i]);  
                }  
                ps.addBatch();  
            }  
            result = ps.executeBatch();  
            conn.commit();  
        } catch (SQLException e) {  
            throw e;  
        } finally {  
            closeAll(null, ps);  
        }  
        return result;  
    }  
 
    /** 
     * 在事务下批量更新 
     * @param transId 事务ID 
     * @param sql SQL语句 :"insert into table(p1,p2,p3) values(?,?,?)" 
     * @param params 参数集合List<Object[]> 其中new Object[]{参数1,参数2,...} 
     * @return 受影响行数 
     * @throws SQLException 
     */ 
    public int[] batchUpdate(String transId, String sql, List<Object[]> params) throws SQLException {  
        int[] result = new int[params.size()];  
 
        Connection conn = cache.get(transId);  
        PreparedStatement ps = conn.prepareStatement(sql);  
        for (Object[] objects : params) {  
            for (int i = 0; i < objects.length; i++) {  
                ps.setObject(i + 1, objects[i]);  
            }  
            ps.addBatch();  
        }  
        result = ps.executeBatch();  
        return result;  
    }  
 
    /** 
     * 查询(不带参数)返回List<Map<k,v>>其中k:字段名小写,v:字段值 
     * @param sql SQL语句 :"select * from table" 
     * @return 集合List<Map<k,v>> 其中k:字段名小写,v:字段值 
     * @throws SQLException 
     */ 
    public List<Map<String, Object>> query(String sql) throws SQLException {  
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();  
        Connection conn = null;  
        PreparedStatement ps = null;  
        ResultSet rs = null;  
        try {  
            conn = getConn();  
            ps = conn.prepareStatement(sql);  
            rs = ps.executeQuery();  
            ResultSetMetaData rsmd = rs.getMetaData();  
            int colCount = rsmd.getColumnCount();  
            while (rs.next()) {  
                Map<String, Object> map = new HashMap<String, Object>();  
                for (int i = 0; i < colCount; i++) {  
                    String key = rsmd.getColumnLabel(i + 1).toLowerCase();  
                    Object val = rs.getObject(i + 1) != null ? rs  
                            .getObject(i + 1) : "";  
                    map.put(key, val);  
                }  
                list.add(map);  
            }  
        } catch (SQLException e) {  
            throw e;  
        } finally {  
            closeAll(rs, ps);  
        }  
        return list;  
    }  
 
    /** 
     * 分页查询(不带参数)返回List<Map<k,v>>其中k:字段名小写,v:字段值 
     * @param sql SQL语句 :"select * from table" 
     * @param currPage 第几页 
     * @param pageSize 每页记录数 
     * @return 集合List<Map<k,v>> 其中k:字段名小写,v:字段值 
     * @throws SQLException 
     */ 
    public List<Map<String, Object>> queryPager(String sql, int currPage,  
            int pageSize) throws SQLException {  
        String pageSql = getPageSql(sql, currPage, pageSize);  
        return query(pageSql);  
    }  
 
    /** 
     * 查询(带参数)返回List<Map<k,v>>其中k:字段名小写,v:字段值 
     * @param sql SQL语句 :"select * from table where id = ?" 
     * @param params 参数对象数组 :new Object[]{参数1,参数2,...} 
     * @return 集合List<Map<k,v>> 其中k:字段名小写,v:字段值 
     * @throws SQLException 
     */ 
    public List<Map<String, Object>> query(String sql, Object[] params) throws SQLException {  
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();  
        Connection conn = null;  
        PreparedStatement ps = null;  
        ResultSet rs = null;  
        try {  
            conn = getConn();  
            ps = conn.prepareStatement(sql);  
            for (int i = 0; i < params.length; i++) {  
                ps.setObject(i + 1, params[i]);  
            }  
            rs = ps.executeQuery();  
            ResultSetMetaData rsmd = rs.getMetaData();  
            int colCount = rsmd.getColumnCount();  
            while (rs.next()) {  
                Map<String, Object> map = new HashMap<String, Object>();  
                for (int i = 0; i < colCount; i++) {  
                    String key = rsmd.getColumnLabel(i + 1).toLowerCase();  
                    Object val = rs.getObject(i + 1) != null ? rs  
                            .getObject(i + 1) : "";  
                    map.put(key, val);  
                }  
                list.add(map);  
            }  
        } catch (SQLException e) {  
            throw e;  
        } finally {  
            closeAll(rs, ps);  
        }  
        return list;  
    }  
 
    /** 
     * 分页查询(带参数)返回List<Map<k,v>>其中k:字段名小写,v:字段值 
     * @param sql SQL语句 :"select * from table where id = ?" 
     * @param params 参数对象数组 :new Object[]{参数1,参数2,...} 
     * @param currPage 第几页 
     * @param pageSize 每页记录数 
     * @return 集合List<Map<k,v>> 其中k:字段名小写,v:字段值 
     * @throws SQLException 
     */ 
    public List<Map<String, Object>> queryPager(String sql, Object[] params,  
            int currPage, int pageSize) throws SQLException {  
        String pageSql = getPageSql(sql, currPage, pageSize);  
        return query(pageSql);  
    }  
 
    /** 
     * 单值查询(不带参数) 
     * @param sql SQL语句 :"select name from table" 
     * @return 单值 
     * @throws SQLException 
     */ 
    public String scalar(String sql) throws SQLException {  
        String res = null;  
        Connection conn = null;  
        PreparedStatement ps = null;  
        ResultSet rs = null;  
        try {  
            conn = getConn();  
            ps = conn.prepareStatement(sql);  
            rs = ps.executeQuery();  
            if (rs.next()) {  
                res = String.valueOf(rs.getObject(1));  
            }  
        } catch (SQLException e) {  
            throw e;  
        } finally {  
            closeAll(rs, ps);  
        }  
        return res;  
    }  
 
    /** 
     * 单值查询(带参) 
     * @param sql SQL语句 :"select name from table where id=?" 
     * @param params 参数对象数组 :new Object[]{参数1,参数2,...} 
     * @return 单值 
     * @throws SQLException 
     */ 
    public String scalar(String sql, Object[] params) throws SQLException {  
        String res = null;  
        Connection conn = null;  
        PreparedStatement ps = null;  
        ResultSet rs = null;  
        try {  
            conn = getConn();  
            ps = conn.prepareStatement(sql);  
            for (int i = 0; i < params.length; i++) {  
                ps.setObject(i + 1, params[i]);  
            }  
            rs = ps.executeQuery();  
            if (rs.next()) {  
                res = String.valueOf(rs.getObject(1));  
            }  
        } catch (SQLException e) {  
            throw e;  
        } finally {  
            closeAll(rs, ps);  
        }  
        return res;  
    }  
 
    /** 
     * 执行存储过程 
     * @param procName 存储过程 
     * @param params 存储过程参数对象数组 :new Object[]{参数1,参数2,...} 
     * @param outParamNum 输出参数个数 
     * @return 输出参数 
     * @throws SQLException 
     */ 
    public String[] execProc(String procName, Object[] params, int outParamNum)  
            throws SQLException {  
        String[] ret = new String[outParamNum];  
        Connection conn = null;  
        CallableStatement cs = null;  
        int inParamNum = (null != params) ? params.length : 0;  
        String procSql = getProcSql(procName, inParamNum, outParamNum);  
        try {  
            conn = getConn();  
            cs = conn.prepareCall(procSql);  
            for (int i = 0; i < inParamNum; i++) {  
                cs.setObject(i + 1, params[i]);  
            }  
            for (int k = 1; k <= outParamNum; k++) {  
                cs.registerOutParameter(inParamNum + k, Types.VARCHAR);  
            }  
            cs.executeQuery();  
            for (int k = 1; k <= outParamNum; k++) {  
                ret[k - 1] = cs.getString(inParamNum + k);  
            }  
        } catch (SQLException e) {  
            throw e;  
        } finally {  
            closeAll(null, cs);  
        }  
        return ret;  
    }  
 
    /** 
     * 开始事务 
     * @return 事务ID 
     */ 
    public String beginTrans() {  
        String transId = null;  
        try {  
            Connection conn = getConn();  
            conn.setAutoCommit(false);  
            transId = UUID.randomUUID().toString();  
            cache.put(transId, conn);  
        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
        return transId;  
    }  
 
    /** 
     * 事务提交 
     * @param transId  事务ID 
     */ 
    public void commitTrans(String transId) {  
        Connection conn = null;  
        try {  
            conn = cache.get(transId);  
            conn.commit();  
            conn.setAutoCommit(true);  
        } catch (SQLException e) {  
            e.printStackTrace();  
        } finally {  
            closeAll(null, null);  
            cache.remove(conn);  
        }  
    }  
 
    /** 
     * 事务回滚 
     * @param transId 事务ID 
     */ 
    public void rollbackTrans(String transId) {  
        Connection conn = null;  
        try {  
            conn = cache.get(transId);  
            conn.rollback();  
            conn.setAutoCommit(true);  
        } catch (SQLException e) {  
            e.printStackTrace();  
        } finally {  
            closeAll(null, null);  
            cache.remove(conn);  
        }  
    }  
 
    /** 
     * 得到分页SQL语句 
     * @param sql 基本SQL语句 
     * @param currPage 当前页 
     * @param pageSize 每页记录数 
     * @return 分页SQL语句 
     */ 
    private String getPageSql(String sql, int currPage, int pageSize) {  
        StringBuffer pageSql = new StringBuffer(0);  
        if ("oracle".equalsIgnoreCase(dialect)) {  
            pageSql.append("SELECT * FROM(SELECT FA.*, ROWNUM RN FROM (");  
            pageSql.append(sql).append(") FA WHERE ROWNUM <= ");  
            pageSql.append(currPage * pageSize).append(")WHERE RN >= ").append(  
                    (currPage - 1) * pageSize + 1);  
        }  
        if ("mysql".equalsIgnoreCase(dialect)) {  
            pageSql.append(sql).append(" limit ").append(  
                    (currPage - 1) * pageSize).append(",").append(pageSize);  
        }  
        return pageSql.toString();  
    }  
 
    /** 
     * 得到存储过程语句 
     * @param procName 存储过程 
     * @param inParamNum 输入参数个数 
     * @param outParamNum 输出参数个数 
     * @return 
     * @throws SQLException 
     */ 
    private String getProcSql(String procName, int inParamNum, int outParamNum) throws SQLException {  
        StringBuffer sb = new StringBuffer();  
        sb.append("{call ").append(procName);  
        int paramCount = inParamNum + outParamNum;  
        if (paramCount > 0) {  
            sb.append("(");  
            for (int i = 0; i < paramCount; i++) {  
                sb.append("?");  
                if (i != paramCount - 1) {  
                    sb.append(",");  
                }  
            }  
            sb.append(")");  
        }  
        sb.append("}");  
        return sb.toString();  
    }  
      
    /** 
     * 测试DBUtil 
     * @param args 
     */ 
    public static void main(String[] args) {  
        try {  
            DBUtil dao = DBUtil.getInstance();  
            String sql0 = "select addd from operate";  
            String sql = "select * from rolepower rp where rolecode = (select ur.rolecode from user u left join userrole ur on u.code = ur.usercode where u.code = 0001)";  
            List<Map<String, Object>> list = dao.query(sql);  
            sql = "select * from operate";  
            String count = dao.scalar(sql0);  
            // list = dao.queryPager(sql, 1, 10);  
            System.out.println(count);  
            System.out.println(list.size());  
            // System.out.println(list.get(0).get("name"));  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  

}

1
0
分享到:
评论

相关推荐

    多种数据库访问接口实现

    在IT领域,数据库访问接口是连接应用程序与数据库系统的关键组件,允许程序执行查询、更新、插入和删除等操作。本文将详细阐述Oracle、MS SQL SERVER和Access这三种常见数据库的访问接口实现,以及如何设计一个通用...

    数据库访问接口技术

    ### 数据库访问接口技术:MFC中的ODBC与ADO #### 概述 数据库访问接口技术是计算机科学中一个至关重要的领域,它涉及到如何高效、安全地与数据库系统进行交互。在众多数据库访问技术中,ODBC(Open Database ...

    数据库访问接口技术数据库访问接口技术.ppt

    数据库访问接口技术数据库访问接口技术

    数据库访问接口-PPT课件.ppt

    数据库访问接口 本章节介绍了数据库访问接口的基本概念和几种常见的数据库访问接口,如ODBC、JDBC、OLE DB和数据库网关。这些接口为开发者提供了统一的访问方式,实现了开放数据库的互联,并大大减小了编程的工作量...

    统一数据库访问接口库(Windows平台)

    支持国产达梦数据库(通过dpi接口集成),支持mysql数据库(通过libmysqlclient集成),支持sqlite数据库(通过sqlite3接口集成),支持oracle数据库(通过oci接口集成),支持sqlserver(通过odbc接口); 提供统一的C++抽象接口,...

    数据库访问接口(ADO.NET2.0)

    开发软件时,可以参考使用此封装的数据库访问类

    通过Java annotation以及反射机制实现不同类型通用的数据库访问接口

    本篇将详细探讨如何利用这两者来实现一个通用的数据库访问接口,以适应不同类型的数据库操作。 首先,让我们理解什么是注解。注解是Java提供的一种元数据,它可以提供一种方式来添加额外的信息到源代码中,这些信息...

    数据库访问接口

    开放的数据库访问接口为数据库应用程序开发人员访问与不同的、异构的数据库提供了统一的访问方式,采用这种数据库接口可以通过编写一段代码实现对多种类型数据库的复杂操作。实现了开放数据库的互联,并大大减小了...

    数据库访问接口(共112张PPT).pptx

    数据库访问接口是软件系统与数据库管理系统(DBMS)交互的关键技术,它允许程序员通过标准的接口来连接和操作各种类型的数据库。本讲座共112张PPT,深入讲解了数据库访问接口的主要技术和应用。 首先,数据库访问...

    基于.NET框架的通用数据库访问接口研究与实现.pdf

    ### 基于.NET框架的通用数据库访问接口研究与实现 #### 1. 引言 随着信息技术的迅速发展,数据库技术也在不断进步,并且在各个行业中得到了广泛应用。在实际项目开发过程中,开发者经常会遇到需要支持多种不同类型...

    hibernate数据库访问接口设计

    在 Hibernate 中,数据库访问接口的设计是至关重要的,因为它提供了与数据库交互的桥梁,简化了传统的 JDBC 编程,提高了开发效率和代码的可维护性。 ### 1. Session 接口 Hibernate 的核心接口是 `Session`,它...

    基于C#的Bouyei.DbFactory统一数据库访问接口库设计源码

    本源码提供了一个基于C#的Bouyei.DbFactory统一数据库访问接口库设计。项目包含263个文件,其中包括227个C#源文件、8个CSPROJ文件、7个DLL文件、6个CONFIG文件、3个PFX文件、2个GITIGNORE文件、2个Markdown文档、2个...

    数据库访问接口PPT学习教案.pptx

    数据库访问接口是软件系统与数据库管理系统(DBMS)交互的关键技术,主要目的是简化数据库应用程序的开发,使得开发者可以通过统一的接口来访问不同类型的数据库,从而实现数据的跨平台、跨数据库系统的互操作性。...

    数据库dll接口方式

    数据库DLL接口方式是一种在软件开发中使用动态链接库(DLL)来实现数据库访问的方法。DLL是一种可执行代码的模块,可以被多个程序共享,减少了内存占用并简化了代码管理。"DLLWizardInterfaceMode"可能指的是一个...

    关于VC_数据库访问接口的研究

    【VC++数据库访问接口的研究】 在VC++编程中,数据库访问是常见的需求,为了实现这一功能,Microsoft提供了多种接口供开发者使用。本文主要探讨了DAO(数据访问对象)、OLE/DB、ADO(活动数据对象)和ODBC(开放...

    数据库三层架构通用代码 访问层 数据库接口

    在"数据库三层架构通用代码 访问层 数据库接口"的场景中,通用类库源码可能包含以下内容: - 数据库连接池:如C3P0、Druid或HikariCP,用于高效管理和复用数据库连接。 - DAO(Data Access Object)接口和实现:...

    QJ 20063-2011 异构数据库数据接口要求.PDF

    QJ 20063-2011 异构数据库数据接口要求定义了不同数据库之间数据如何交换的协议和执行标准。

    连接数据库存储接口

    在IT行业中,数据库存储接口是应用程序与数据库进行通信的关键组件。这个"连接数据库存储接口"的示例,正如标题所示,已经通过了测试并被实际项目采用,这意味着它提供了一个可靠的模板来实现与SQL数据库的连接,...

    面向对象的PHP数据库访问接口

    这是本人自己写的一个php面向对象的数据库访问接口。可以对mysql数据库进行操作。能够完成数据的增、删、查、改基本操作。其中还包括乐意分页显示的模块,可用于web开发中。由于时间匆忙,有些功能还不完善,大家...

Global site tag (gtag.js) - Google Analytics