`
yangsongjing
  • 浏览: 248816 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

数据连接池&jdbc

阅读更多

其好处是易于扩展,代码的重用性极高。具有很高的移植性

它需要配置一个.properties的属性文件 

例如:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/ysj
user=root
password=a
很简单吧  你也试下吧

 

 

 

package com.icss.dao;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.dbcp.BasicDataSource;

public class DBHelper {
 private Connection con = null;
 private PreparedStatement pstmt;
 private ResultSet rs;
 private ResultSetMetaData metaData;

 public Connection getCon() {

  try {
   if (con == null) {
    BasicDataSource ds = new BasicDataSource();
    // 基本参数
    ds.setDriverClassName(Env.getInstance().getProperty("driver"));
    ds.setUsername(Env.getInstance().getProperty("user"));
    ds.setPassword(Env.getInstance().getProperty("password"));
    ds.setUrl(Env.getInstance().getProperty("url"));
    // 池属性
    ds.setInitialSize(5);// 初始化连接池时,创建连接个数
    ds.setMinIdle(10);// 最小空闲连接数
    ds.setMaxIdle(100);// 最大空闲连接数
    ds.setMaxActive(100);// 连接池最大并发容量
    con = ds.getConnection();
   }
  } catch (SQLException e) {
   e.printStackTrace();
  }

  return con;
 }

 protected void fillParameter(PreparedStatement pstmt, String[] params) {
  if (pstmt != null && params != null && params.length > 0) {
   for (int i = 0; i < params.length; i++) {
    try {
     pstmt.setString(i + 1, params[i]);
    } catch (SQLException e) {
     e.printStackTrace();
    }
   }
  }
 }

 public void closeAll(Connection con, PreparedStatement pstmt, ResultSet rs) {
  if (rs != null) {
   try {
    rs.close();
   } catch (SQLException e) {
    e.printStackTrace();
   }
  }
  if (pstmt != null) {
   try {
    pstmt.close();
   } catch (SQLException e) {
    e.printStackTrace();
   }
  }
  if (con != null) {
   try {
    con.close();
   } catch (SQLException e) {
    e.printStackTrace();
   }
  }
 }

 public int doUpdate(String sql, String[] params) {
  int result = -1;
  con = getCon();
  try {
   pstmt = con.prepareStatement(sql);
   fillParameter(pstmt, params);
   result = pstmt.executeUpdate();
  } catch (SQLException e) {
   e.printStackTrace();
  } finally {
   closeAll(con, pstmt, null);
  }
  return result;
 }

 public int getUniqueResult(String sql, String[] params) {
  int result = -1;
  con = this.getCon();
  try {
   pstmt = con.prepareStatement(sql);
   fillParameter(pstmt, params);
   rs = pstmt.executeQuery();
   while (rs.next()) {
    result = rs.getInt(1);
   }
  } catch (SQLException e) {
   e.printStackTrace();
  } finally {
   closeAll(con, pstmt, rs);
  }

  return result;

 }

 public <T> List<T> findAll(String sql, String[] params, Class<T> t) {
  List<T> list = new ArrayList<T>();
  // 通过反射取出Class中所有的方法
  Method[] methods = t.getMethods();

  con = this.getCon();
  try {
   pstmt = con.prepareStatement(sql);
   fillParameter(pstmt, params);

   // 获取数据库中要查询的表的信息
   int columnCount = getColumnCount(pstmt);
   // 定义一个字符串数组用来存所有的数据表中的列名
   String[] columnNames = new String[columnCount];
   // 将所有的列名都按顺序存到这个数组中去
   restoreAllColumnNames(columnNames);

   // 继续执行rs操作
   rs = pstmt.executeQuery();
   while (rs.next()) {
    // 实例化一个对象
    T instance = t.newInstance();

    // 循环方法数组和columnNames组
    for (Method m : methods) {
     for (int i = 0; i < columnNames.length; i++) {
      // 取出columnNames中的名字在前面加上set
      String mname = "set" + columnNames[i];
      //System.out.println("数据库列:" + columnNames[i]);
      //System.out.println("方法是:" + m.getName());
      //System.out.println("类型为:"
      //  + rs.getObject(columnNames[i]).getClass()
      //    .getName());
      if (m.getName().equalsIgnoreCase(mname)) {
       if ("java.math.BigDecimal".equals(rs.getObject(
         columnNames[i]).getClass().getName())) {
        m
          .invoke(instance, rs
            .getDouble(columnNames[i]));
       } else {
        m
          .invoke(instance, rs
            .getObject(columnNames[i]));
       }
      }
     }
    }

    list.add(instance);
   }
  } catch (IllegalArgumentException e) {
   e.printStackTrace();
  } catch (SQLException e) {
   e.printStackTrace();
  } catch (InstantiationException e) {
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   e.printStackTrace();
  } catch (InvocationTargetException e) {
   e.printStackTrace();
  }
  return list;

 }

 /**
  * 将所有的列名都按顺序存到这个数组中去
  *
  * @param pstmt2
  * @param columnNames
  * @throws SQLException
  */
 private void restoreAllColumnNames(String[] columnNames)
   throws SQLException {
  for (int i = 0; i < columnNames.length; i++) {
   columnNames[i] = metaData.getColumnName(i + 1);
  }
 }

 /**
  * 获取数据库中要查询的表的所有的列的数量
  *
  * @param pstmt2
  * @return
  * @throws SQLException
  */
 private int getColumnCount(PreparedStatement pstmt) throws SQLException {
  int count = 0;
  metaData = pstmt.getMetaData();
  count = metaData.getColumnCount();
  return count;
 }


}

分享到:
评论

相关推荐

    JDBC连接池&JDBCTemplate

    **JDBC连接池&JDBCTemplate** 在Java Web开发中,JDBC(Java Database Connectivity)是用于连接Java应用程序和数据库的标准接口。然而,直接使用JDBC进行数据库操作存在一些效率问题,比如频繁创建和关闭数据库...

    JDBC数据源连接池的配置和使用示例

    **JDBC数据源连接池配置与使用详解** 在Java Web应用中,数据库连接的管理是至关重要的。为了提高性能和资源利用率,开发人员通常会使用数据源连接池。本篇文章将详细讲解JDBC数据源连接池的配置和使用,以帮助你更...

    SpringBoot+MyBatis+Druid连接池+JDBC官方驱动+ClickHouse

    在这个场景中,我们关注的是一个基于SpringBoot、MyBatis和Druid连接池的项目,它利用了ClickHouse的JDBC官方驱动进行数据操作。这个组合提供了强大的数据库管理和分析能力,特别适合大数据量的实时查询和分析。下面...

    Tongweb5中配置JDBC连接池

    本文将详细介绍如何在Tongweb5中配置JDBC连接池,以及Web应用如何通过JNDI(Java Naming and Directory Interface)查找并使用这些数据源。 首先,我们需要了解JDBC连接池的基本原理。JDBC连接池是在应用启动时预...

    JDBC连接池(通用basedao)可直接用的模板

    在Java开发中,数据库操作是不可或缺的一部分,而JDBC连接池是提高数据库访问效率、优化系统资源使用的重要技术。本文将深入探讨JDBC连接池的概念、工作原理,并以"通用basedao"模板为例,讲解如何在实际项目中应用...

    day06_JDBC连接池&JDBCTemplate_docx1

    【JDBC连接池&JDBCTemplate】是Java开发中处理数据库交互的重要技术。JDBC是Java Database Connectivity的缩写,它提供了一组接口和类,使得Java程序能够与各种类型的数据库进行通信。JDBC不仅是Java操作数据库的...

    day06_JDBC连接池&JDBCTemplate2

    JDBC(Java Database Connectivity)是...JDBC连接池和JDBCTemplate是其在实际开发中的两个重要补充,它们提高了性能和代码质量,简化了数据库操作的复杂度。了解并熟练掌握这些知识,对于Java开发人员来说至关重要。

    SQL Server数据库连接池及jdbc调用

    本文将深入探讨SQL Server数据库连接池以及Java JDBC(Java Database Connectivity)如何进行调用。 首先,我们来理解什么是数据库连接池。数据库连接池是一种在应用服务器启动时预先建立的数据库连接集合,这些...

    常用jdbc数据库连接jar包,数据库连接池jar包

    C3P0通过组合多个数据源来实现连接池,可以更好地控制并发和资源管理。 这些jar包的收集意味着开发者可以快速找到适用于不同数据库的JDBC驱动和连接池实现,无需花费时间在网上搜索和验证资源的可靠性。随着技术的...

    mysql数据连接池

    MySQL 数据连接池是一种数据库管理技术,它在应用服务器和数据库之间起到了中介的作用,优化了数据库的连接使用,提高了系统的性能和资源利用率。在Java、Python等编程语言中,都有相应的库或框架支持数据连接池的...

    数据库连接池——JDBC通过代理模式来保持用户关闭连接的习惯

    数据库连接池,又称为数据源,是在应用程序中预先创建并维护的一组数据库连接。它允许多个客户端共享这些连接,而不是每次需要访问数据库时都创建新的连接。这样可以减少创建和销毁连接的开销,提高系统的整体性能。...

    JDBC数据连接池实现

    "JDBC数据连接池实现"这个主题主要涉及Java数据库连接(JDBC)以及如何有效地管理数据库连接,以提高应用程序的性能和资源利用率。连接池技术在此扮演着至关重要的角色。 首先,JDBC是Java编程语言与各种类型数据库...

    JDBC数据库连接池实现原理

    1. **选择连接池实现**:首先,我们需要选择一个合适的数据库连接池实现,如Apache的DBCP、C3P0、HikariCP或Tomcat JDBC连接池等。这些连接池库提供了管理和维护数据库连接的功能。 2. **配置连接池**:在应用的...

    java JDBC连接池

    Java JDBC连接池是一种高效管理数据库连接的技术,它允许应用程序重复使用已经建立的数据库连接,从而减少频繁创建和关闭连接带来的开销。在大型系统中,尤其是高并发环境下,使用连接池能够显著提升性能并降低资源...

    简单的jdbc连接池类

    本示例中的"简单的jdbc连接池类"实现了一个基本的数据库连接池功能,非常适合初学者理解和实践。 首先,我们来理解`jdbc`。JDBC(Java Database Connectivity)是Java语言用来与各种数据库进行交互的一种标准接口。...

    完美的java jdbc连接池实例

    总之,这个"完美的Java JDBC连接池实例"提供了灵活、高效的数据源管理方案,无论是在小型应用还是大型企业级系统中,都能显著提升数据库操作的性能,降低资源消耗。同时,其兼容多种数据库的能力使得迁移和扩展变得...

    JDBC + MySQL使用c3p0连接池

    C3P0是一个支持JDBC3规范和JDBC2的标准扩展的连接池组件,它提供了强大的性能和配置选项。C3P0的核心功能包括: 1. **连接管理**:C3P0能创建并维护一个数据库连接池,这些连接可以在多个请求之间复用,从而避免了...

    数据连接池有用的jar包

    数据连接池在IT行业中扮演着至关重要的角色,尤其是在大型企业级应用系统中。它是一种管理数据库连接的技术,通过复用已存在的数据库连接,避免频繁创建和销毁连接带来的性能开销,提高了系统的运行效率和资源利用率...

    连接池案例 连接池案例

    在实际应用中,开发者通常会在Spring框架中配置数据源,选择合适的连接池实现,如在Spring Boot项目中,可以通过YAML或properties配置文件设置连接池的相关参数: ```yaml spring: datasource: type: ...

Global site tag (gtag.js) - Google Analytics