2017-12-19 10 views
-3

테이블 이름이 "쿠폰"이고 이클립스에서 java로 작업합니다.sql 코드 : SELECT * FROM 테이블 WHERE 열

getCoupon (long id) 메소드가 있습니다. 그 ID로 나에게 쿠폰을 제공하고 나는이 방법을 썼다 :

public Coupon getCoupon(long id) { 
     Connection con = ConnectionPool.getInstance().getConnection(); 
     String sql = "SELECT * FROM Coupon WHERE TYPE=?"; 
     Coupon coupon = new Coupon(); 
     try (PreparedStatement pstmt = con.prepareStatement(sql);){ 
      pstmt.setLong(1, id); 
      try (ResultSet rs = pstmt.executeQuery();) { 
       if (rs.next()) { 
        coupon.setId(rs.getLong(1)); 
        coupon.setTitle(rs.getString(2)); 
        coupon.setStartDate(rs.getDate(3)); 
        coupon.setEndDate(rs.getDate(4)); 
        coupon.setAmount(rs.getInt(5)); 
        coupon.setType(CouponType.valueOf(rs.getString(6))); 
        coupon.setMessage(rs.getString(7)); 
        coupon.setPrice(rs.getDouble(8)); 
        coupon.setImage(rs.getString(9)); 
       } else { 
        System.out.println("Coupon ID: " + id + " could not be found\n"); 
       } 
      } 
     } catch (SQLException e) { 
      CouponSystemException ex = new CouponSystemException("Coupon ID: " + id + " could not be retrieved\n", e); 
      System.out.println(ex.getMessage()); 
      System.out.println(e); 
     } 
     ConnectionPool.getInstance().returnConnection(con); 
     return coupon; 
    } 

내가 입력입니다하여 나에게 쿠폰을 제공합니다 다른 방법을하고 싶습니다! 하지만 TYPE COLUMN은 첫 번째 열에 없으므로 예외가 발생합니다. 조언이 있으십니까?

+2

첫 번째 조언 ... 형식 질문 –

+1

어떤 예외가 있습니까? 행을 다른 열로 가져 오는 문제는 무엇입니까? 자세한 내용을 알려주십시오. –

답변

0

당신은 오히려 서수 위치보다 이름으로 열을 참조 시도 할 수 :

rs.getLong("type") 

보다는 :

때로는 테이블 열 순서를 변경하는 방법으로 다시 만들어 얻을
rs.getLong(1) 

, 따라서 열의 서수 위치에 의존하는 것은 실패합니다.

추가 방어로서 나는 항상 코딩보다는 원하는 열을 나열합니다.

select * ... 

Java 프로그램이 필요한 모든 항목 만 되돌릴 수 있기 때문에 더욱 효율적입니다.

+0

글쎄, 나는 이것을 시도했다. 하지만 그것은 도움이되지, –

+0

괜찮 았어. 내가 도와주기를 원한다면, 할 수 있기 전에 좀 더 말해줘야 할 것입니다. 위에서 본 코드가 효과가 있으며 비슷한 것을하고 싶다고 생각합니다. 맞습니까? 그렇다면 우리는 실패한 코드를 보여줄 수 있습니다.또한 예외가 필요합니다. 또한 테이블 정의 (열 및 데이터 유형 포함)와 사용중인 데이터베이스 브랜드를 갖는 데 도움이됩니다. –

0

첫째 : 나는 TYPE 열을 참조로 : 그것은 당신이 코드에서 문제가 그렇게 내가 TYPE=?ID=?

둘째

과 같이해야한다고 생각

String sql = "SELECT * FROM Coupon WHERE TYPE=?";

를 따를 때 보이는 문자열이 (coupon.setType(CouponType.valueOf(rs.getString(6))); 때문에) 변경해야합니다. pstmt.setLong(1, id);pstmt.setString(1, couponType.getValue());

세 번째 : 항상 SELECT *을 피하십시오. 필요한 모든 열을 입력하십시오.

앞뒤 : getCouponByID(long id)getCouponByType(CouponType couponType) 두 가지 방법을 일반화하여 나중에 유지 관리하기가 쉽습니다.

5 번째 : ConnectionPool.getInstance().returnConnection(con);finally 절에 넣으십시오. 그러면 연결을 풀로 다시 되돌려 놓을 수 있습니다.

여섯 번째 : PreparedStatement을 사용하면 여러 번 (예 : 100 번) 미만으로 사용하면 성능이 떨어지고 한 번만 사용합니다. 이 경우 Statement을 사용하면 성능이 향상되지만 사용자 유형 문자열을 삽입하면 SQL 주입에주의해야합니다. 이 경우 long 유형이므로 걱정하지 마십시오.