`
jallay
  • 浏览: 43834 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

JDBC 连接封装

阅读更多
为了实现java代码的可重用性,可变性,我们需要对代码进行封装,并真真的实现JAVA的面向对象的封装的思想,以下是通过对去config.properties配置文件中的关于数据库的各项配置来实现不用改代码而直接对文本操作来实现其正真意义上的封装:
package com.JDBC.firstJDBC;

import java.util.*;
import java.io.*;
import java.sql.*;

/*此类用于封装Java程序链接数据库所需要配置的JDBC操作
 * 
 * */

public class JDBCUtil {
	
	private static Properties info=new Properties();
	
	static{
		try{
			//用于读取配置文件中的字节流
			//getResourceAsStream方法用于类加载器在加载的时候并加载制指定的资源。
			 InputStream is=JDBCUtil.class.getResourceAsStream("/com" +
			 		"/JDBC/firstJDBC/config.properties");
			 
			 info.load(is);
			 is.close();
		}catch(Exception e){
			//此处只能跑出此种异常,这种异常专门用来在初始化快中抛出的
			throw new ExceptionInInitializerError(e);
		}
		
	}
	
	//返回一个连接
	public static Connection getConnection()throws Exception{
		Class.forName(info.getProperty("driver"));
		return DriverManager.getConnection(info.getProperty("url"),
				 info.getProperty("username"),info.getProperty("pwd"));	
	}
	//释放一个资源
	public static void release(ResultSet rs,Statement stm,Connection cn){
		if(rs!=null) try{rs.close();}catch(Exception e){}
		if(stm!=null) try{stm.close();}catch(Exception e){}
		if(cn!=null) try{cn.close();}catch(Exception e){}
	}

}


但上述连接代码存在严重的资源浪费的情况,比如任何一个对象只要调用JDBCUtil的getConnection()方法,就会得到一个连接,这样大大的浪费了资源,以下通过singleton设计模式进行改进后的代码如下:
package com.JDBC.firstJDBC;

import java.util.*;
import java.io.*;
import java.sql.*;

/*此类用于封装Java程序链接数据库所需要配置的JDBC操作
 * 
 * */
public class SingletonJDBCUtil{
	private static Properties info=new Properties();
	private static Connection conn=null;
	
	static{
		try{
			//用于读取配置文件中的字节流
			//getResourceAsStream方法用于类加载器在加载的时候并加载制指定的资源。
			 InputStream is=JDBCUtil.class.getResourceAsStream("/com" +
			 		"/JDBC/firstJDBC/config.properties");
			 
			 info.load(is);
			 is.close();
		}catch(Exception e){
			//此处只能跑出此种异常,这种异常专门用来在初始化快中抛出的
			throw new ExceptionInInitializerError(e);
		}
	}
	
	//返回一个连接
	public static Connection getConnection()throws Exception{
		
      if(conn==null){
		Class.forName(info.getProperty("driver"));
		conn=DriverManager.getConnection(info.getProperty("url"),
				 info.getProperty("username"),info.getProperty("pwd"));	
		}
      return conn;
	}
	//释放一个资源
	public static void release(ResultSet rs,Statement stm,Connection cn){
		if(rs!=null) try{rs.close();}catch(Exception e){}
		if(stm!=null) try{stm.close();}catch(Exception e){}
		if(cn!=null) try{cn.close();}catch(Exception e){}
	} 

}


这种代码仍然存在问题,当多个线程同时调用该连接的时候,当某一个线程关闭该连接后,其他线程由于还有某些操作没有提交而导致业务的错误.因此,需要一个线程一个连接,代码如下:
package com.JDBC.firstJDBC;

import java.util.*;
import java.io.*;
import java.sql.*;

/*此类用于封装Java程序链接数据库所需要配置的JDBC操作
 * 
 * */
public class BestUtil{
	
	private static Properties info=new Properties();
	
	
	static{
		try{
			//用于读取配置文件中的字节流
			//getResourceAsStream方法用于类加载器在加载的时候并加载制指定的资源。
			 InputStream is=JDBCUtil.class.getResourceAsStream("/com" +
			 		"/JDBC/firstJDBC/config.properties");
			 
			 info.load(is);
			 is.close();
		}catch(Exception e){
			//此处只能跑出此种异常,这种异常专门用来在初始化快中抛出的
			throw new ExceptionInInitializerError(e);
		}
	}
	//返回一个连接
	private static final ThreadLocal<Connection> tl=new ThreadLocal<Connection>(); 
	public static Connection getConnection()throws Exception{
	  Connection conn=tl.get();
	  if(conn==null){
		Class.forName(info.getProperty("driver"));
		conn=DriverManager.getConnection(info.getProperty("url"),
				 info.getProperty("username"),info.getProperty("pwd"));	
		         tl.set(conn);
	  }
	  return conn;
	}
	//释放一个资源
	public static void release(ResultSet rs,Statement stm,Connection cn){
		if(rs!=null) try{rs.close();}catch(Exception e){}
		if(stm!=null) try{stm.close();}catch(Exception e){}
		if(cn!=null) try{cn.close();}catch(Exception e){}
	}
}

这种模式解决了在前面出现并发操作的问题,是一种你比较优秀的数据连接封装操作,其中用到了ThreadLocal类,每一个线程都有一个用于存储线程的局部变量(线程独占数据,用Map对象来存储数据):由于线程的局部变是属于java.lang包的 defalut类型,因此,要访问该对象就必须用调用ThreadLocal对象来获的里面的对象。
分享到:
评论

相关推荐

    游戏服务器 数据库连接池 jdbc 简单封装

    本文将深入探讨“游戏服务器数据库连接池JDBC简单封装”的相关知识点。 首先,我们需要理解JDBC(Java Database Connectivity)的概念。JDBC是Java语言中用来规范客户端程序如何访问数据库的应用程序接口,提供了...

    Java连接数据库 JDBC封装类 带使用例子

    Java JDBC封装类,带增删改查例子,支持oracle,MySql,hsqldb 等,支持事务,返回数据格式 支持二维数组,MAP格式,以及javabean对象。有利于初学者DbDemo.java为demo,Connect为jdbc封装类,可以作为项目共通类使用。

    对jdbc的封装的总结

    本文将深入探讨对JDBC的封装,旨在提高数据库操作的效率、易用性和可维护性。 首先,理解JDBC的基本流程至关重要。通常包括以下步骤: 1. 加载驱动:使用`Class.forName()`方法加载数据库驱动,使得Java程序能够与...

    JDBC 连接db2 v9工程

    接下来,我们需要创建一个JDBC连接封装类,这个类通常包含以下几个方法: 1. **获取数据库连接(getConnection)**:使用`DriverManager.getConnection()`方法,传入从.properties文件读取的数据库URL、用户名和...

    jdbc 连接数据库封装类,可返回map,或者vo(自用)

    5. **NetJavaSession.java**:这个文件的名字可能暗示了它与网络会话有关,或者是对JDBC连接的进一步封装,提供了一种基于会话的数据库操作方式。可能包含事务管理、并发控制等特性,以确保数据的一致性和完整性。 ...

    java JDBC 连接sql server封装

    以上就是一个基本的Java JDBC连接SQL Server的封装示例。通过这种方式,你可以轻松地在多个地方重用相同的连接逻辑,同时保持代码的整洁。记住,对于生产环境,最好使用连接池(如HikariCP、C3P0等)来管理和复用...

    javaBean自动生成工具,jdbc连接池封装

    JDBC(Java Database Connectivity)是Java与数据库交互的标准接口,而"jdbc连接池封装"则指的是对JDBC连接管理的优化。连接池是一种数据库资源复用机制,它可以预先创建并维护一定数量的数据库连接,当应用需要时...

    jdbc通用数据库连接

    **三、通用JDBC连接封装** 为了提高代码复用性和减少错误,通常会将上述步骤封装成一个通用的数据库连接类。这个类通常包含以下功能: 1. **初始化数据库连接**:包括加载驱动、创建连接等。 2. **执行SQL**:...

    用于实习jdbc的数据库连接封装类

    java用于jdbc的连接的实现类,在数据库连接的时候直接new出来就OK了!DAO层自己加写...

    jdbc连接mysql工具类

    总之,`jdbc连接mysql工具类`主要涉及JDBC API的使用,包括数据库连接、预编译的SQL语句(PreparedStatement)、结果集处理以及资源管理。这个工具类可以极大地简化数据库操作,提高代码的可维护性和复用性。通过...

    JDBC连接Mysql数据库案例

    本案例将探讨如何使用JDBC连接MySQL数据库,并通过实际的代码示例讲解整个过程。我们将涉及以下知识点: 1. **JDBC驱动注册**: 在Java中,连接MySQL数据库首先需要加载并注册JDBC驱动。MySQL的JDBC驱动类是`...

    jdbc连接oracle11g初次封装.docx

    ### JDBC 连接 Oracle11g 初次封装解析 #### 概述 在软件开发过程中,使用 Java Database Connectivity (JDBC) 来连接数据库是非常常见的做法。JDBC 是 Java 语言中的数据库访问接口,为数据库应用开发人员提供了...

    jdbc连接池封装及ORM框架jdbc.rar

    在这个“jdbc连接池封装及ORM框架jdbc.rar”文件中,我们可以探讨几个核心概念和技术,包括设计模式的应用、注解的使用以及反射机制。 首先,**设计模式**在软件开发中起着至关重要的作用。例如,工厂模式可能被...

    通过JDBC连接Oracle数据库的十大技巧

    总之,通过掌握JDBC连接Oracle数据库的技巧,能够极大地提高程序的效率和稳定性。选择合适的驱动程序、关闭自动提交、使用PreparedStatement对象、批量处理、调用存储过程以及优化连接池等策略,都是提高Java应用...

    JDBC简单封装类

    在"JDBC简单封装类"中,这些步骤可能会被封装到单独的方法里,比如`connect()`用于建立连接,`executeQuery(String sql)`和`executeUpdate(String sql)`分别用于执行查询和更新,`getResultSet()`用于获取结果集,...

    OracleJDBC连接类

    Oracle JDBC 连接类是 Oracle 数据库与 Java 应用程序之间进行通信的重要桥梁。Java Database Connectivity (JDBC) 是 Java 平台的标准接口,它允许程序员使用 Java 语言来执行 SQL 命令,从而操作数据库。Oracle ...

    java增删改查JDBC封装类(泛型封装)

    - `SqlServerConn`可能是一个针对SQL Server数据库的连接类,封装了JDBC连接和操作的方法。 - 可能包含如`getConnection()`获取数据库连接,`executeQuery(String sql, ResultSetHandler&lt;T&gt; handler)`执行查询并...

    原创的JDBC封装可支持各种数据库

    本文将详细探讨如何进行JDBC的封装,以便支持多种数据库,以及在配置文件中进行灵活配置。 首先,了解JDBC的基本步骤:加载驱动、建立连接、创建Statement或PreparedStatement对象、执行SQL语句、处理结果集、关闭...

    jdbc连接数据库getConnection 增、删、改、查

    SqlHelper.java连接数据库通用类... package org.jdbc.com.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql....

    Jdbc连接数据库的方法

    本篇将详细介绍如何使用JDBC连接数据库,并通过一个简单的示例进行讲解。 首先,要连接到数据库,我们需要确保已经正确地在项目中引入了对应数据库驱动的JAR包。例如,上述代码示例中使用的数据库是Microsoft SQL ...

Global site tag (gtag.js) - Google Analytics