db의 값을 출력하고 업데이트 등의 과정을 하면서 쿼리문이 좀 복잡해질 수도 있다.
예를들어 insert into saram(id, name, age) values('"+id+"', '"+name+"', '"+age+"');
이런식으로 해야하는데 큰 따옴표, 작은 따옴표가 헷갈리기도 하고 복잡해 보인다. 이런 것을 방지하고 좀 간단하게 쿼리를 처리해주는 기능이
PreparedStatement이다.
동작 하는 방법은 이런식이다.
1 2 3 4 5 6 | String sql = "insert into saram(id, name, age) values(?,?,?)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, id); pstmt.setString(2, name); pstmt.setInt(3, age); Colored by Color Scripter |
sql문을 문자열로 만들고 PreparedStatement 클래스 객체를 만든다. 그 객체는 connection 객체에 있는 prepareStatement() 메소드로 받게 된다. 이때 sql을 먼저 넣는데 과거 그냥 Statment와는 다르다.
일반적인 statment는 다음과 같다.
1 2 | stmt = conn.createStatement(); rs = stmt.executeQuery(sql); |
즉 문장를 셋팅해줄때 -> createStatement()메소드에 sql을 넣지 않는다.
쿼리를 실행할 때 sql을 넣어준다. 하지만 preparedStatement는 다르다.
1 2 3 4 5 6 7 | PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, id); //id등은 그냥 자바 변수 pstmt.setString(2, name); pstmt.setInt(3, age); int res = pstmt.executeUpdate(); |
PreparedStatement는 바로 connection 객체로 생성할 때 sql을 보낸다. 그리고 나서 ? 값들을 셋팅해준다.
pstmt.setString(1, id)는 첫번째 ? 에 id 변수를 셋팅(그냥 평범한 자바 변수이다)
pstmt.setString(2, name) 은 두 번째 ? 에 name(평범한 자바 변수) 셋팅
이런식으로 셋팅하고 나서
pstmt.executeUpdate() -> insert, update, delete -> int 반환
pstmt.executeQuery() -> select -> ResultSet 반환
을 진행한다.
이 PreparedStatement를 하게 되면 간결하고 혼란없이 쿼리 요소를 구성할 수 있다.
다음은 본인이 만든 MySQL과 연동된 자바 소스이다.
select, insert, update, delete, search 기능이 메소드 별로 나뉘어져 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 | import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Scanner; public class TestJDBC3 { public static Scanner in = new Scanner(System.in); public static Connection getConnection() throws ClassNotFoundException, SQLException { String url = "jdbc:mysql://localhost:3306/test"; String user = "root"; String pwd = "apmsetup"; Connection conn = null; Class.forName("org.gjt.mm.mysql.Driver"); conn = DriverManager.getConnection(url, user, pwd); System.out.println("접속"); return conn; } //SELECT 처리용 public static void selectAll() throws ClassNotFoundException, SQLException { Connection conn = getConnection(); String sql = "SELECT * FROM saram"; ResultSet rs = null; Statement stmt = null; stmt = conn.createStatement(); rs = stmt.executeQuery(sql); while(rs.next()) { String id = rs.getString(1); String name = rs.getString(2); int age = rs.getInt(3); System.out.println(id + ", "+name+", "+age); } if(rs != null) rs.close(); if(stmt != null) stmt.close(); if(conn != null) conn.close(); } public static void insert(String id, String name, int age) throws ClassNotFoundException, SQLException { //입력하는 메소드 Connection conn = getConnection(); String sql = "insert into saram(id, name, age) values(?,?,?)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, id); pstmt.setString(2, name); pstmt.setInt(3, age); int res = pstmt.executeUpdate(); if(res > 0) { System.out.println("처리 완료"); } if(pstmt != null) pstmt.close(); if(conn != null) conn.close(); } public static void update(String id, String name) throws ClassNotFoundException, SQLException { //수정 기능 Connection conn = getConnection(); String sql = "update saram set name = ? where id = ?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, name); pstmt.setString(2, id); int res = pstmt.executeUpdate(); if(res > 0) { System.out.println("업데이트 완료"); selectAll(); } else System.out.println("값이 없습니다."); } public static void delete(String id) throws ClassNotFoundException, SQLException { //삭제기능 Connection conn = getConnection(); String sql = "delete from saram where id =?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, id); int res = pstmt.executeUpdate(); if(res > 0) { System.out.println("삭제되었습니다."); selectAll(); } else System.out.println("값이 없습니다."); } public static void search(String id) throws ClassNotFoundException, SQLException { //검색기능 Connection con = getConnection(); String sql = "select * from saram where id = ?"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setString(1, id); int res = pstmt.executeUpdate(); if(res > 0) { } } public static void main(String args[]) throws ClassNotFoundException, SQLException { //insert("TestId","TestName",20); //selectAll(); System.out.println("사람 정보 관리 프로그램"); String[] menuItems = {"input","output","search","modify","delete","end"}; for(int i = 0 ; i < menuItems.length ; i++) { System.out.print(i+1+". "+menuItems[i] +" "); } System.out.println(); int no = 0; do{ System.out.println("choice : "); no = in.nextInt(); } while(no < 1 || no > menuItems.length); //의존성을 낮게 한다. menuItems랑 별개의 기능으로 되니까. //메뉴의 변경에 따라 얘도 자동적으로 변경되고 .. 이런식의 로직을 짜고 이런것은 왠만하면 메소드로 빼버린다. //이렇게 안하고 단순하게 하려면 내가 처음에 했던 그냥 메뉴만 System~으로 출력하게 하는거 String id = null; String name =null; int age = 0; switch(no) { case 1: id = in.next(); name = in.next(); age = in.nextInt(); insert(id,name,age); break; case 2: selectAll(); break; case 3: System.out.println("검색할 아이디를 입력하세요"); id = in.next(); search(id); break; case 4: System.out.println("업데이트 시킬 아이디와 변경할 이름을 입력하세요"); id = in.next(); name = in.next(); update(id, name); System.out.println("업데이트"); break; case 5: System.out.println("삭제할 아이디 입력"); id = in.next(); // delete(id); break; case 6: System.out.println("종료합니다."); System.exit(0); } main(new String[]{""}); //재귀호출 } } Colored by Color Scripter |
설명상 재귀호출로 메인을 계속 호출했는데 이것보단 while(true)로 계속 호출하는게 더 좋다.
여기까지가 기본적인 JDBC연동이다.
'java' 카테고리의 다른 글
자바 배열로 날짜(D-day) 계산해보기(2017년 기준) (0) | 2017.08.18 |
---|---|
자바 로또(lotto) 만들어 보기(배열, Hash) (0) | 2017.08.18 |
자바 mysql 접속 및 출력(연동) (0) | 2017.08.18 |
자바 mysql 연동 진행(jdbc 설치, mysql connector 설치) 및 확인 (0) | 2017.08.18 |
자바 날짜(Calendar)와 유닉스 시간 활용 (0) | 2017.08.18 |