J2ee开发用到的数据库操作类大全
J2ee项目开发过程中用到的数据库操作类
此数据库操作封装类在一个省级项目中使用到,在一个集团公司的科技管理项目中也使用过.
package jing.dbnew;
import java.sql.*;
import java.util.*;
import javax.sql.rowset.CachedRowSet;
import oracle.jdbc.rowset.OracleCachedRowSet;
import com.sun.rowset.CachedRowSetImpl;
/**
* Title:数据库操作类,有数据事物控制功能,请注意main函数中的调用事例
* @author 欧朝敬
* QQ:35712069
* 手机:13873195792
* @version 1.0
*/
public class DBManager {
public DBManager(){
}
/**
* 开始事务
*
*/
public void beginTransaction() {
try {
Connection con = ConnectionFactory.getInstance().getConnection();
con.setAutoCommit(false);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 回滚事务
*
*/
public void rollbackTransactoin() {
try {
Connection con = ConnectionFactory.getInstance().getConnection();
con.rollback();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 提交事务
*
*/
public void commitTransaction() {
try {
Connection con = ConnectionFactory.getInstance().getConnection();
con.commit();
con.setAutoCommit(true);
ConnectionFactory.getInstance().closeConnection();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 结束事务
*
*/
// public void endTransaction() {
// try {
// Connection con = ConnectionFactory.getInstance().getConnection();
// con.commit();
// con.setAutoCommit(true);
// ConnectionFactory.getInstance().closeConnection();
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
public boolean execute(String sql) throws Exception {
System.out.println("execute:" + sql);
boolean re = false;
Connection con = null;
PreparedStatement pstmt = null;
try {
con = ConnectionFactory.getInstance().getConnection();
pstmt =con.prepareStatement(sql);
re = pstmt.execute();
}catch(Exception ex){
ex.printStackTrace();
con.rollback();
} finally {
if (pstmt != null) {
pstmt.close();
}
}
return re;
}
/**
* 批量执行SQL语句,在一个事物里
* @param sql
* @return
* @throws Exception
*/
public int[] executeBatch(String[] sql) throws Exception {
int[] re=null;;
Connection con = null;
Statement stmt = null;
try {
con = ConnectionFactory.getInstance().getConnection();
con.setAutoCommit(false);
stmt =con.createStatement();
stmt.clearBatch();
for(int i=0;i<sql.length;i++){
stmt.addBatch(sql[i]);
System.out.println("executeBatch:" + sql[i]);
}
re = stmt.executeBatch();
con.commit();
}catch(Exception ex){
ex.printStackTrace();
con.rollback();
}
finally {
if (stmt != null) {
stmt.close();
}
}
return re;
}
/**
*
* @param sql
* @param value
* @param type
* @return
* @throws Exception
*/
public boolean execute(String sql, String[] value, int[] type)
throws Exception {
System.out.println("execute:" + sql);
boolean re = false;
Connection con = null;
PreparedStatement pstmt = null;
try {
con = ConnectionFactory.getInstance().getConnection();
pstmt = con.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
this.setParameters(pstmt,value,type); //调用私有方法设置参数
re = pstmt.execute();
} catch(Exception ex){
ex.printStackTrace();
con.rollback();
}finally {
if (pstmt != null) {
pstmt.close();
}
}
return re;
}
/**
* 执行查询,返回结果集 隐式事物处理
* @param sql String 要执行的SELECT语句
* @return CachedRowSet 未查到记录则返回null
* @throws Exception
*/
public CachedRowSet executeQueryCachedRowSet(String sql) throws Exception {
System.out.println("executeQueryCachedRowSet:" + sql);
CachedRowSet crs = null;
//OracleCachedRowSet crs=null;
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
con = ConnectionFactory.getInstance().getConnection();
/*stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
* java.sql.SQLException: 不允许的操作: Unsupported syntax for refreshRow()
* Oracle: Unsupported syntax for refreshRow()报此错使用以下方式解决
* 1、con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
* 2、con.createStatement();
*/
pstmt=con.prepareStatement(sql);
rs = pstmt.executeQuery();
if (!(rs.isBeforeFirst() == rs.isAfterLast())) {
crs = new CachedRowSetImpl();
//crs = new OracleCachedRowSet();
crs.populate(rs);
}
} catch(Exception ex){
ex.printStackTrace();
con.rollback();
}finally {
if (rs != null) {
rs.close();
}
if (pstmt != null) {
pstmt.close();
}
}
return crs;
}
/**使用OracleCachedRowSet实现,专门处理Oracle特有的SQL语句
* 执行查询,返回结果集 隐式事物处理
* @param sql String 要执行的SELECT语句
* @return OracleCachedRowSet 未查到记录则返回null
* @throws Exception
*/
public OracleCachedRowSet executeQueryOracleCachedRowSet(String sql) throws Exception {
System.out.println("executeQueryOracleCachedRowSet:" + sql);
OracleCachedRowSet crs=null;
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
con = ConnectionFactory.getInstance().getConnection();
/*stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
* java.sql.SQLException: 不允许的操作: Unsupported syntax for refreshRow()
* Oracle: Unsupported syntax for refreshRow()报此错使用以下方式解决
* 1、con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
* 2、con.createStatement();
*/
pstmt=con.prepareStatement(sql);
rs = pstmt.executeQuery();
if (!(rs.isBeforeFirst() == rs.isAfterLast())) {
crs = new OracleCachedRowSet();
crs.populate(rs);
}
}catch(Exception ex){
ex.printStackTrace();
con.rollback();
} finally {
if (rs != null) {
rs.close();
}
if (pstmt != null) {
pstmt.close();
}
}
return crs;
}
/**
* 执行高效率的SELECT语句,使用ORACLE的SQL特点
* @param sql String 带?号的SELECT语句
* @param value String[] ?对应的值
* @param type int[] ?对应的值的数据库表中的类型
* @return CachedRowSet 未查到记录则返回null
* @throws Exception
*/
public CachedRowSet executeQueryCachedRowSet(String sql, String[] value,
int[] type) throws Exception {
System.out.println("executeQueryRowSet:" + sql);
CachedRowSet crs = null;
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
con = ConnectionFactory.getInstance().getConnection();
pstmt = con.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
this.setParameters(pstmt,value,type); //调用私有方法设置参数
rs = pstmt.executeQuery();
if (!(rs.isBeforeFirst() == rs.isAfterLast())) {
crs = new CachedRowSetImpl();
crs.populate(rs);
}
}catch(Exception ex){
ex.printStackTrace();
con.rollback();
} finally {
if (rs != null) {
rs.close();
}
if (pstmt != null) {
pstmt.close();
}
}
return crs;
}
/**
* 执行查询,返回Map单条记录,如查执行结果有多条记录的情况下也只返回第一条记录 隐式事物处理
* @param sql String 要执行的SELECT语句
* @return Map 未查到记录则返回null,使用列名的大家做为Map的Key,列值对象为Map的value
* @throws Exception
*/
public Map executeQueryMap(String sql) throws Exception {
System.out.println("executeQueryMap:" + sql);
Map map = null;
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
con = ConnectionFactory.getInstance().getConnection();
pstmt =con.prepareStatement(sql);
rs = pstmt.executeQuery();
if (rs.next()) { // 有记录的情况
map = new HashMap();
ResultSetMetaData rsm = rs.getMetaData();
int colnum = rsm.getColumnCount(); // 得到记录的列数
for (int i = 1; i <= colnum; i++) {
// rsm.getColumnName(i).toUpperCase()统一列名大写
// rs.getObject(i)更的值为对象类型
map
.put(rsm.getColumnName(i).toUpperCase(), rs
.getObject(i));
}
}
} catch(Exception ex){
ex.printStackTrace();
con.rollback();
}finally {
if (rs != null) {
rs.close();
}
if (pstmt != null) {
pstmt.close();
}
}
return map;
}
/**
* 执行高效率的SELECT语句,使用ORACLE的SQL特点
* @param sql String 带?号的SELECT语句
* @param value String[] ?对应的值
* @param type int[] ?对应的值的数据库表中的类型
* @return Map 未查到记录则返回null,使用列名的大家做为Map的Key,列值对象为Map的value
* @throws Exception
*/
public Map executeQueryMap(String sql, String[] value, int[] type)
throws Exception {
System.out.println("executeQueryMap:" + sql);
Map map = null;
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
con = ConnectionFactory.getInstance().getConnection();
pstmt = con.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
this.setParameters(pstmt,value,type); //调用私有方法设置参数
rs = pstmt.executeQuery();
if (rs.next()) { // 有记录的情况
map = new HashMap();
ResultSetMetaData rsm = rs.getMetaData();
int colnum = rsm.getColumnCount(); // 得到记录的列数
for (int i = 1; i <= colnum; i++) {
// rsm.getColumnName(i).toUpperCase()统一列名大写
// rs.getObject(i)更的值为对象类型
map
.put(rsm.getColumnName(i).toUpperCase(), rs
.getObject(i));
}
}
} catch(Exception ex){
ex.printStackTrace();
con.rollback();
}finally {
if (rs != null) {
rs.close();
}
if (pstmt != null) {
pstmt.close();
}
}
return map;
}
/**
* 执行更新语句INSERT,UPDATE or DELETE
* @param sql String 要执行的SQL语句
* @return int 如果执行INSERT,UPDATE or DELETE则返回影响的记录行数,如果执行没有返回值的语句则返回为0
* @throws Exception
*/
public int executeUpdate(String sql) throws Exception {
System.out.println("executeUpdate:" + sql);
int re = 0;
Connection con = null;
PreparedStatement pstmt = null;
try {
con = ConnectionFactory.getInstance().getConnection();
pstmt = con.prepareStatement(sql);
re = pstmt.executeUpdate();
}catch(Exception ex){
ex.printStackTrace();
con.rollback();
} finally {
if (pstmt != null) {
pstmt.close();
}
}
return re;
}
/**
* 执行更新语句INSERT,UPDATE or DELETE
* @param sql String 要执行的带有?号的INSERT,UPDATE or DELETE语句
* @param value String[] ?对应的值
* @param type int[] ?对应的值的数据库表中的类型
* @return int 如果执行INSERT,UPDATE or DELETE则返回影响的记录行数,如果执行没有返回值的语句则返回为0
* @throws Exception
*/
public int executeUpdate(String sql, String[] value, int[] type)
throws Exception {
System.out.println("executeUpdate:" + sql);
int re = 0;
Connection con = null;
PreparedStatement pstmt = null;
try {
con = ConnectionFactory.getInstance().getConnection();
pstmt = con.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
this.setParameters(pstmt,value,type); //调用私有方法设置参数
re = pstmt.executeUpdate(); // 影响的记录行数
}catch(Exception ex){
ex.printStackTrace();
con.rollback();
} finally {
if (pstmt != null) {
pstmt.close();
}
}
return re;
}
/**
私有方法用来设置
* @param pstmt PreparedStatement对象的参数
* @param value 参数值
* @param type 参数类型
* @throws Exception
*/
private void setParameters(PreparedStatement pstmt,String[] value,int[] type)throws Exception{
int j = 1;
for (int i = 0; i < value.length; i++) {
switch (type[i]) {
case Types.INTEGER:
pstmt.setInt(j, Integer.parseInt(value[i]));
System.out.println("Parameter("+i+") INTEGER "+value[i]);
break;
case Types.FLOAT:
case Types.DOUBLE:
case Types.DECIMAL:
case Types.NUMERIC:
pstmt.setDouble(j, Double.parseDouble(value[i]));
System.out.println("Parameter("+i+") FLOAT、DOUBLE、DECIMAL、NUMERIC "+value[i]);
break;
case Types.CHAR:
case Types.VARCHAR:
case Types.LONGVARCHAR:
pstmt.setString(j, value[i]);
System.out.println("Parameter("+i+") CHAR、VARCHAR、LONGVARCHAR "+value[i]);
break;
case Types.DATE:
case Types.TIMESTAMP:
pstmt.setString(j, value[i]);
System.out.println("Parameter("+i+") DATE、TIMESTAMP "+value[i]);
break;
case Types.BOOLEAN:
// Boolean.parseBoolean(value[i]) JDK5API
pstmt.setBoolean(j, Boolean.getBoolean(value[i]));
System.out.println("Parameter("+i+") BOOLEAN "+value[i]);
break;
}
j = j + 1;
}
}
/**
* 执行记录的查询(调用存储过程)
* @param procName:调用存储过程的名称;
* @param returnType:游标返回类型
* 0为CachedRowSet以及各种类型
* @param outParameter:传入输出参数的类型,例如:new int[]{Types.REF,Types.REF,Types.VARCHAR},
* 表示所调用的存储过程前两个输出结果的类型为游标类型,第三个输出结果的类型为VARCHAR2类型。
* @param args 所调用存储过程的输入参数
* @return List<Object> 存储过程的输出结果
*
*/
public List<Object> executeProc(String procName,int returnType,int[] outParameter,Object... args) throws Exception {
List<Object> list = null;
Connection con = null;
CallableStatement cstmt = null;
try {
con = ConnectionFactory.getInstance().getConnection();
int iInStart = 1;// 存储过程输入参数的起始位
// 统计问号的个数
int parameterCount = args.length+outParameter.length; //调用的存储过程的总参数个数
// 组装带问号的SQL
String sql = "{call " + procName + "(";
for (int i = 1; i <= parameterCount; i++) {
if (i == parameterCount){
sql += "?";
}else{
sql += "?,";
}
}
sql += ")}";
System.out.println("executeProc:"+sql);
cstmt = con.prepareCall(sql);
for (int i = 0; i < args.length; i++) {// 循环设定存储过程的输入参数
cstmt.setObject(iInStart + i, args[i]);
System.out.println("设置输入参数:"+iInStart+" "+args[i]);
}
int iOutStart = args.length + iInStart;// 存储过程输出参数的起始位
for (int i = 0; i < outParameter.length; i++) {// 循环设定存储过程的输出参数
if (outParameter[i]==Types.REF){ //代表游标
cstmt.registerOutParameter(i + iOutStart, oracle.jdbc.driver.OracleTypes.CURSOR);
System.out.println("设置输出参数:"+(i + iOutStart)+" 游标");
}else if((outParameter[i]==Types.INTEGER)){
cstmt.registerOutParameter(i + iOutStart, Types.INTEGER);
System.out.println("设置输出参数:"+(i + iOutStart)+" 数值型");
}else{
cstmt.registerOutParameter(i + iOutStart, Types.VARCHAR);
System.out.println("设置输出参数:"+(i + iOutStart)+" 字符型");
}
}
cstmt.execute(); //执行
list = new ArrayList<Object>();
switch (returnType) {
case 0:// 把存储过程中返回的游标转换为CachedRowSet类型输出
for (int i = 0; i < outParameter.length; i++) {// 循环获取存储过程的输出结果,包括游标、字符串
if (outParameter[i]==Types.REF) { //处理游标
CachedRowSet crs=new CachedRowSetImpl();
//OracleCachedRowSet crs=new OracleCachedRowSet(); //使用Oracle10g的数据则必须要用10g的驱动,Oracle 10g驱动解决了“ORA-01002: 读取违反顺序”这个问题
if (cstmt.getObject(i + iOutStart) != null){
crs.populate((ResultSet)cstmt.getObject(i + iOutStart));
}
list.add(crs);
} else{ //非游标
list.add(cstmt.getObject(i + iOutStart));
}
}
break;
}
} catch (Exception ex) {
ex.printStackTrace();
con.rollback();
} finally {
cstmt.close();
}
return list;
}
public static void main(String[] args) throws Exception {
//DBManager dbm = new DBManager();
//dbm.execute("update dept set dname=? where deptno=? ",new String[]{"sdfsdfsad","51"},new int[]{Types.VARCHAR,Types.NUMERIC});
// Connection con = SingletonDataSource.getInstance().getConnection();
// CachedRowSet crs = dbm.executeQueryRowSet(
// "SELECT EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO FROM EMP WHERE
// EMPNO >7654",
// con);
// while (crs.next()) {
// System.out.println(crs.getString("EMPNO") + " " +
// crs.getString("ENAME"));
// }
// System.out.println("########################");
// Map map = dbm.executeQueryMap(
// "SELECT EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO FROM EMP WHERE
// EMPNO=7654",
// con);
// System.out.println(map.get("EMPNO") + " " + map.get("ENAME") + " " +
// map.get("COMM"));
// con.close();
/*
* String sql = "select * from emp where comm=?"; String[] value = new
* String[] {"500"}; int[] type = {Types.DOUBLE}; Map map =
* dbm.executeQueryMap(sql, value, type, null); //Map map =
* dbm.executeQueryMap("select * from emp where empno=? and ename=?",new
* String[] {"7654","MARTIN"},new int[]{Types.INTEGER,Types.VARCHAR},
* null); if (map != null) { System.out.println(map.get("EMPNO") + " " +
* map.get("ENAME")); }
*/
/*
* String sql = "select * from emp where empno>?"; String[] value = new
* String[] {"7693"}; int[] type = {Types.INTEGER}; CachedRowSet crs =
* dbm.executeQueryRowSet(sql, value, type, null); boolean isprint =
* true; while (crs.next()) { ResultSetMetaData rsmd =
* crs.getMetaData(); int colcount = rsmd.getColumnCount(); if (isprint) {
* isprint=false; for (int i = 0; i < colcount; i++) {
* System.out.print(rsmd.getColumnName(i + 1) + "/t/t"); }
* System.out.println(); } for (int i = 0; i < colcount; i++) {
* System.out.print(crs.getString(i + 1)+"/t/t"); }
* System.out.println(); }
*/
/*
* String sql = "update emp set comm=? where comm=?"; String[] value =
* new String[] {"56.22", "0"}; int[] type = {Types.DOUBLE,
* Types.INTEGER}; System.out.println(dbm.executeUpdate(sql, value,
* type, null));
*/
// System.out.println(dbm.selectList("test", "empno", "ename", true,
// "","select * from emp", null, null));
//DBManager dbmt = new DBManager();
/* //有事物操作示例
dbmt.beginTransaction();
try{
dbmt.execute("insert into emp values (1234, 'TEST', 'TEST', 0, to_date('2008-03-12', 'yyyy-mm-dd'), 0, 0, 10)");
dbmt.execute("insert into emp values (1235, 'TEST', 'TEST', 0, to_date('2008-03-12', 'yyyy-mm-dd'), 0, 0, 10)");
//dbmt.commitTransaction();
}catch(Exception ex){
dbmt.rollbackTransactoin();
}*/
//自动事物处理
//dbmt.execute("insert into emp values (1236, 'TEST', 'TEST', 0, to_date('2008-03-12', 'yyyy-mm-dd'), 0, 0, 10)");
}
}
package jing.dbnew;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
/**
* <p>
* Title: 使用单实例进行数据库连接池中的数据库连接获取
* @author 欧朝敬
* QQ:35712069
* 手机:13873195792
* @version 1.0
*/
public class ConnectionFactory {
private static DataSource ds = null;
private static ConnectionFactory cf = new ConnectionFactory();
private static final ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>(); //线程本地变量
private ConnectionFactory() {
try {
InitialContext ctx = new InitialContext();
// 使用时改成正确的数据配置
//ds = (DataSource) ctx.lookup("jdbc/OracleSource");
//TomCat中的连接池获取方式使用java:/comp/env/
ds = (DataSource) ctx.lookup("java:/comp/env/jdbc/OracleSource");
} catch (NamingException ne) {
System.out.println(ne.getMessage() + "/n没有使用连接池!");
}
}
public static ConnectionFactory getInstance() {
return cf;
}
public Connection getConnection() throws Exception {
Connection con = threadLocal.get();
if (con == null) {
if (ds == null) {
// 使用时改成正确的数据配置
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
String url = "jdbc:oracle:thin:@localhost:1521:sample";
con = DriverManager.getConnection(url, "scott", "tiger");
} else {
con = ds.getConnection();
}
//System.out.println("未使用线程中的连接!");
threadLocal.set(con);
}else{
//System.out.println("使用线程中的连接!");
}
return con;
/**
* 如果不做Main方法的调试则使用如下方法体 return ds.getConnection();
*/
}
/**
* 关闭连接<br>
* 同时删除当前线程关联的连接对象,Client不能对用getConnection()方法获得的连接直接调用con.close()方法,必须使用此方法closeConnection()进行连接的关闭
*/
public void closeConnection() {
Connection con = threadLocal.get();
if (con != null) {
try {
con.close();
threadLocal.set(null);
con=null;
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws Exception {
/**
* 调用方式如下
*/
Connection con =ConnectionFactory.getInstance().getConnection();
ConnectionFactory.getInstance().closeConnection();
con.createStatement();
}
}
-------------------------------------------------------------------------------------------------
毕业后头五年决定你的一生 海量Android教程、开发资料和源码
10类最急需IT人才:Java开发者居首 给将成为“Android高手”的10个建议
成为Java高手的25个学习目标--非常经典 Android 4.1果冻豆新特性详解
芯片巨头海思和展讯:给中国芯片业带来信心 海量经典Java教程、学习资料和源码
Java侵权诉讼Google获胜,Android厚积薄发 面试必备:Android笔试总结
Android高手必须掌握的28大内容和10个建议 Android平台研发人才缺口30万
Android开发环境安装和配置步骤详细图解 2012国内移动App开发者大调查结果
Windows 7下搭建android开发环境步骤图解 Android 4.0的30个突出的新特性
Android高手要经过的6个阶段和6个境界 linux下搭建Android开发环境步骤
从IT菜鸟变为“IT骨干开发者”的11个建议 程序员编程技术迅速提高的终极攻略
2012世界各国人均GDP排名,中国超泰国 2012年全国各省平均工资排行
2012年中国大学高校排行榜(580强排名) 中国各省市面积和人口数量排名
中国百万开发者大调查:程序员的薪水不错 Java高手需要越过的10座高山
周立功谈嵌入式:我的25年嵌入式生涯 Android和Java语言的异同和关系
华为中国区手机销量达千万,80%为智能机 谷歌Android碎片化严重
2012年中国各省GDP和人均GDP排名 90后就业“钱景”:IT仍是最佳选择
2012全球城市竞争力500强,69个中国城市上榜 不要做浮躁的软件工程师
2012年世界500强,79家大陆香港台湾公司上榜名单 给IT新兵的15个建议
美国知名科技公司入门级软件工程师的薪水排名 回顾Java经过的风风雨雨
71道经典Android面试题和答案--重要知识点都涉及到了
posted on 2012-07-21 10:58 java课程设计例子 阅读(431) 评论(0) 编辑 收藏 举报