当前位置: 代码迷 >> Java Web开发 >> 自己修改的通用DAO包哪错了?
  详细解决方案

自己修改的通用DAO包哪错了?

热度:391   发布时间:2010-02-02 09:44:24.0
自己修改的通用DAO包哪错了?
package com.aptech.jb.dao;


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

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.jsp.jstl.sql.*;
import javax.sql.DataSource;

/**
* 通用的JDBC数据库访问类
* @author Administrator
*
*/
public class SqlCommandBean {
    private Connection conn=null;
    private List values=new ArrayList();
   
    /**
     * 设定连接JDBC类
     * @param conn 已实例化的JDBC连接类
     * @throws Exception 主要是数据库连接以已实例化且未关闭
     */
    public void setConnection(Connection conn) throws Exception{
        try {
            if(this.conn!=null && !this.conn.isClosed()){
                throw new Exception("Connection数据库未关闭,不能重新实例化!");
            }else{
                this.conn=conn;               
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
   
    /**
     * 设置连接JDBC类
     * @param driverClassName 驱动类字符串
     * @param url 设置数据库连接字符串
     * @param user 设置数据库连接登陆名
     * @param passsword 设置数据库连接登陆密码
     * @throws SQLException 数据库操作异常
     * @throws Exception 主要是数据库连接以已实例化且未关闭或数据库驱动错误
     */
    public void setConnection(String driverClassName, String url, String user,String passsword) throws SQLException, Exception{
        Class.forName(driverClassName);
        if(conn!=null && !conn.isClosed()){
            throw new Exception("Connection数据库未关闭,不能重新实例化!");
        }else{
            this.conn=DriverManager.getConnection(url,user,passsword);            
        }
    }
   
    /**
     * 用JNDI方式设置连接JDBC类
     * @param NamingName 对象绑定名
     * @throws NamingException JNDI异常
     * @throws SQLException 数据库操作异常
     * @throws Exception 主要是数据库连接以已实例化且未关闭或数据库驱动错误
     */
    public void setConnection(String NamingName) throws NamingException,SQLException,Exception{
        if(conn!=null && !conn.isClosed()){
            throw new Exception("Connection数据库未关闭,不能重新实例化!");
        }else{
            Context ic=new InitialContext();
            DataSource source=(DataSource)ic.lookup(NamingName);
               
            this.conn = source.getConnection();        
        }
    }
   
    /**
     * 返回数据库连接类
     * @return 数据库连接类
     */
    private Connection getConnection(){
        return conn;
    }
   
    /**
     * 执行查询
     * @param sqlValue sql语句,'?'代表参数
     * @return 返回查询结果
     * @throws SQLException 数据库操作异常
     */
    public Result executeQuery(String sqlValue) throws SQLException{
        PreparedStatement pstmt=null;
        Statement stmt=null;
        Result result=null;
        ResultSet rs=null;
        try{
            if(values.size()>0){
                pstmt=conn.prepareStatement(sqlValue);
                setValues(pstmt,values);
                rs=pstmt.executeQuery();
            }else{
                stmt=conn.createStatement();
                rs=stmt.executeQuery(sqlValue);
            }
            result=ResultSupport.toResult(rs);
        }finally{
            try{
                if(rs!=null){
                    rs.close();
                }
                if(stmt!=null){
                    stmt.close();
                }
                if(pstmt!=null){
                    pstmt.close();
                }
                if(conn!=null){
                    conn.close();
                }
            }catch(SQLException e){
                System.err.println("关闭数据库时发生错误:"+e.getMessage());
            }
        }
        return result;
    }
   
    /**
     * 执行语句
     * @param sqlValue sql语句,'?'代表参数
     * @return 返回执行行数
     * @throws SQLException 数据库操作异常
     */
    public int executeUpdate(String sqlValue) throws SQLException{
        int noOfRows=0;
        PreparedStatement pstmt=null;
        Statement stmt=null;
        try{
            if(values.size()>0){
                pstmt=conn.prepareStatement(sqlValue);
                setValues(pstmt,values);
                noOfRows=pstmt.executeUpdate();
            }else{
                stmt=conn.createStatement();
                noOfRows=stmt.executeUpdate(sqlValue);
            }
        }finally{
            try{
                if(stmt!=null){
                    stmt.close();
                }
                if(pstmt!=null){
                    pstmt.close();
                }
                if(conn!=null){
                    conn.close();
                }
            }catch(SQLException e){
                System.err.println("关闭数据库时发生错误:"+e.getMessage());
            }            
        }
        return noOfRows;
    }

    /**
     * 从外部设置参数
     * @param i 参数第几个?索引,从0开始
     * @param o 一个参数
     * @throws SQLException 数据库操作异常
     */
    public void setParamer(int i, Object o) throws SQLException{
        values.add(i, o);
    }
   
    /**
     * 内外部设置参数
     * @param ptmt 参数将要赋的对象
     * @param values 参数列表
     * @throws SQLException 数据库操作异常
     */
    private void setValues(PreparedStatement ptmt,List values) throws SQLException{
        for(int i=0;i<values.size();i++){
            Object v=values.get(i);
            ptmt.setObject(i+1, v);
        }
    }
}

提示setValues方法里索引超出范围
搜索更多相关主题的帖子: DAO  

----------------解决方案--------------------------------------------------------
使用数组、List时,因为上限超过了范围,会出现这样的情况。另外可能是你的数据范围超出了你所定义的范围,我是没空给你调,你打着断点自己跑一遍先。
----------------解决方案--------------------------------------------------------
废话
----------------解决方案--------------------------------------------------------
给你用UT测试了一下,并不报错。应该是你数据库查出来的值有问题,你吧数据库的值直接打印出来,看看是不是不对。
顺便说一下,我是无偿的,我也有我自己的工作,我可以选择回答,也可以选择不回答。请注意文明用语。
----------------解决方案--------------------------------------------------------
错误信息打印出来
----------------解决方案--------------------------------------------------------
  相关解决方案