`
xiaoban0514
  • 浏览: 16600 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

jdbc 工具类 v2.0

阅读更多

这次有更新,主要是增加了prepareStatement方法,这种方法的优势1,可防止SQL注入。2,效率高。

 

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * DBPool.java
 * utils class
 * @author fanfq
 * @version 2.0  2009-6-18
 * */
public class DBPool {
	
	private static DBPool instance = null;
	private static Connection conn = null;
	private static Statement stmt = null;
	private static ResultSet rs = null;
	private static int count = 0;
	private static PreparedStatement pstmt;
	
	
	/**私有的构造方法*/
	private DBPool(){
		super();
	}
	
	/**形成同步保证多线程访问只有一个实例*/
	private static synchronized Connection getConnection() {
		if(instance == null){
			instance = new DBPool();
		}
		return instance._getConnection();
	}
	
	/**私有的数据源配置*/
	private Connection _getConnection(){
		try{
			String sDBDriver = null;
			String sConnection = null;
			String sUser  = null;
			String sPassword = null;
			
			Properties p = new Properties();
			InputStream is = getClass().getResourceAsStream("/db.properties");
			p.load(is);
			
			sDBDriver = p.getProperty("DBDriver", sDBDriver);
			sConnection = p.getProperty("Connection",sConnection);
			sUser = p.getProperty("User",sUser);
			sPassword = p.getProperty("Password",sPassword);
			
			Properties pr = new Properties();
			pr.put("user", sUser);
			pr.put("password", sPassword);
			pr.put("characterEncoding", "GB2312");
			pr.put("useUnicode", "TRUE");
			
			SysLog.loger("connection db....");
			
			Class.forName(sDBDriver).newInstance();
			return DriverManager.getConnection(sConnection,pr);
			
		}catch(Exception e){
			e.printStackTrace();
			return null;
		}
	}
	
	/**关闭数据库连接*/
	public static synchronized void closeConnection(){
		
		SysLog.loger("connection is closed....");
		try{
			if (rs != null) {
				rs.close();
				rs = null;
			}
			if (stmt != null) {
				stmt.close();
				stmt = null;
			}
			if (pstmt != null) {
				pstmt.close();
				pstmt = null;
			}
			if (conn != null) {
				conn.close();
				conn = null;
			}
		}catch(SQLException exp){
			exp.printStackTrace();
		}
	}
	
	/**获得Statement*/
	@SuppressWarnings("finally")
	private static Statement getStatement(){
		if(null == conn){
			conn = getConnection();
		}
		try {
			stmt = conn.createStatement();			
		} catch (SQLException e) {			
			e.printStackTrace();
		}finally{
			return stmt;
		}
	}	

	/**执行常用查询语句专用*/
	@SuppressWarnings("finally")
	public static ResultSet exeQuery(String sql){
		
		if(null == stmt){
			getStatement();
		}
		try {
			SysLog.loger(sql);
			rs = stmt.executeQuery(sql);
		} catch (SQLException e) {			
			e.printStackTrace();
		}finally{
			return rs;
		}
	}
	
	/**执行特殊SQL语句专用*/
	public static void exeSQL(String sql) throws Exception{
		if(null == stmt){
			getStatement();
		}
		try {
			SysLog.loger(sql);
			stmt.execute(sql);
		} catch (SQLException e) {			
			e.printStackTrace();
		}
	}
	
	/**Statement执行update,inster,delete语句专用*/
	@SuppressWarnings("finally")
	public static int exeUpdate(String sql){
		if(null == stmt){
			getStatement();
		}
		try {
			SysLog.loger(sql);
			count = stmt.executeUpdate(sql);
		} catch (SQLException e) {			
			e.printStackTrace();
		}finally{
			return count;
		}
	}
	
	/**prepareStatement执行update,inster,delete语句专用*/
	@SuppressWarnings("finally")
	public static int exePstmtUpdate(String sql,Object[] params){
		if(sql!=null&&!sql.equals("")){
			if(params==null)
				params=new Object[0];			
		
			if(null == conn){
				conn = getConnection();
			}
			try{		
				SysLog.loger(sql);
				pstmt=conn.prepareStatement(sql);
				for(int i=0;i<params.length;i++){
					pstmt.setObject(i+1,params[i]);
				}
				count = pstmt.executeUpdate();
			}catch(SQLException e){
				SysLog.loger("exePstmtUpdate()方法出错!");				
				e.printStackTrace();
				
			}finally{
				return count;
			}		
		}
		return 0;
	}
	
	
	/**prepareStatement执行Query语句专用*/
	@SuppressWarnings("finally")
	public static ResultSet exePstmtQuery(String sql,Object[] params){
		if(sql!=null&&!sql.equals("")){
			if(params==null)
				params=new Object[0];			
		
			if(null == conn){
				conn = getConnection();
			}
			try{		
				SysLog.loger(sql);
				pstmt=conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
				for(int i=0;i<params.length;i++){
					pstmt.setObject(i+1,params[i]);
				}
				rs = pstmt.executeQuery();
			}catch(SQLException e){
				SysLog.loger("exePstmtQuery()方法出错!");
				e.printStackTrace();
				
			}finally{
				return rs;
			}		
		}
		return null;
	}

	//测试	
//	public static void main(String[] args){
//		
//		String sql = "SELECT * FROM dept";
//		ResultSet rss = exeQuery(sql);
//		try {
//			while(rss.next()){
//					System.out.println(rss.getInt(1) + " " + rss.getString(2)+" "+ rss.getString(3) + " " + rss.getInt(4) );
//				
//			}
//		} catch (SQLException e) {
//			e.printStackTrace();
//		}
//		closeConnection();
//		
//	}

}

 

 

#db.properties   
#author fanfq    
DBDriver=jdbcDirver  
Connection=URL  
User=userName  
Password=password  

 

分享到:
评论
3 楼 xiaoban0514 2009-10-10  
恩,你说的有道理这里确实是疏忽了。
2 楼 wgshengli 2009-09-20  
//  public static void main(String[] args){  
//        
//      String sql = "SELECT * FROM dept";  
//      ResultSet rss = exeQuery(sql);  
//      try {  
//          while(rss.next()){  
//                  System.out.println(rss.getInt(1) + " " + rss.getString(2)+" "+ rss.getString(3) + " " + rss.getInt(4) );  
//                
//          }  
//      } catch (SQLException e) {  
//          e.printStackTrace();  
//      }  
//      closeConnection();  
//        
//  }  

比如比较实时的使用数据库。
当执行了1-2中间时如果有人执行了closeConnection()那么rss得到的是一个null.就会报异常。
1.      ResultSet rss = exeQuery(sql);  
2.          while(rss.next()){  
1 楼 wgshengli 2009-09-20  
不知道博主用没有用过这个类,这个类有问题。

相关推荐

    sqlserver jdbc driver v2.0 for sqlserver 2005,2008

    总结,SQL Server JDBC Driver v2.0是针对SQL Server 2005和2008的Java开发者的重要工具,它提供了高效、稳定且全面的数据库连接功能,使得Java应用程序能够充分利用SQL Server的功能并进行无缝集成。在实际开发中,...

    要广告分类系统 v2.0_yad20.rar

    【要广告分类系统 v2.0_yad20.rar】是一个计算机毕业设计项目,主要涉及计算机网络、JSP(Java Server Pages)以及JAVA语言技术。这个项目旨在构建一个广告分类平台,用户可以在平台上发布、浏览和管理各类广告信息...

    最新Java面试题及答案V2.0

    5. **多线程**:包括线程的创建方式(继承Thread类和实现Runnable接口)、同步机制(synchronized关键字、Lock锁)、并发工具类(如ExecutorService、CountDownLatch、CyclicBarrier)等。 6. **IO流**:了解字节流...

    [搜索链接]要广告分类系统 v2.0_yad20.zip

    【要广告分类系统 v2.0_yad20.zip】是一个与Java毕业设计相关的压缩包,根据其名称推测,这可能是一个用于广告分类的软件系统,版本为2.0,可能包含了广告数据处理、分类算法以及其他相关功能。下面将详细讨论这个...

    AutoCode代码生成器 V2.0 JAVA版 下载

    总的来说,AutoCode代码生成器 V2.0 JAVA版是一个高效且灵活的开发工具,结合了模板引擎、数据库集成和GUI交互,帮助开发者快速生成Java代码,同时适应不同项目的定制需求。它的使用和理解涉及到Java编程、数据库...

    Guns技术文档v2.0.rar

    总结,Guns技术文档v2.0是一个全面介绍Guns框架的资源,涵盖了其核心组件、集成框架的使用方法、模块设计、安全控制以及快速开发工具的运用。对于希望掌握Guns框架的开发者来说,这份文档是一份宝贵的参考资料,可以...

    [搜索链接]要广告分类系统 v2.0_yad20.rar

    【要广告分类系统 v2.0_yad20.rar】是一个基于JSP技术的计算机专业课程设计项目,主要目标是实现一个广告分类管理系统。在这个系统中,用户可以浏览、搜索和管理不同类型的广告,从而提高广告发布和管理的效率。JSP...

    JavaCenter_Home_v2.0_Source

    【JavaCenter_Home_v2.0_Source】是一个包含Java编程语言相关开源项目的资源包,主要以UTF8编码格式提供。这个资源集合对于Java开发者来说是一个宝贵的资料库,它提供了丰富的学习材料和实践示例,有助于深入理解...

    [新闻文章]永恒文章管理系统(YHCMS) v2.0_yhcms_v20.zip

    永恒文章管理系统(YHCMS) v2.0 是一个基于Java技术开发的毕业设计项目,它主要面向需要构建新闻发布和管理平台的用户。这个系统具备文章的创建、编辑、删除、分类管理、搜索以及用户权限控制等功能,为中小型网站...

    JSP源码——[新闻文章]永恒文章管理系统(YHCMS) v2.0 源码版_yhcms_v20_src.zip

    【JSP源码详解——永恒文章管理系统YHCMS v2.0】 JSP(JavaServer Pages)是一种基于Java技术的动态网页开发技术,它允许开发者将静态HTML与动态Java代码结合,以创建交互式Web应用。永恒文章管理系统YHCMS v2.0是...

    houke_zou-Java面试题(达内技术模拟面试)_version-v2.0

    5. **多线程**:Java对多线程的支持很强大,面试中可能会问到线程的创建方式(Thread类、Runnable接口)、线程同步(synchronized关键字、Lock锁、wait/notify机制)、并发工具类(Semaphore、CountDownLatch、...

    [CMS程序]DJCMS影视程序 v2.0.zip

    【DJCMS影视程序 v2.0】是一款基于Java JSP技术构建的内容管理系统,主要用于搭建在线影视网站。这个程序是几年前的开发成果,适用于学生进行毕业设计学习,可以帮助他们理解和掌握Web应用程序开发的基本流程和技术...

    jeecg-framework-v2.0 (最新源码)

    5.常用共通封装,各种工具类,基本满足80%项目需求 6.集成简易报表工具,图像报表和数据导出非常方便 JEECG 功能特点 • 架构技术: Struts2+Spring3+Hibernate4+EasyUI1.3+Spring JDBC+Highcharts报表+Jquery+...

    [新闻文章]永恒文章管理系统(YHCMS) v2.0 源码版_yhcms_v20_src.zip

    【新闻文章】永恒文章管理系统(YHCMS)v2.0 源码版是一个基于Java JSP技术的开源项目,适用于学生进行毕业设计和论文研究。这个系统提供了丰富的功能,帮助用户管理和发布新闻文章,同时也为学习者提供了一个了解...

    [CMS程序]JTBC网站内容管理系统(JSP) V2.0.0.3 SQLite版.zip

    【CMS程序】JTBC网站内容管理系统(JSP) V2.0.0.3 SQLite版是一个基于Java JSP技术开发的网站内容管理系统,适用于学生进行毕业设计学习。这个系统利用了JSP(JavaServer Pages)的强大功能,结合SQLite数据库,提供...

    v2.0-JavaGuide面试突击版.pdf.zip

    3. **并发编程**:Java提供了丰富的并发工具类,如线程池、synchronized、volatile、ThreadLocal、Lock等,掌握它们的使用场景和原理对于处理高并发问题至关重要。 4. **多线程**:线程的创建与管理、同步机制、...

    guestbookv2.0

    《基于Hibernate、...总结,Guestbook V2.0案例展示了如何整合Hibernate、MyEclipse和Oracle等工具,构建一个完整的Web应用。通过深入理解这些技术,开发者可以更好地应对实际项目中的挑战,提升开发质量和效率。

    新闻管理器v2.0

    新闻管理器v2.0是一款基于Java开发的新闻内容管理系统,专为管理和发布新闻资讯而设计。这个系统可能包括了新闻发布、编辑、分类、搜索、评论等功能,旨在提高新闻网站或应用的运营效率。让我们深入了解一下Java在...

    JDBC学习笔记第十一篇

    本篇学习笔记将深入探讨JDBC的使用,特别是基于JDBC v2.0版本的工具类`baseDao`以及与MySQL数据库的连接。我们将使用`mysql-connector-java-8.0.27.jar`作为MySQL的驱动库,同时引入Druid 1.1.21.jar作为高效的数据...

    JavaEE+JDBC+Servlet+EL表达式的员工信息管理系统源码+数据库+项目说明(高分课设).zip

    [v2.0 - servlet-v2.0](https://gitee.com/LovelyHzz/java-ee-jdbc-servlet/tree/master/servlet-v2.0) [v3.0 - servlet-v3.0](https://gitee.com/LovelyHzz/java-ee-jdbc-servlet/tree/master/servlet-v3.0)...

Global site tag (gtag.js) - Google Analytics