[36일 차] : JDBC_MVC패턴 적용(2) [PreparedStatement]

서하루·2022년 12월 1일
0

(3) JDBC 공부기록

목록 보기
3/5


💡Statement와 PreparedStatement의 특징

  • 둘 다 SQL문을 실행하고 결과는 받아내는 객체
  • Statement가 PreparedStatement의 부모(상속구조)

💡Statement와 PreparedStatement의 차이점

(1) Statement

  • sql문을 완성형태로 만들어둬야함. 즉, 사용자가 입력한 값이 다 채워진 형태
    stmt = conn.createStatement();
    result = stmt.executeQuery|update(완성된 sql문)

(2) PreparedStatement

  • 미완성된 sql문을 보관해둘 수 있는 객체
  • 사용자가 입력한 값을 미리 채우지 않고, 공간확보만 해도 됨(=?)

pstmt = conn.preparedStatement([미]완성된 sql문 )
pstmt.setXXXX(1, 대체할값)



view, controller 테이블은 똑같이 작성함 !

(1) Dao 클래스

🖊️ 회원 아이디 검색하기
public Member selectByUserId(String userId) {
// select문(단일행) -> ResultSet -> 자바객체(Member)

Member m= null;
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rset = null;

String sql = "SELECT * FROM MEMBER WUERE USER_ID = ?"
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","JDBC","JDBC");
			pstmt = conn.prepareStatement(sql); // 미완성된 sql문
			
			pstmt.setString(1, userId); // 완성형태로 만들어줌
			
			
			rset = pstmt.executeQuery();
			
			if(rset.next()) {
				m = new Member(rset.getInt("user_no"),
								rset.getString("user_id"),
								rset.getString("user_pwd"),
								rset.getString("user_name"),
								rset.getString("gender"),
								rset.getInt("age"),
								rset.getString("email"),
								rset.getString("phone"),
								rset.getString("address"),
								rset.getString("hobby"),
								rset.getDate("enroll_date")
								);
			}
			
		
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				rset.close();
				pstmt.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}

		}
		return m;
		
	}

🖊️ 회원이름검색 (키워드)
public ArrayList<Member> selectByUserName(String keyword){
// select문(여러행) => ResultSet 객체 => ArrayList객체에 담기
	ArrayList <Member> list = new ArrayList<>();
			
	Connection conn = null;
	PreparedStatement pstmt = null;
	ResultSet rset = null;
            
	String sql = "SELECT * FROM MEMBER WHERE USER_NAME LIKE '%'||?||'%'" ;

try {
				Class.forName("oracle.jdbc.driver.OracleDriver");
				conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","JDBC","JDBC");
				pstmt = conn.prepareStatement(sql);
				
				pstmt.setString(1, keyword);
				
				rset = pstmt.executeQuery();
				while(rset.next()) {
					
					list.add(new Member(rset.getInt("user_no"),
									rset.getString("user_id"),
									rset.getString("user_pwd"),
									rset.getString("user_name"),
									rset.getString("gender"),
									rset.getInt("age"),
									rset.getString("email"),
									rset.getString("phone"),
									rset.getString("address"),
									rset.getString("hobby"),
									rset.getDate("enroll_date"))); 
				}
				
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				try {
					rset.close();
					pstmt.close();
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			return list;
	}

⭐ 키워드 검색시 LIKE문 사용방법(이클립스 - 오라클)

String sql = "SELECT * FROM 테이블명 WHERE 조건식 LIKE '%'||?||'%'");

내가 잘못작성한 코드


문제점

  • "SELECT * FROM 테이블명 WHERE 조건식 LIKE %?%";
  • 위 코드처럼 작성한 후, set.String(값, 값)을 채우게 되면 홑따옴표가 붙음
  • 그러면 %키워드% 이런 형식으로 채워지므로 오류가 남

해결방안

1) 패턴 자체를 ?로 공간 확보하기
SELECT * FROM 테이블명 WHERE 조건식 LIKE ?
pstmt.setString(1, "%" + keyword + "%");

2) 연결연산자로 sql문에 바로 작성하기
SELECT * FROM 테이블명 WHERE 조건식 LIKE '%'||?||'%';

정답


0개의 댓글