`

优化的 JAVA 数据库连接通用类

    博客分类:
  • Java
阅读更多

之前我曾经放出过一个通用的数据库连接DAO。但是其也有一定的局限性!例如当数据库连接的

驱动 数据库名称 连接用户名 连接密码

等发生变化的时候,需要重新编译类库。
现在我们对之前的DAO进行如下的改动,使用资源配置文件的形式保存

驱动 数据库名称 连接用户名 连接密码

使该类库更方便

  • db.properties资源配置文件内容
  • driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/books
    user=root
    password=1111

     

  • 实现读取配置文件 db.properties 的静态类
  • package cn.net.royakon.dao;
    /*
     * 实现读取配置文件 db.properties 的静态类
     */
     
    import java.io.InputStream;
    import java.util.Properties;
     
    public final class Env extends Properties{
     
    	//定义变量
    	private static Env instance;
     
    	//以单例模式创建,获得对象实例
    	public static Env getInstance() {
    		if (instance != null) {
    			return instance;
    		}
    		else {
    			makeInstance();
    			return instance;
    		}
    	}
     
    	//同步方法,保证再同一时间,只能被一个调用
    	private static synchronized void makeInstance() {
    		if (instance == null) {
    			instance = new Env();
    		}
    	}
     
    	//调用文件的方法
    	private Env () {
    		InputStream is = getClass().getResourceAsStream("/db.properties");
    		try {
    			load(is);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
     
    }

     

  • 通用的JDBC数据库访问类
  • package cn.net.royakon.dao;
     
    /*
     * 功能:通用的JDBC数据库访问类
     */
    import java.util.*;
    import java.sql.*;
    import javax.servlet.jsp.jstl.sql.*;
    import cn.net.royakon.dao.Env;
     
    public abstract class GenericDao {
    	// 定义数据库连接
    	private Connection conn;
     
    	// 定义sql语句
    	private String sqlValue;
     
    	// 定义sql语句参数列表
    	private List values;
     
    	/**
    	 * 打开连接
    	 */
    	private void openConnection() {
    		try {
    			String driverClassName = Env.getInstance().getProperty("driver");
    			String url = Env.getInstance().getProperty("url");
    			String user = Env.getInstance().getProperty("user");
    			String password =Env.getInstance().getProperty("password");
     
    			Class.forName(driverClassName).newInstance(); 
    			conn = DriverManager.getConnection(url , user , password);			
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
     
    	/**
    	 * 设定SQL语句
    	 */
    	public void setSqlValue(String sqlValue) {
    		this.sqlValue = sqlValue;
    	}
     
    	/**
    	 * 设定SQL语句的参数列表
    	 */
    	public void setValues(List values) {
    		this.values = values;
    	}
     
    	/**
    	 * 将SQL语句参数列表中的值赋给预执行语句.
    	 * 
    	 * @param pstmt
    	 *            预执行语句
    	 * @param values
    	 *            sql语句参数列表
    	 */
    	private void setValues(PreparedStatement pstmt, List values)
    			throws SQLException {
    		// 循环,将SQL语句参数列表中的值依次赋给预执行语句
    		for (int i = 0; i < values.size(); i++) {
    			Object v = values.get(i);
    			// 注意,setObject()方法的索引值从1开始,所以有i+1
    			pstmt.setObject(i + 1, v);
    		}
    	}
     
    	/**
    	 * 执行查询
    	 * 
    	 * @return a javax.servlet.jsp.jstl.sql.Result 
    	 * 				  返回Result对象result
    	 * @exception SQLException
    	 *                定义sql异常
    	 */
    	public Result executeQuery() throws SQLException {
     
    		// 定义属性
    		Result result = null;
    		ResultSet rs = null;
    		PreparedStatement pstmt = null;
    		Statement stmt = null;
    		openConnection();
    		try {
    			if (values != null && values.size() > 0) {
    				// 使用预处理语句,并设定所有的sql语句所有参数值
    				pstmt = conn.prepareStatement(sqlValue);
    				setValues(pstmt, values);
    				// 执行查询sql语句,返回查询结果集
    				rs = pstmt.executeQuery();
    			} else {
    				stmt = conn.createStatement();
    				rs = stmt.executeQuery(sqlValue);
    			}
    			// 把ResultSet转换为Result
    			result = ResultSupport.toResult(rs);
    		} finally {
    			// 释放资源
    			if (rs != null) {
    				try {
    					rs.close();
    				} catch (SQLException e) {
    				}
    			}
    			if (stmt != null) {
    				try {
    					stmt.close();
    				} catch (SQLException e) {
    				}
    			}
    			if (pstmt != null) {
    				try {
    					pstmt.close();
    				} catch (SQLException e) {
    				}
    			}
    			if (conn != null) {
    				try {
    					conn.close();
    				} catch (SQLException e) {
    				}
    			}			
    		}
    		return result;
    	}
     
    	/**
    	 * 执行Update语句
    	 * 
    	 * @return numOfRows 
    	 * 				  返回受影响的行数
    	 * @exception SQLException
    	 *                定义sql异常
    	 */
    	public int executeUpdate() throws SQLException {
    		// 定义属性
    		int numOfRows = 0;
    		ResultSet rs = null;
    		PreparedStatement pstmt = null;
    		Statement stmt = null;
    		openConnection();
    		try {
    			if (values != null && values.size() > 0) {
    				// 使用预处理语句,并设定所有的sql语句所有参数值
    				pstmt = conn.prepareStatement(sqlValue);
    				setValues(pstmt, values);
    				numOfRows = pstmt.executeUpdate();
    			} else {
    				// 执行更新sql语句,返回受影响的行数
    				stmt = conn.createStatement();
    				numOfRows = stmt.executeUpdate(sqlValue);
    			}
    		} finally {
    			// 释放资源
    			if (rs != null) {
    				try {
    					rs.close();
    				} catch (SQLException e) {
    				}
    			}
    			if (stmt != null) {
    				try {
    					stmt.close();
    				} catch (SQLException e) {
    				}
    			}
    			if (pstmt != null) {
    				try {
    					pstmt.close();
    				} catch (SQLException e) {
    				}
    			}
    			if (conn != null) {
    				try {
    					conn.close();
    				} catch (SQLException e) {
    				}
    			}				
    		}
    		return numOfRows;
    	}
    }

     

    分享到:
    评论
    2 楼 w111222j 2011-02-11  
    为了回你一帖,还做了十多分钟的小测试。我晕。


    如果用JDBC的话,优化成这样是不错的了。呵呵,借用了。
    1 楼 glamey 2010-03-15  
    写的好复杂。

    相关推荐

      java数据库连接详解

      Java数据库连接(Java Database Connectivity,简称JDBC)是一套用于执行SQL语句的Java API,它由一组用Java语言编写的类和接口组成。通过JDBC,开发者可以编写出能够与多种不同类型的数据库进行交互的应用程序,而...

      数据库连接通用模块数据库连接通用模块

      1. **数据库驱动**:数据库连接通用模块首先需要安装并管理对应的数据库驱动,如JDBC(Java Database Connectivity)驱动用于Java,pymysql或psycopg2用于Python连接MySQL和PostgreSQL等。驱动是连接数据库的基础,...

      java操作各种数据库 通用类

      以上就是Java操作各种数据库通用类的核心知识点,通过这样的通用类,我们可以轻松地在不同数据库间切换,简化数据库操作的复杂性,提高代码的可复用性和可维护性。当然,实际应用中还需要根据项目需求进行适当的定制...

      java连接cache数据库说明,数据库驱动,cache可视化工具

      6. **性能优化**:在实际应用中,需要考虑性能优化,如使用连接池管理数据库连接,减少每次建立新连接的开销;使用批处理执行多条SQL语句;合理设计数据库表结构和索引等。 7. **安全性**:确保数据库连接的安全性...

      java 数据库 连接池驱动.rar

      Java数据库连接池驱动是Java应用程序在访问数据库时用于优化资源管理的一种技术。它提供了一种在多个数据库操作之间重用数据库连接的方式,从而避免了频繁创建和关闭连接带来的性能开销。连接池的核心思想是池化资源...

      java数据库连接池的资料

      Java数据库连接池是一种高效管理数据库连接的技术,它在Java应用程序中扮演着至关重要的角色。连接池的基本思想是预先创建一定数量的数据库连接,存储在内存中,当应用程序需要时,从池中获取一个已存在的连接,用完...

      java数据连接池通用类(范例)

      这个"java数据连接池通用类(范例)"可能是为了提供一个可以适用于多种连接池实现的通用模板,方便开发者快速集成和管理数据库连接。 首先,我们要理解数据连接池的工作原理。当应用程序启动时,连接池会预先初始化...

      数据库查询通用类

      数据库查询通用类是一种在软件开发中常见的设计模式,它封装了对数据库的增删改查操作,使得在项目中调用这些操作时更加简洁、高效。这个类通常包含静态方法或者实例方法,允许开发者通过传入不同的参数来执行不同的...

      java开发数据库连接

      本文将详细介绍如何在Java中建立数据库连接,以及如何利用连接池技术如C3P0来优化数据库操作。 首先,我们来看Java中的JDBC(Java Database Connectivity),它是Java平台的标准API,用于与各种数据库建立连接。...

      JAVA数据库连接池

      本资源主要涵盖了Apache的Commons DBCP和Commons Pool这两个组件,它们是实现Java数据库连接池的常用工具。 1. **数据库连接池原理** - **资源共享**:数据库连接池预先创建一定数量的数据库连接,并将这些连接...

      Java的动态代理、反射机制和数据库连接池技术

      总的来说,Java的动态代理、反射机制和数据库连接池是Java开发中不可或缺的工具和技术,它们极大地增强了Java应用程序的灵活性、可维护性和性能。学习并熟练掌握这些技术,对于提升开发效率和代码质量具有重要意义。

      JDBC数据库操作通用类

      ### JDBC数据库操作通用类知识点详解 #### 一、概述 JDBC(Java Database Connectivity)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC API既...

      JDBC连接数据库BaseDao通用类(可以调用存储过程)

      从给定的文件信息来看,我们正在探讨一个Java程序中用于连接数据库并调用存储过程的通用类——`BaseDaoOutput`。这个类是IT领域中处理数据库操作时经常使用的一种设计模式,它通过封装数据库连接、执行SQL语句、处理...

      Java数据库通用层源码DBPool_v4.8.3_src

      Java数据库通用层(通常称为JDBC连接池)是Java应用程序中用于管理数据库连接的重要组件。DBPool_v4.8.3_src是一个特定的数据库连接池的源代码版本,旨在提高数据库操作的性能和效率。在Java应用中,尤其是在高并发...

      数据库连接池包

      首先,mchange-commons-java-0.2.6.3.jar是Mchange Commons库的一部分,这个库包含了一些通用的工具类和辅助功能,为c3p0提供了基础支持,如线程管理、异常处理等。 c3p0-0.9.5-pre6.jar是c3p0的核心库,包含了...

      java操控数据库的基本方法及连接方式

      本篇文章将深入探讨Java如何连接并操作数据库,包括基本的CRUD(Create、Read、Update、Delete)操作和不同的数据库连接方式。 首先,Java通过JDBC(Java Database Connectivity)API与各种数据库进行交互。JDBC是...

      基于java的数据库连接池(使用了程序设计模式)

      数据库连接池是Java应用程序中管理数据库连接的一种高效方式,它避免了每次建立和关闭数据库连接时的开销。本项目基于程序设计模式,利用Java语言实现了数据库连接池,旨在提高数据库操作的性能和效率。 首先,我们...

      数据库连接池驱动包_数据库连接池驱动包_

      Druid 是阿里巴巴开源的一个强大、全面且高性能的Java数据库连接池。它不仅提供了基础的连接池功能,还集成了监控、SQL解析、拦截器等功能,可以帮助开发者进行性能分析和问题定位。Druid 还支持多种数据库,包括 ...

      Java数据库操作组件1.1

      总之,Java数据库操作组件1.1是一个针对Java开发者的重要升级,它增强了数据库操作的灵活性和效率,简化了复杂数据类型的处理,提升了性能,并优化了错误处理,使得数据库编程变得更加得心应手。对于那些需要频繁与...

      Java编程中主流数据库连接技术.pdf

      本文主要探讨了三种主流的Java数据库连接技术:JDBC、连接池以及Hibernate框架。 JDBC(Java Database Connectivity)是Java应用程序与各种数据库进行通信的标准接口。它允许开发者使用纯Java语言编写数据库应用...

    Global site tag (gtag.js) - Google Analytics