2011-10-02 4 views
-2

ResultSet rs = stmt.executeQuery(query); 이후에는 코드가 실행되지 않습니다. 따라서 변수는 결과 집합에서 값을 가져 오지 않습니다. 아무도 내가이 문제를 해결하도록 도울 수 있습니까?결과 세트 (jdbc)에서 값을 검색 할 수 없습니다.

public User storeTempDetails(String s1){ 
Statement stmt = null; 
String query = "select username, account_no,name from accounts where username = ?"; 
try { 
    connection = DriverManager.getConnection(DBurl, DBusername, DBpassword); 
    System.out.println("Database connected!"); 
    stmt = connection.createStatement(); 
    ResultSet rs = stmt.executeQuery(query); 
    System.out.println("this line is not printed"); 
    while (rs.next()) { 
    userName = rs.getString("username"); 
    accountNo = rs.getString("account_no"); 
    name = rs.getString("name");System.out.println("ss"+accountNo); 
    } 
} catch (SQLException e) { 
    throw new RuntimeException("Cannot connect the database!", e); 
} finally { 
    User userObj=new User(userName,accountNo,name); 
     System.out.println("Closing the connection."); 
     if (connection != null) try { connection.close(); } 
     catch (SQLException ignore) {} 
     return userObj; 
} 

}

+1

스택 추적을 게시한다. 거친 코드; 많은 문제. – duffymo

+0

더피모, 좀 더 깨끗하게하려고 노력했습니다. 제발 도와주세요. – progit

+0

아래를 참조하십시오. 해당 코드가 더 잘 작동하는지 확인하십시오. 그것을 연구하고 제가 왜 그렇게 쓰는지 생각해보십시오. – duffymo

답변

1

다음과 같이 시작하십시오.

package persistence; 

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

/** 
* util.DatabaseUtils 
* User: Michael 
* Date: Aug 17, 2010 
* Time: 7:58:02 PM 
*/ 
public class DatabaseUtils 
{ 
    private static final String DEFAULT_DRIVER = "oracle.jdbc.driver.OracleDriver"; 
    private static final String DEFAULT_URL = "jdbc:oracle:thin:@host:1521:database"; 
    private static final String DEFAULT_USERNAME = "username"; 
    private static final String DEFAULT_PASSWORD = "password"; 
/* 
    private static final String DEFAULT_DRIVER = "org.postgresql.Driver"; 
    private static final String DEFAULT_URL = "jdbc:postgresql://localhost:5432/party"; 
    private static final String DEFAULT_USERNAME = "pgsuper"; 
    private static final String DEFAULT_PASSWORD = "pgsuper"; 
*/ 
/* 
    private static final String DEFAULT_DRIVER = "com.mysql.jdbc.Driver"; 
    private static final String DEFAULT_URL = "jdbc:mysql://localhost:3306/party"; 
    private static final String DEFAULT_USERNAME = "party"; 
    private static final String DEFAULT_PASSWORD = "party"; 
*/ 

    public static void main(String[] args) 
    { 
     long begTime = System.currentTimeMillis(); 

     String driver = ((args.length > 0) ? args[0] : DEFAULT_DRIVER); 
     String url = ((args.length > 1) ? args[1] : DEFAULT_URL); 
     String username = ((args.length > 2) ? args[2] : DEFAULT_USERNAME); 
     String password = ((args.length > 3) ? args[3] : DEFAULT_PASSWORD); 

     Connection connection = null; 

     try 
     { 
      connection = createConnection(driver, url, username, password); 
      DatabaseMetaData meta = connection.getMetaData(); 
      System.out.println(meta.getDatabaseProductName()); 
      System.out.println(meta.getDatabaseProductVersion()); 

      String sqlQuery = "SELECT PERSON_ID, FIRST_NAME, LAST_NAME FROM PERSON ORDER BY LAST_NAME"; 
      System.out.println("before insert: " + query(connection, sqlQuery, Collections.EMPTY_LIST)); 

      connection.setAutoCommit(false); 
      String sqlUpdate = "INSERT INTO PERSON(FIRST_NAME, LAST_NAME) VALUES(?,?)"; 
      List parameters = Arrays.asList("Foo", "Bar"); 
      int numRowsUpdated = update(connection, sqlUpdate, parameters); 
      connection.commit(); 

      System.out.println("# rows inserted: " + numRowsUpdated); 
      System.out.println("after insert: " + query(connection, sqlQuery, Collections.EMPTY_LIST)); 
     } 
     catch (Exception e) 
     { 
      rollback(connection); 
      e.printStackTrace(); 
     } 
     finally 
     { 
      close(connection); 
      long endTime = System.currentTimeMillis(); 
      System.out.println("wall time: " + (endTime - begTime) + " ms"); 
     } 
    } 

    public static Connection createConnection(String driver, String url, String username, String password) throws ClassNotFoundException, SQLException 
    { 
     Class.forName(driver); 

     if ((username == null) || (password == null) || (username.trim().length() == 0) || (password.trim().length() == 0)) 
     { 
      return DriverManager.getConnection(url); 
     } 
     else 
     { 
      return DriverManager.getConnection(url, username, password); 
     } 
    } 

    public static void close(Connection connection) 
    { 
     try 
     { 
      if (connection != null) 
      { 
       connection.close(); 
      } 
     } 
     catch (SQLException e) 
     { 
      e.printStackTrace(); 
     } 
    } 


    public static void close(Statement st) 
    { 
     try 
     { 
      if (st != null) 
      { 
       st.close(); 
      } 
     } 
     catch (SQLException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public static void close(ResultSet rs) 
    { 
     try 
     { 
      if (rs != null) 
      { 
       rs.close(); 
      } 
     } 
     catch (SQLException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public static void rollback(Connection connection) 
    { 
     try 
     { 
      if (connection != null) 
      { 
       connection.rollback(); 
      } 
     } 
     catch (SQLException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public static List<Map<String, Object>> map(ResultSet rs) throws SQLException 
    { 
     List<Map<String, Object>> results = new ArrayList<Map<String, Object>>(); 

     try 
     { 
      if (rs != null) 
      { 
       ResultSetMetaData meta = rs.getMetaData(); 
       int numColumns = meta.getColumnCount(); 
       while (rs.next()) 
       { 
        Map<String, Object> row = new HashMap<String, Object>(); 
        for (int i = 1; i <= numColumns; ++i) 
        { 
         String name = meta.getColumnName(i); 
         Object value = rs.getObject(i); 
         row.put(name, value); 
        } 
        results.add(row); 
       } 
      } 
     } 
     finally 
     { 
      close(rs); 
     } 

     return results; 
    } 

    public static List<Map<String, Object>> query(Connection connection, String sql, List<Object> parameters) throws SQLException 
    { 
     List<Map<String, Object>> results = null; 

     PreparedStatement ps = null; 
     ResultSet rs = null; 

     try 
     { 
      ps = connection.prepareStatement(sql); 

      int i = 0; 
      for (Object parameter : parameters) 
      { 
       ps.setObject(++i, parameter); 
      } 

      rs = ps.executeQuery(); 
      results = map(rs); 
     } 
     finally 
     { 
      close(rs); 
      close(ps); 
     } 

     return results; 
    } 

    public static int update(Connection connection, String sql, List<Object> parameters) throws SQLException 
    { 
     int numRowsUpdated = 0; 

     PreparedStatement ps = null; 

     try 
     { 
      ps = connection.prepareStatement(sql); 

      int i = 0; 
      for (Object parameter : parameters) 
      { 
       ps.setObject(++i, parameter); 
      } 

      numRowsUpdated = ps.executeUpdate(); 
     } 
     finally 
     { 
      close(ps); 
     } 

     return numRowsUpdated; 
    } 
} 

여기에 내가 쓸 수있는 방법, 그 유틸리티를 감안할 때 : 이들은 당신이 JDBC로 떨어져 시작하는 때 당신의 인생을 쉽게 할 것이다 유틸리티 클래스입니다. 아마도 Usermodel 패키지에 넣고 UserDaoImpl은 자체 .java 파일의 공용 클래스가됩니다. 나는 게으르다. :

package persistence; 

import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 

/** 
* UserDao 
* @author Michael 
* @since 10/2/11 
*/ 
public interface UserDao 
{ 
    User find(String username); 
} 

class UserDaoImpl implements UserDao { 

    public static final String SELECT_USER_BY_USERNAME = "select username, account_no,name from accounts where username = ?"; 

    private Connection connection; 

    UserDaoImpl(Connection connection) 
    { 
     this.connection = connection; 
    } 

    public User find(String username) 
    { 
     User user = null; 
     PreparedStatement ps = null; 
     ResultSet rs = null; 

     try 
     { 
      ps = this.connection.prepareStatement(SELECT_USER_BY_USERNAME); 
      ps.setString(1, username); 
      rs = ps.executeQuery(); 
      while (rs.next()) { 
       String account = rs.getString("account_no"); 
       String name = rs.getString("name"); 
       user = new User(name, username, account); 
      } 
     } 
     catch (SQLException e) 
     { 
      e.printStackTrace(); 
     } 
     finally 
     { 
      DatabaseUtils.close(rs); 
      DatabaseUtils.close(ps); 
     } 

     return user; 
    } 
} 

class User { 
    private final String name; 
    private final String username; 
    private final String account; 

    User(String name, String username, String account) 
    { 
     this.name = name; 
     this.username = username; 
     this.account = account; 
    } 

    public String getName() 
    { 
     return name; 
    } 

    public String getUsername() 
    { 
     return username; 
    } 

    public String getAccount() 
    { 
     return account; 
    } 

    @Override 
    public String toString() 
    { 
     final StringBuilder sb = new StringBuilder(); 
     sb.append("User"); 
     sb.append("{name='").append(name).append('\''); 
     sb.append(", username='").append(username).append('\''); 
     sb.append(", account='").append(account).append('\''); 
     sb.append('}'); 
     return sb.toString(); 
    } 
} 
+0

대단히 감사합니다 :) – progit

+0

+1 유틸리티 기능은 생성 된 int 키를 반환하는'insert()'를 추가 한 것 외에는 프로덕션 환경에서 사용하는 것과 거의 동일합니다. – lynks

+0

그건 좋은 생각이야, Lynks. 나는 하나를 광산에 추가 할 것이다. – duffymo

0

가 발생 예외가있다. 그러나 해당 예외는 finally 블록의 return 때문에 아무데도 나타나지 않습니다. Google은 "자바", "반환"및 "마침내"등의 느낌을 받게됩니다 입니다.

코드를 수정하고 스택 추적을 표시하십시오.

관련 문제