`
giraffeql
  • 浏览: 17808 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

简单的jdbc封装

阅读更多
工作中经常用到jdbc,嫌每次创建连接麻烦。自己简单的封装了下,也没有测试,不知道能不能用。


package com.geap.utils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import javax.sql.RowSet;
import javax.sql.rowset.CachedRowSet;

import com.sun.rowset.CachedRowSetImpl; //com.sun.rowset.jar包


/**
 * jdbc工具类,提供了三个方法
 * <ul>
 * <li>execute(sql)</li>
 * <li>executeQuery(sql)</li>
 * <li>executeUpdate(sql)</li>
 * </ul>
 * @author QiuLu
 */
public class JdbcUtil {
	
	/**
	 * 查询
	 * @param sql sql语句
	 * @return RowSet 离线结果集(CachedRowSet接口,CachedRowSetImpl实现)
	 * @throws Exception
	 */
	public static RowSet executeQuery(String sql) throws Exception{

		Context ctx = null;
		DataSource ds = null;
		Connection cn = null;
		Statement st = null;
		ResultSet rs = null;
		CachedRowSet crs = null;
		
		try {
			ctx = new InitialContext();
			crs = new CachedRowSetImpl();
			ds = (DataSource) ctx.lookup("java:comp/env/jdbc/OracleDS");
			cn = ds.getConnection();
			st = cn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
			rs = st.executeQuery(sql);
			crs.populate(rs);
			return crs;
			
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally {
			if(rs != null)
				try {
					rs.close();
				} catch ( Exception e) {
					e.printStackTrace();
				}
			if(st != null)
				try {
					st.close();
				} catch ( Exception e) {
					e.printStackTrace();
				}
			if(cn != null)
				try {
					cn.close();
				} catch ( Exception e) {
					e.printStackTrace();
				}
			if(ctx != null)
				try {
					ctx.close();
				} catch ( Exception e) {
					e.printStackTrace();
				}
		}
	}
	
	/**
	 * 执行sql
	 * @param sql sql语句
	 * @return 如果第一个结果为 ResultSet 对象,则返回 true;如果其为更新计数或者不存在任何结果,则返回 false 
	 * @throws SQLException
	 */
	public static boolean execute(String sql) throws SQLException{
		Context ctx = null;
		DataSource ds = null;
		Connection cn = null;
		Statement st = null;
		ResultSet rs = null;
		
		try {
			ctx = new InitialContext();
			ds = (DataSource) ctx.lookup("java:comp/env/jdbc/OracleDS");
			cn = ds.getConnection();
			st = cn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
			return st.execute(sql);
			
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally {
			if(rs != null)
				try {
					rs.close();
				} catch ( Exception e) {
					e.printStackTrace();
				}
			if(st != null)
				try {
					st.close();
				} catch ( Exception e) {
					e.printStackTrace();
				}
			if(cn != null)
				try {
					cn.close();
				} catch ( Exception e) {
					e.printStackTrace();
				}
			if(ctx != null)
				try {
					ctx.close();
				} catch ( Exception e) {
					e.printStackTrace();
				}
		}
	}
	
	/**
	 * 执行更新
	 * @param sql sql语句
	 * @return (1) 对于 SQL 数据操作语言 (DML) 语句,返回行计数 (2) 对于什么都不返回的 SQL 语句,返回 0 
	 * @throws SQLException
	 */
	public static int executeUpdate(String sql) throws SQLException{
		Context ctx = null;
		DataSource ds = null;
		Connection cn = null;
		Statement st = null;
		ResultSet rs = null;
		
		try {
			ctx = new InitialContext();
			ds = (DataSource) ctx.lookup("java:comp/env/jdbc/OracleDS");
			cn = ds.getConnection();
			st = cn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
			return st.executeUpdate(sql);
			
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally {
			if(rs != null)
				try {
					rs.close();
				} catch ( Exception e) {
					e.printStackTrace();
				}
			if(st != null)
				try {
					st.close();
				} catch ( Exception e) {
					e.printStackTrace();
				}
			if(cn != null)
				try {
					cn.close();
				} catch ( Exception e) {
					e.printStackTrace();
				}
			if(ctx != null)
				try {
					ctx.close();
				} catch ( Exception e) {
					e.printStackTrace();
				}
		}
	}
	
}



// 调用JdbcUtil.executeQuery()

public List getList() {
	RowSet crs = null;
	List<E> list = new ArrayList<E>();
	try {
		crs = JdbcUtil.executeQuery("select * from user");
		while(crs.next()){
			// todo
			list.add();
		}
		return list;
	} catch (Exception e) {
		e.printStackTrace();
	} finally{
		if(crs != null)
			try {
				crs.close();
			} catch ( Exception e) {
				e.printStackTrace();
			}
	}
	return null;
}

分享到:
评论
5 楼 敲木鱼的男孩 2012-11-26  
以上是我个人的理解,有不对之处望指正。
giraffeql 写道
敲木鱼的男孩 写道
恩,明白你的意思了。本人经常用到的就是finally中再次try,,catch以此类推,至到关闭connection具体写法如下:
try {
set.close();
} catch (SQLException e) {

e.printStackTrace();
}
finally{   //防止set.close()异常,st.close不能执行,把它放finally块中
try {
st.close();
} catch (SQLException e) {

e.printStackTrace();
}
finally{//防止st.close()异常,conn不能执行,把它放到finally块中
try {
conn.close();
} catch (SQLException e) {

e.printStackTrace();
}
}
不知道这种方式和你写的那种方式有什么不同之处和各自的优点,以及真正项目中应该如何写,请指教。
}

嗯,理解你的意思。
个人感觉两种方法都行,区别在于,你写的是层级式的,我写的是并列式的。
至于优缺点,我只理解到了两点:
1. 我的并列式,结构简单,但不能做异常转换。
2. 你的层级式,结构相对复杂,优点在于可以做异常转换。
异常转换的意思就是说,你可以在
try {
	st.close();
} catch (SQLException e) {
	e.printStackTrace();
	throw new RuntimeException(e); //此处抛出异常不影响后面的关闭方法
}
的catch中抛出新的异常,而不影响后面的关闭操作。

对于本实例来说,finally中使用了try catch 语句,不会有新异常抛出(至少我没想到如何抛出),所以采用并列式或层级式都行。
…………
以上是我个人的理解,有不对之处望指正。

明白了,谢谢了,共同学习,共同进步!
4 楼 giraffeql 2012-11-26  
敲木鱼的男孩 写道
恩,明白你的意思了。本人经常用到的就是finally中再次try,,catch以此类推,至到关闭connection具体写法如下:
try {
set.close();
} catch (SQLException e) {

e.printStackTrace();
}
finally{   //防止set.close()异常,st.close不能执行,把它放finally块中
try {
st.close();
} catch (SQLException e) {

e.printStackTrace();
}
finally{//防止st.close()异常,conn不能执行,把它放到finally块中
try {
conn.close();
} catch (SQLException e) {

e.printStackTrace();
}
}
不知道这种方式和你写的那种方式有什么不同之处和各自的优点,以及真正项目中应该如何写,请指教。
}

嗯,理解你的意思。
个人感觉两种方法都行,区别在于,你写的是层级式的,我写的是并列式的。
至于优缺点,我只理解到了两点:
1. 我的并列式,结构简单,但不能做异常转换。
2. 你的层级式,结构相对复杂,优点在于可以做异常转换。
异常转换的意思就是说,你可以在
try {
	st.close();
} catch (SQLException e) {
	e.printStackTrace();
	throw new RuntimeException(e); //此处抛出异常不影响后面的关闭方法
}
的catch中抛出新的异常,而不影响后面的关闭操作。

对于本实例来说,finally中使用了try catch 语句,不会有新异常抛出(至少我没想到如何抛出),所以采用并列式或层级式都行。
…………
以上是我个人的理解,有不对之处望指正。
3 楼 敲木鱼的男孩 2012-11-25  
恩,明白你的意思了。本人经常用到的就是finally中再次try,,catch以此类推,至到关闭connection具体写法如下:
try {
set.close();
} catch (SQLException e) {

e.printStackTrace();
}
finally{   //防止set.close()异常,st.close不能执行,把它放finally块中
try {
st.close();
} catch (SQLException e) {

e.printStackTrace();
}
finally{//防止st.close()异常,conn不能执行,把它放到finally块中
try {
conn.close();
} catch (SQLException e) {

e.printStackTrace();
}
}
不知道这种方式和你写的那种方式有什么不同之处和各自的优点,以及真正项目中应该如何写,请指教。
}
2 楼 giraffeql 2012-11-24  
敲木鱼的男孩 写道
好像有点问题吧,就是关闭resultset和statement和connection时,如果任一个的close()方法出错的话都不会再向下执行了,应该把statement或者connection的close()方法放入到finally代块中,使它们最终都会执行吧,不知道说的对不对?

首先谢谢你的评论。
关于你说的这个问题是这么考虑的,rs.close()即使抛出异常,也会被随后的catch抓住。catch里的方法e.printStackTrace()是打印错误信息(这个异常在此就结束了,并不会往外抛)。代码还会继续往下执行,直到finally结束。
你看呢!
1 楼 敲木鱼的男孩 2012-11-21  
好像有点问题吧,就是关闭resultset和statement和connection时,如果任一个的close()方法出错的话都不会再向下执行了,应该把statement或者connection的close()方法放入到finally代块中,使它们最终都会执行吧,不知道说的对不对?

相关推荐

    JDBC封装的工具类

    JDBC封装的工具类,将所有共同的代码提取过来,形成工具类

    jdbc封装工具类

    jdbc封装工具类,此类事封装成list,Object&gt;&gt;格式,可直接把转换为jsonArray格式传输数据。

    jdbc封装(实现对实体的增删改查[分页]).zip

    jdbc封装(实现对实体的增删改查[分页]),辅助学习Hibernate 包含三个文件夹,分别是: code-access实现 是用access实现的,本意是access方便,就一个文件,方便部署。但access有好多不支持,就写成这样.主要是可参考Dao...

    JDBC封装类

    标题:JDBC封装类 描述:此文章将详细介绍一个用于简化Java中JDBC操作的封装类,该类通过提供一系列方法来加速数据库编程任务,包括建立数据库连接、执行查询、处理结果集以及执行更新操作。 ### 一、JDBC封装类...

    JDBC封装.rar

    "JDBC封装"是指将常见的数据库操作,如增删改查(CRUD:Create, Read, Update, Delete),进行模块化和抽象化的过程,以便于在代码中重复使用和简化数据库交互。下面将详细介绍JDBC封装的原理、步骤以及它带来的好处...

    jdbc封装包

    【标题】:JDBC封装包 【描述】:JDBC(Java Database Connectivity)是Java语言中用来规范客户端程序如何访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。这个封装包是我个人制作的,旨在简化...

    JDBC封装步骤

    文档脉络清楚的详述了实现JDBC封装所需要进行的步骤。

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

    "java增删改查JDBC封装类(泛型封装)"这个主题是关于如何利用泛型来优化JDBC操作,以提高代码的可读性、安全性和复用性。以下将详细讲解这个主题涉及的知识点。 1. **JDBC基础**: - JDBC是Java中连接数据库的标准...

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

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

    jdbc完全封装实现增删改查

    实现完全的对jdbc对象的封装,只需调用则可对数据库进行CRUD操作

    自己写个JDBC封装

    **标题:“自己写个JDBC封装”** 在Java开发中,JDBC(Java Database Connectivity)是连接Java应用程序和关系数据库的标准接口。然而,原始的JDBC API使用起来相对繁琐,需要编写大量的重复代码,例如建立数据库...

    Scala的JDBC封装包Scweery.zip

    Scweery 是 Scala 一个封装了 JDBC 操作用来从 SQL 中创建 Scala 对象的工具包。 示例代码: using(petsDB) { connection =&gt; val findHogsQuery = "select name, gender from pets where family='erinaceidae' ...

    JDBC封装类升级版,支持DBCP、C3P0连接池,Java连接数据库带例子

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

    类似hibernate的jdbc封装

    标题提到的"类似hibernate的jdbc封装"就是这样的一个实践,它试图在不引入庞大框架的情况下,提供类似Hibernate的便捷性。 首先,我们来了解JDBC(Java Database Connectivity),它是Java中用于连接数据库的标准...

    SpringBoot中封装jdbc工具类

    现在的数据层的开发,大多会使用...但是在一些极端的场景下往往原生的jdbc方式操作数据库更灵活,性能更高。由于部分场景下MyBatis或JPA之类无法满足我的需求,所以我打算自己封装一套查数据库的工具类。 文章地址: ...

    java JDBC封装库

    自己封装好的,基于commons的DBBase,DBCP的数据库工具。支持线程池,支持直接对象化操作。即无需任何映射,只要是java标准类,属性带标准set、get,属性名称与查询结果集中字段名称相同,就可以直接查询出对象链表...

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

    在实际应用中,这些步骤往往重复且繁琐,因此进行JDBC封装是提高代码复用性和减少错误的有效方式。 1. **加载驱动**: 在Java程序中,我们需要通过Class.forName()方法加载对应的数据库驱动。封装时,我们可以将...

    jdbc-utils.rar_Utils_jdbc_jdbc封装

    "jdbc-utils.rar_Utils_jdbc_jdbc封装"这个压缩包提供了一些工具类,用于简化JDBC操作,提高代码的可读性和可维护性。下面我们将详细探讨JDBC封装处理类的原理和实现。 1. **JDBC基础** - JDBC API包括一组Java...

    DB.rar_jdbc封装

    本压缩包“DB.rar_jdbc封装”显然是一个关于如何使用Java JDBC进行数据库连接封装的示例或教程。下面我们将详细探讨JDBC以及如何进行封装。 首先,JDBC是Java平台上的一个接口,它允许Java应用程序与各种数据库进行...

Global site tag (gtag.js) - Google Analytics