Ошибка StatementCallback в шаблоне JDBC MySql - PullRequest
3 голосов
/ 06 декабря 2011

Как мне это исправить? Я проверил свой запрос, и он работает в командной строке MySQL и в рабочей среде, но почему, когда я пытаюсь использовать этот SQL-запрос в моей Java-программе, он дает мне эту ошибку ???

Вот мой тестовый класс

package test;
import dao.FinanceDao;
import javax.swing.JTextArea;
import java.util.Scanner;
import java.util.List;
import javax.swing.JOptionPane;
import domainmodel.User;
import javax.sql.DataSource;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

    public class TestDrive {

        public static void main(String[] args){
            String employeeID = null;
            String password = null;
            JTextArea text = new JTextArea();
            FinanceDao finance = new FinanceDao();
            DataSource  dataSource = SourceObj.getSource();

            finance.setDataSource(dataSource);

            String idNumber = JOptionPane.showInputDialog("Enter Employee ID to Search");

            List<User> test = finance.select(idNumber);
            for(User u: test){
            employeeID = u.getEmpID();
            password = u.getPassword();
            if(employeeID == null){
                text.setText("No Result");
            }else{
                text.setText("\tEmployeeID: "+employeeID+"\n\tPassword: "+password);
                }
            }

            List <User> test1 = finance.selectAll();
            for(User ux: test1){
                employeeID = ux.getEmpID();
                password = ux.getPassword();
                System.out.println("\tEmployeeID: "+employeeID+"\n\tPassword: "+password);
            }

            UI U = new UI(text);
        }
    }

Вот другой класс

package dao;

import javax.sql.DataSource;
import java.util.List;
import org.springframework.jdbc.core.JdbcTemplate;
import dao.mapper.UserRowMapper;
import domainmodel.User;

public class FinanceDao implements Manage {

    private DataSource ds;

    @Override
    public void setDataSource(DataSource ds) {
        this.ds = ds;

    }

    @Override
    public void Add(String empID, String password) {
        JdbcTemplate Add = new JdbcTemplate(ds);
        Add.update("INSERT INTO user (empID,password) VALUES(?,?)",
        new Object[] { empID, password });
    }

    @Override
    public void Delete(String empID , String password) {
        JdbcTemplate Delete = new JdbcTemplate(ds);
        Delete.update("Delete from User where emp_id = '?'",new Object[]{empID});
    }


    public List<User> select(String empID) {
        JdbcTemplate select = new JdbcTemplate(ds);
        return select.query(
                "select * FROM USER where EMPID = ? ",
                new Object[] { empID }, new UserRowMapper());
    }

    public List<User>selectAll(){
        JdbcTemplate showAll = new JdbcTemplate(ds);
        return showAll.query("Select empID from User", new UserRowMapper());
    }

}

My Result Extractor

package dao.mapper;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.jdbc.core.ResultSetExtractor;

import domainmodel.User;

public class UserResultSetExtractor implements  ResultSetExtractor{

    @Override
    public Object extractData(ResultSet rs) throws SQLException{
            User user = new User();
            user.setEmpID(rs.getString(1));
            user.setPassword(rs.getString(2));
        return user;
    }

}

И, наконец, это ошибка

Dec 6, 2011 12:05:02 PM org.springframework.jdbc.datasource.DriverManagerDataSource setDriverClassName
INFO: Loaded JDBC driver: com.mysql.jdbc.Driver
Dec 6, 2011 12:05:09 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [org/springframework/jdbc/support/sql-error-codes.xml]
Dec 6, 2011 12:05:09 PM org.springframework.jdbc.support.SQLErrorCodesFactory <init>
INFO: SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase]
Exception in thread "main" org.springframework.jdbc.UncategorizedSQLException: StatementCallback; uncategorized SQLException for SQL [Select empID from User]; SQL state [S1009]; error code [0]; Column Index out of range, 2 > 1. ; nested exception is java.sql.SQLException: Column Index out of range, 2 > 1. 
    at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.translate(SQLStateSQLExceptionTranslator.java:120)
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.translate(SQLErrorCodeSQLExceptionTranslator.java:276)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:353)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:404)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:412)
    at dao.FinanceDao.selectAll(FinanceDao.java:42)
    at test.TestDrive.main(TestDrive.java:42)
Caused by: java.sql.SQLException: Column Index out of range, 2 > 1. 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
    at com.mysql.jdbc.ResultSetImpl.checkColumnBounds(ResultSetImpl.java:818)
    at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5651)
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5570)
    at dao.mapper.UserResultSetExtractor.extractData(UserResultSetExtractor.java:16)
    at dao.mapper.UserRowMapper.mapRow(UserRowMapper.java:13)
    at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:92)
    at org.springframework.jdbc.core.JdbcTemplate$1QueryStatementCallback.doInStatement(JdbcTemplate.java:394)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:342)
    ... 4 more

Как бы это исправить?

Ответы [ 2 ]

2 голосов
/ 06 декабря 2011

Либо вы можете сделать то, что предложил Гарри, либо вы можете вручную выбрать все столбцы, например

    public List<User>selectAll(){
        JdbcTemplate showAll = new JdbcTemplate(ds);
        return showAll.query("Select empID, password from User", new UserRowMapper());
    }

В своем фактическом коде вы выбираете только один столбец, а в своем ResultSetExtractor вы пытаетесь получить двастолбцы

   public Object extractData(ResultSet rs) throws SQLException{
        User user = new User();
        user.setEmpId(rs.getString(1));
        user.setPassword(rs.getString(2));//Selecting one column and trying to get two, hence the error
        return user;
    }
2 голосов
/ 06 декабря 2011

похоже, что в пользовательской таблице есть только 2 столбца, которые можно получить, вызвав user.setEmpID (rs.getString (0)); user.setPassword (rs.getString (1)); и когда вы используете user.setPassword (rs.getString (2)); Вы пытаетесь получить столбец № 3, который не существует, и именно поэтому вы получаете эту ошибку.


Измените ваш запрос, чтобы он возвращал все столбцы:

public List<User>selectAll(){
    JdbcTemplate showAll = new JdbcTemplate(ds);
    return showAll.query("Select * from User", new UserRowMapper());
}
...