package cn.piesat.sparkproject.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;

import cn.piesat.sparkproject.conf.ConfigurationManager;
import cn.piesat.sparkproject.constant.Constants;
/**
* jdbc辅助组件
* @author Administrator
*
*/
public class JDBCHelper {
private static JDBCHelper instance=null;
/**
* 数据库连接池
*/
private LinkedList<Connection> dataSource=new LinkedList<Connection>();
static{
try {
Class.forName(ConfigurationManager.getProperty(Constants.JDBC_DRIVER));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 私有化构造方法
*/
private JDBCHelper(){
int datasourceSize=ConfigurationManager.getInteger(Constants.JDBC_DATASOURCE_SIZE);
for(int i=0;i<datasourceSize;i++){
try {
Connection conn=DriverManager.getConnection(
ConfigurationManager.getProperty(Constants.JDBC_URL),
ConfigurationManager.getProperty(Constants.JDBC_USER),
ConfigurationManager.getProperty(Constants.JDBC_PASSWORD));
dataSource.push(conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
};
/**
* 获取实例
* @return
*/
public static JDBCHelper getInstance(){
if(instance==null){
synchronized(JDBCHelper.class){
if(instance==null){
instance=new JDBCHelper();
}
}
}
return instance;
}

/**
* 获取数据库连接
* @return
*/
public synchronized Connection getConnection(){
while(dataSource.size()<=0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return dataSource.poll();
}

/**
* 执行增删改SQL语句
* @param sql
* @param params
* @return
*/
public int executeUpdate(String sql,Object[] params){
Connection conn=null;
PreparedStatement pstmt=null;
int rnt=0;
try{
conn=getConnection();
pstmt = conn.prepareStatement(sql);
for(int i=0;i<params.length;i++){
pstmt.setObject(i+1, params[i]);
}
rnt = pstmt.executeUpdate();
}catch(Exception e){
e.printStackTrace();
}finally{
if(conn!=null){
dataSource.push(conn);
}
}
return rnt;
}

/**
* 执行查询SQL语句
* @param sql
* @param params
*/
public void executeQuery(String sql,Object[] params,QueryCallback callback){
Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
try{
conn=getConnection();
pstmt=conn.prepareStatement(sql);
if(params!=null){
for(int i=0;i<params.length;i++){
pstmt.setObject(i+1, params[i]);
}
}
rs=pstmt.executeQuery();
callback.process(rs);
}catch(Exception e){
e.printStackTrace();
}finally{
if(conn!=null){
dataSource.push(conn);
}
}
}

/**
* 批量执行sql语句
* @param sql
* @param params
* @return 每条sql语句影响的行数
*/
public int[] executeBatch(String sql,List<Object[]> paramsList){
int[] rtn=null;
Connection conn=null;
PreparedStatement pstmt=null;
try{
conn=getConnection();
conn.setAutoCommit(false);
pstmt=conn.prepareStatement(sql);
for(Object[] params:paramsList){
for(int i=0;i<params.length;i++){
pstmt.setObject(i+1, params[i]);
}
pstmt.addBatch();
}
rtn=pstmt.executeBatch();
conn.commit();
}catch(Exception e){
e.printStackTrace();
}finally{
if(conn!=null){
dataSource.push(conn);
}
}
return rtn;
}

/**
* 查询回调接口
* @author Administrator
*
*/
public static interface QueryCallback{
void process(ResultSet rs)throws Exception;
}
}

JDBC接口封装的更多相关文章

  1. java:Session(概述,三层架构实例(实现接口封装JDBC),Session实现简单购物车实例)

    1.Session概述: Session:在计算机中,尤其是在网络应用中,称为“会话控制”.Session 对象存储特定用户会话所需的属性及配置信息.这样,当用户在应用程序的 Web 页之间跳转时,存 ...

  2. jdbc java数据库连接 2)jdbc接口核心的API

    JDBC接口核心的API java.sql.*   和  javax.sql.*(java2.0以后更新的扩展) |- Driver接口: 表示java驱动程序接口.所有的具体的数据库厂商要来实现此接 ...

  3. Spring对Jdbc的封装——JdbcTemplate的使用

    链接:https://pan.baidu.com/s/15luDElW4oeEaP0nvEQ_40w 提取码:i2r1 JdbcTemplate是Spring对JDBC的封装,目的是使JDBC更加易于 ...

  4. Java微信公众平台接口封装源码分享

    前言:      这篇博客是在三月初动手项目的时候准备写的,但是为了完成项目只好拖延时间写这篇博客,顺便也可以在项目中应用我自己总结的的一些经验.今天看来,这些方法的应用还是可以的,至少实现了我之前的 ...

  5. C++ Redis mset 二进制数据接口封装方案

    C++ Redis mset 二进制数据接口封装方案 需求 C++中使用hiredis客户端接口访问redis: 需要使用mset一次设置多个二进制数据 以下给出三种封装实现方案: 简单拼接方案 在r ...

  6. JDBC操作封装

    这两天学习了一下jdbc的封装,依据的是下面这篇 http://wenku.baidu.com/link?url=FaFDmQouYkKO24ApATHYmA5QzUcj-UE-7RSSZaBWPqk ...

  7. 利用jdbc简单封装一个小框架(类似DBUtils)

    利用jdbc写的一个类似DBUtils的框架 package com.jdbc.orm.dbutils; import java.io.IOException; import java.io.Inpu ...

  8. hiredis异步接口封装并导出到Lua

    hiredis异步接口封装并导出到Lua(金庆的专栏 2017.1)hiredis 不支持 Windows, Windows 下使用 wasppdotorg / hiredis-for-windows ...

  9. 基于Verilog的带FIFO输出缓冲的串口接收接口封装

    一.模块框图及基本思路 rx_module:串口接收的核心模块,详细介绍请见“基于Verilog的串口接收实验” rx2fifo_module:rx_module与rx_fifo之间的控制模块,其功能 ...

随机推荐

  1. SSH整合项目----在线商城

    1.1 网上商城需求分析 1.1.1    前台:用户模块. 注册: * JS非空校验.(不是必须) * Struts2数据校验:在注册Action类同一包下新建UserAction-user_reg ...

  2. 《Google工作法》读书笔记

    最近一段时间,拜读了<Google工作法>,工作效率提升10倍的57个技巧. 作者是彼得·费利克斯·格日瓦奇,波兰人. 其中印象最深刻的部分如下: (1)不要被邮件夺走时间 不用邮件,所有 ...

  3. php连接mysql,数据CRUD操作

    插入数据 <?php $name = $_GET['username']; $sex = $_GET['sex']; $hobby = $_GET['hobby']; $address = $_ ...

  4. USACO2.2 Preface Numbering【思维+打表】

    这道题乍一看没有什么思路,细看还是没有什么思路 嗯,细看还是可以看出些什么端倪. 不能复合嵌套什么的 总结一下就只有这样3种规则: 1.IXCM最多三个同样连续 加起来2.递减:加起来 注意VLD不连 ...

  5. [转帖]黑客通过 Rootkit 恶意软件感染超 5 万台 MS-SQL 和 PHPMyAdmin 服务器

    黑客通过 Rootkit 恶意软件感染超 5 万台 MS-SQL 和 PHPMyAdmin 服务器 https://www.cnbeta.com/articles/tech/852141.htm 病毒 ...

  6. Kettle的Kitchen和Span

    Kitchen——工作(job)执行器 (命令行方式) -rep  : Repository name   任务包所在存储名    -user  : Repository username   执行人 ...

  7. POJ 2492 A Bug's Life 题解

    题面 这道题是一道标准的种类并查集: 种类并查集是给每个结点一个权值.然后在合并和查找的时候根据情况对权值来进行维护. 通过将原有的区间范围变大使并查集可以维护种类的联系: #include < ...

  8. 洛谷 P1072 Hankson 的趣味题 题解

    题面 提前知识:gcd(a/d,b/d)*d=gcd(a,b); lcm(a,b)=a*b/gcd(a,b); 那么可以比较轻松的算出:gcd(x/a1,a0/a1)==gcd(b1/b0,b1/x) ...

  9. CodeForces-431D Random Task

    题目描述 求一个\(n\),使得\(n+1\)到\(2n\)这些数的二进制中恰好有\(k\)个\(1\)的数有\(m\)个. Input 输入包含两个正整数\(m,k\).$(0<=m<= ...

  10. redis windows 安装 下载 常用参数

    下载地址 https://github.com/ServiceStack/redis-windows/tree/master/downloads 安装可视化工具 RedisDesktopManager ...