PreparedStatement 동적쿼리 생성 Error. (table name 및 table column)

Jobmania·2023년 3월 24일
0

에러

목록 보기
2/5
post-thumbnail

에러 발생 코드

   // 항목에 맞는 review 주입.
//        INSERT INTO `webservice`.`diner_user` (`user_id`, `diner_id`, `subject`, `review`, `stars`) VALUES ('7', '9', '제목', '내용', '4');
            writeSql = "INSERT INTO ? (user_id, ?, subject, review, stars) VALUES(?,?,?,?,?)";
            PreparedStatement writePstmt = con.prepareStatement(writeSql);
            writePstmt.setString(1,boardTarget+"_user");
            writePstmt.setString(2,boardTarget+"_id");
            writePstmt.setInt(3,userId);
            writePstmt.setInt(4,Integer.parseInt(boardId));
            writePstmt.setString(5,subject);
            writePstmt.setString(6,content);
            writePstmt.setInt(7,Integer.parseInt(stars));

            writePstmt.executeUpdate();
            writePstmt.close();

            System.out.println(writeSql);

ERROR MSG

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''diner_user' (user_id, 'diner_id', subject, review, stars) VALUES(7,1,'qq','rr',' at line 1

-> "near ''diner_user'" 부분에서 오류가 발생했다고 언급하고 있습니다. 즉, INSERT INTO 문의 첫 번째 인자인 테이블 이름이 유효하지 않은 것으로 추정

테이블 이름을 동적으로 생성하는 과정에서 다음과 같은 오류가 발생함.
관련 내용으로 SQL에서는 테이블 이름이나 열 이름을 동적으로 생성하기 위해 문자열 보간이나 문자열 연결을 사용할 수 없습니다. 따라서, 이 코드에서 테이블 이름을 동적으로 생성하려는 시도는 잘못된 문법입니다.

에러 해결 코드


            String tableName = boardTarget + "_user";
            String columnName = boardTarget + "_id";
            // 항목에 맞는 review 주입.
//        INSERT INTO `webservice`.`diner_user` (`user_id`, `diner_id`, `subject`, `review`, `stars`) VALUES ('7', '9', '제목', '내용', '4');
            writeSql = "INSERT INTO " + tableName + " (user_id," + columnName +", subject, review, stars) VALUES(?,?,?,?,?)";
            PreparedStatement writePstmt = con.prepareStatement(writeSql);
            
            writePstmt.setInt(1,userId);
            writePstmt.setInt(2,Integer.parseInt(boardId));
            writePstmt.setString(3,subject);
            writePstmt.setString(4,content);
            writePstmt.setInt(5,Integer.parseInt(stars));

            writePstmt.executeUpdate();
            writePstmt.close();

-> 즉 테이블 명, Column 명에서 preparedStatement 동적으로 생성하지 못한다!
그래서 PreparedStatement의 쿼리 문자열에 포함된 물음표 대신, boardTarget 변수를 사용하여 동적으로 테이블 이름을 생성하고, 쿼리 매개 변수를 사용하여 값을 전달해야함

profile
HelloWorld에서 RealWorld로

0개의 댓글