본문 바로가기
programming language/Java

[Java]데이터 베이스 연결 예제

by NOHCODING 2021. 11. 5.
반응형
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;

//GridLayout은 표처럼 배치해주는 방식 
import java.awt.GridLayout;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Vector;


public class GoodsTestDB2Method extends JFrame{
		
		// 입력받기 위한 멤버변수들의 입력상자
		JTextField jtf_no;
		JTextField jtf_item; 
		JTextField jtf_qty;
		JTextField jtf_price;
		
		//모든 상품목록을 엑셀과 같은 모양으로 보여주기 위한 테이블을 선언
		JTable table;
		
		// 테이블의 칼럼이름을 위한 벡터를 선언
		Vector colNames;
		Vector<Vector> rowData;
		
        //데이터 베이스에 접근 할 insertGoods 메소드 작성
		public void insertGoods(int no, String item, int qty, int price) {
			
			String sql = "insert into goods values("+ no + ", '" +  item +"', " +  qty + ", " +    price + ")";
			
			// finally에서도 접근할 수 있도록 Connection과 Statment변수를 try문 바깥에도 선언함
			Connection conn = null;
			Statement stmt = null;
			
			// 데이터베이스에 연결
			try {
				//01. jdbc 드라이버를 메모리로 로드한다.
				Class.forName("oracle.jdbc.driver.OracleDriver");
				
				//02. db서버에 연결한다.
				conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "c##sist", "sist");
				
				//03.  DB 명령을 실행할 Statement 객체를 생성한다.
				stmt = conn.createStatement();
				
				//04.  DB 명령을 실행한다.
				int re = stmt.executeUpdate(sql);
				if (re == 1 ) {
					System.out.println("상품등록에 성공하였습니다.");
					//상품 등록후 작성 필드 리셋
					jtf_no.setText("");
					jtf_item.setText("");
					jtf_qty.setText("");
					jtf_price.setText("");
					
					printGoods();
					
				}else {
					System.out.println("상품등록에 실패하였습니다.");
				}
				
			}catch(Exception ex ) {
				System.out.println("예외발생 : " + ex.getMessage());
			}finally {
            
				//05. 사용했던 자원들을 닫아줌(반드시 처리해야하는 것)
				try {
					if (stmt != null) {
						stmt.close();
					}
					
					if (conn != null) {
						conn.close();
					}
			
				}catch(Exception ex) {
					System.out.println("예외발생 : ");
				}
				
			}
		}
			
			
		//데이터베이스에 연결하여 goods테이블의 모든 상품을 읽어와서 (검색, 조회)
		//테이블에 출력하는 메소드 생성
		public void printGoods() {
			
			//새로운 상품을 등록하여 계속 호출 될 수 있으니 먼저 깨끗이 지워줌
			rowData.clear();
			
			//데이터 베이스에 연결하여 실행할 명령어
			String sql = "select * from goods order by no";
			
			//데이터베이스 연결과 필요한 변수들을 선언한다.
			//DB 서버에 연결을 위한 변수 
			Connection conn = null;
			//데이터 베이스 명령을 실행하기 위한 변수
			Statement stmt = null;
			//읽어온 데이터를 담기 위한 변수
			ResultSet rs = null;
			try {
				
			}catch(Exception e) {
				System.out.println("예외발생 : " + e.getMessage());
			}finally {
				try{
					
					//01. jdbc 드라이버를 메모리로 로드한다.
					Class.forName("oracle.jdbc.driver.OracleDriver");
					
					//02. db서버에 연결한다.
					conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "c##sist", "sist");
					
					//03.  DB 명령을 실행할 Statement 객체를 생성한다.
					stmt = conn.createStatement();
					
					//04.  DB 명령을 실행한다.
					// executeUpdate 자료를 추가 수정 삭제
					//executeQuery(String sql) 자료를 읽어올때
					
					rs =  stmt.executeQuery(sql);
					//5. 일처리를 한다.
					// 검색한 자료가 있는만큼 반복실행하여 한 행씩 읽어와서 그것을 벡터로 만든다.
					// 벡터를 테이블의 자료를 위한 rowData에 담는다.
					// ResultSet의 결과에서 특정 레코드를 가리키는 커서 가 있음
					// 이 커서를 한 행씩 옮겨주는 메소드가 next()임.
					//메소드는 레코드가 있어서 성공적으로 옮겨지면 true 아니면 false 반환
					
					while ( true == rs.next()) {
						//현재 커서가 바라보고 있는 레코드의 속성값을 읽어오기 위해 자료형에 따라 
						//get()을 사용함 문자열 getString 정수 getInt
						//매개변수로 컬럼의 인덱스나 컬럼 이름을 문자열로 전달 할 수 있음
						// 여기서 인덱스는 1부터 시작함
						int no = rs.getInt(1);
						String item = rs.getString(2);
						int qty = rs.getInt(3);
						int price = rs.getInt(4);
						
						//벡터를 만들고 그 벡터에 no,item,price를 담는다
						Vector v = new Vector();
						v.add(no);
						v.add(item);
						v.add(qty);
						v.add(price);
						
						rowData.add(v);
						
						// 바뀐 내용으로 테이블을 다시 그림
						// 처음 테이블을 만들 때 rowData벡터는 비어있음
						// 나중에 테이블의 데이터인 rowData 바뀐자료를 적용하기 위해서는 updateUI를 호출
						table.updateUI();
					}	
					try{
						if(rs != null) {
							rs.close();
						}
						if(stmt != null) {
							stmt.close();
						}
						if(conn != null) {
							conn.close();
						}
					}catch(Exception e) {
						System.out.println("예외발생 : " + e.getMessage());
					}
						
						
				
				}catch(Exception e) {
					System.out.println("예외발생 : " + e.getMessage());
				}
			}
		}
		
	
		
		 public GoodsTestDB2Method(){
			 
			 // 테이블에 들어갈 칼럼이름을 위한 벡터를 생성하고 자료를 추가 
			 colNames = new Vector<Vector>();
			 colNames.add("상품번호");
			 colNames.add("상품명");
			 colNames.add("수량");
			 colNames.add("단가");
			 
			//테이블에 들어가 실제 담기 위한 벡터를 생성하고 자료를 추가
			rowData = new Vector<Vector>();
		
			
			
			//컬럼 이름이 있는 colName벡터와 실제 데이터 있는 rowData 벡터를 가지고 엑셀과 같은 화면의
			table = new JTable(rowData, colNames);
			
			JScrollPane jsp = new JScrollPane(table);
			
			jtf_no = new JTextField();
			jtf_item = new JTextField();
			jtf_price = new JTextField();
			jtf_qty = new JTextField();
			
			//입력 설명하는 라벨들을 담기 위한 패널 생성
			JPanel p = new JPanel();
			p.setLayout(new GridLayout(4,2));
			
			//라벨과 입력상자 (텍스트 필드)들을 패널에 차례로 담는다
			p.add(new JLabel("상품번호 :"));
			p.add(jtf_no);
			
			p.add(new JLabel("상품이름 : "));
			p.add(jtf_item);
			
			p.add(new JLabel("상품수량 : "));
			p.add(jtf_qty);
			
			p.add(new JLabel("상품단가 : "));
			p.add(jtf_price);
			
			//버튼을 만들어요
			JButton btn_add = new JButton("추가");
			JButton btn_list = new JButton("목록");
			
			// 버튼들을 담을 패널을 생성
			JPanel p2 = new JPanel();
			p2.add(btn_add);
			p2.add(btn_list);
			
			//입력상자 패널, 버튼 패널을 담기위한 패널을 생성
			JPanel p_center = new JPanel();
			
			p_center.setLayout(new BorderLayout());
			p_center.add(p,BorderLayout.CENTER);
			p_center.add(p2,BorderLayout.SOUTH);
			
			// 프레임 가운데에 입력상자와 버튼을 담고 있는 패널을 담는다
			add(p_center, BorderLayout.CENTER);
			
			//table을 담고 있는 스크롤 팬을 아래쪽에 담아요.
			add(jsp,BorderLayout.SOUTH);
			
			//프레임의 가로길이, 세로길이를 설정하고 화면에 보여주도록 설정
			setSize(800,600);
			setVisible(true);
			
			//창을 닫으면 프로그램도 종료하도록 설정
			setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			
			//목록을 누르면 데이터베이스를 연결 할 수 있도록 생성
			btn_list.addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent e) {
					printGoods();
					
				}
			});
			
			//추가 버튼을 누리면 사용자가 입력한 상품번호, 상품이름, 상품 수량, 상품 가격을 
			//데이터 베이스 자료에 추가
			
			//import java.awt.event.ActionListener;
			btn_add.addActionListener(new ActionListener(){

				@Override
				public void actionPerformed(ActionEvent e) {
					
					int no = Integer.parseInt(jtf_no.getText());
					String item = jtf_item.getText();
					int qty = Integer.parseInt(jtf_qty.getText());
					int price = Integer.parseInt(jtf_price.getText());
					
					insertGoods(no, item, qty, price);
				}
				
			});
		}
		
		
		
		
		public static void main(String[] args) {
			// TODO Auto-generated method stub
			new GoodsTestDB2Method();
		}

	}
반응형

'programming language > Java' 카테고리의 다른 글

[Java] 03.메서드  (0) 2021.11.28
[Java] 02. 변수  (0) 2021.11.28
[Java] 01.클래스와 객체  (0) 2021.11.28
[Java] PrepareSatement  (0) 2021.11.05
[Java] 1. 자바를 시작하기 전에  (2) 2021.10.05

댓글