JDBC

DQL_select_where_PreparedStatement

에어팟맥스 2022. 7. 22. 00:38
public class DQL_select_where_PreparedStatement_03 {

	public static void main(String[] args) {
		
		Connection conn = null;
	      
	    PreparedStatement pstmt = null;
	    
	    ResultSet rs = null;
	    
	    
	    Scanner sc = new Scanner(System.in);
	      
	      
	    try {
	    	
	         Class.forName("oracle.jdbc.driver.OracleDriver");
	         
	         
	         System.out.print("▷ 연결할 오라클 서버의 IP 주소 : ");
	         String ip = sc.nextLine();
	         
	         conn = DriverManager.getConnection("jdbc:oracle:thin:@"+ip+":1521:xe", "JDBC_USER", "aclass");
	         
	         
	         String sql = " select no, name, msg, to_char(writeday, 'yyyy-mm-dd hh24:mi:ss') as writeday "
	         	     	+ " from tbl_memo "
	         		    + " order by no desc "; 
	         
	         
	         pstmt = conn.prepareStatement(sql);
	         
	         rs = pstmt.executeQuery();
	         
	         System.out.println("-----------------------------------------------------");
	         System.out.println("글번호\t글쓴이\t글내용\t작성일자");
	         System.out.println("-----------------------------------------------------");
	         
	         StringBuilder sb = new StringBuilder();
	         
	         while( rs.next() ) {
	        	 
	        	 int no = rs.getInt(1);               // 1 은 select 해온 컬럼의 위치값으로, 첫번째 컬럼을 가리킨다.
	        	 String name = rs.getString(2);       // 2 은 select 해온 컬럼의 위치값으로, 두번째 컬럼을 가리킨다.    	 
	        	 String msg = rs.getString(3);        // 3 은 select 해온 컬럼의 위치값으로, 세번째 컬럼을 가리킨다.     	 
	        	 String writeday = rs.getString(4);   // 4 은 select 해온 컬럼의 위치값으로, 네번째 컬럼을 가리킨다.         	 
	        	 
	        	 sb.append(no);
	        	 sb.append("\t"+name);
	        	 sb.append("\t"+msg);
	        	 sb.append("\t"+writeday+"\n");
	        	 
	        	 
	         }  // end of while( rs.next() )
	         
	         System.out.println(sb.toString());
	         
	         
	         // === StringBuilder sb 을 초기화하기 === //
	         sb = new StringBuilder();
	         // 또는
	       //sb.setLength(0);
	         
	         sb.append("--------------- >>> 조회할 대상 <<< ---------------\n");
	         sb.append("1.글번호	2.글쓴이	3.글내용	4.종료\n");
	         sb.append("-----------------------------------------------\n");
	         
	         String menu = sb.toString();
	        
	         String menuNo = "";
	         
	         do {
		         ///////////////////////////////////////////////////////////////////////////
		         
		         System.out.println(menu);
		         System.out.print("▷ 번호선택: ");
		         menuNo = sc.nextLine();
		         
		         String colName = "";   // where 절에 들어올 컬럼명
		         String searchType = "";
		         
		         switch (menuNo) {
					case "1":    // 글번호
						colName = "NO";
						searchType = "글번호";
						break;
					case "2":    // 글쓴이
						colName = "NAME";
						searchType = "글쓴이";
						break;
					case "3":    // 글내용
						colName = "MSG";
						searchType = "글내용";
						break;
					case "4":    // 종료
						
						break;
		
					default:
						System.out.println("~~~ 메뉴에 없는 번호입니다. ~~~\n");
						break;
				 } // end of switch (menuNo) --------------------------------------------
		         
		         if("1".equals(menuNo) || "2".equals(menuNo) || "3".equals(menuNo)) {
		        	 
		        	 System.out.print("▷ 검색어: ");
		        	 String search = sc.nextLine();
		        	 
		        	 sql = " select no, name, msg, to_char(writeday, 'yyyy-mm-dd hh24:mi:ss') as writeday "
			         	 + " from tbl_memo ";
		        	 
		        	 if(!("3".equals(menuNo)) ) { // 글번호 또는 글쓴이로 검색시
		        		 
		        		 sql += " where  to_char(" + colName + ") = ? ";
		        		 // !!!! 컬럼명 또는 테이블명은 위치홀더인 ?(데이터만 가능) 를 쓰면 안되고, 반드시 변수로 처리해야 한다. !!!! //
		        		 // !!!! 데이터값만 위치홀더인 ? 를 써야한다. !!!! //
		        		 
		        	 }
		        	 else { // 글내용으로 검색시
		        		 
		        		 sql += " where to_char(" + colName +  ") like '%'|| ? ||'%' ";
		        		 
		        	 }
		        	 
			         sql += " order by no desc "; 
		        	 
			         pstmt = conn.prepareStatement(sql);
			         pstmt.setString(1, search);
			         
			         rs = pstmt.executeQuery();
			         
			         
			      // === StringBuilder sb 을 초기화하기 === //
			         sb = new StringBuilder();
			      // 또는
			      // sb.setLength(0);
			      
			         int cnt = 0;   
			         
			         while(rs.next()) {
			    	    cnt++;
			    	    
			    	    if(cnt == 1) {
				    	    System.out.println("-----------------------------------------------------");
					        System.out.println("글번호\t글쓴이\t글내용\t작성일자");
					        System.out.println("-----------------------------------------------------");
			    	    }
			    	    	
			    	    int no = rs.getInt(1);               // 1 은 select 해온 컬럼의 위치값으로, 첫번째 컬럼을 가리킨다.
			        	String name = rs.getString(2);       // 2 은 select 해온 컬럼의 위치값으로, 두번째 컬럼을 가리킨다.    	 
			        	String msg = rs.getString(3);        // 3 은 select 해온 컬럼의 위치값으로, 세번째 컬럼을 가리킨다.     	 
			        	String writeday = rs.getString(4);   // 4 은 select 해온 컬럼의 위치값으로, 네번째 컬럼을 가리킨다.         	 
			        	 
			        	sb.append(no);
			        	sb.append("\t"+name);
			        	sb.append("\t"+msg);
			        	sb.append("\t"+writeday+"\n");
			    	    
			    	    
			         } // end of while(rs.next()) ------------------------------------------
			         
			         if(cnt > 0) { // 검색된 결과물이 존재하는 경우
			        	 System.out.println(sb.toString());
			         }
			         else {        // 검색된 결과물이 없는 경우  
			        	 System.out.println(">>> " + searchType + " " + search + "에 해당하는 데이터가 없습니다. <<<\n");
			         }
			         
		         } // end of if ---------------------------------------------------------
		         ///////////////////////////////////////////////////////////////////////////////////////
		         
	         } while( !( "4".equals(menuNo) ));
	         // end of do ~ while ---------------------------------------------------
	         
	         
	         
	      } catch (ClassNotFoundException e) {
	         System.out.println(">>> ojdbc8.jar 파일이 없습니다. <<<");
	      } catch(SQLException e) {
	         e.printStackTrace();
	      } finally {
	         
	         try {
	        	 if(rs != null )
	        		 rs.close();
	        	 
	            if(pstmt != null)
	               pstmt.close();
	            
	            if(conn != null)
	               conn.close();
	         } catch (SQLException e) {
	            e.printStackTrace();
	         }
	         
	      }
	      
	        sc.close();
	        System.out.println("~~~~ 프로그램 종료 ~~~~");
	    

	} // end of main() --------------------------------------------


}