自己修改的通用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测试了一下,并不报错。应该是你数据库查出来的值有问题,你吧数据库的值直接打印出来,看看是不是不对。
顺便说一下,我是无偿的,我也有我自己的工作,我可以选择回答,也可以选择不回答。请注意文明用语。
----------------解决方案--------------------------------------------------------
错误信息打印出来
----------------解决方案--------------------------------------------------------