`
giraffeql
  • 浏览: 16786 次
  • 性别: 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 封装例子 servlet

    jdbc 封装例子 jdbc 封装例子 jdbc 封装例子 jdbc 封装例子

    JDBC封装步骤

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

    JDBC封装类

    一个完整的JDBC封装类,帮助我们更快的编程

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

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

    jdbc完全封装实现增删改查

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

    jdbc-utils.rar_Utils_jdbc_jdbc封装

    jdbc封装处理类 jdbc封装处理类

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

    java增删改查JDBC封装类(泛型封装),这个是高度封装化的,增删改查,直接用到我的项目中去的。

    Scala的JDBC封装包Scweery.zip

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

    SpringBoot中封装jdbc工具类

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

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

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

    java JDBC封装库

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

    类似hibernate的jdbc封装

    类似hibernate的jdbc简单封装,说不定大家用的上。。

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

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

    jdbc封装包

    自己做的封装,简单一点,源代码, 到吗简单易懂,只需修改几个参数就

    JDBC简单封装类

    简单的jdbc封装,添加了详细的注视内容。更容易理解。

    jdbc封装的代码

    关于jdbc封装的知识,适合于java的初学者和工作人员。

Global site tag (gtag.js) - Google Analytics