공부의 기록/자바 풀 스택 : 수업내용정리

자바 풀 스택 12/27 오후 기록 026-2

파티피플지선 2024. 12. 27. 18:16

 

<14:30 5교시>

package test.main;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class MainClass02 {
	public static void main(String[] args) {
		//member 테이블에 추가할 회원의 정보라고 가정하기
		int num=1;
		String name="김구라";
		String addr="노량진";
		
		Connection conn=null;
		try {
			//오라클 드라이버 로딩
			Class.forName("oracle.jdbc.driver.OracleDriver");
			//접속할 DB 의 정보 @아이피주소:port번호:db이름
			String url="jdbc:oracle:thin:@localhost:1521:xe";
			//계정 비밀번호를 이용해서 Connection 객체의 참조값 얻어오기
			conn=DriverManager.getConnection(url, "scott", "TIGER");
			//예외가 발생하지 않고 여기까지 실행순서가 내려오면 접속 성공이다.
			System.out.println("Oracle DB 접속 성공");
		} catch (Exception e) {
			e.printStackTrace();
		}
		PreparedStatement pstmt=null;
		try {
			//실행할 미완성의 sql문
			String sql="""
					Insert into member
					(num, name,addr)
					Values(?,?,?)
					""";
			//미완성의 sql문을 전달하면서 PreparedStatement 객체의 참조값 얻어내기
			pstmt=conn.prepareStatement(sql);
			//미완성인 sql 문 완성 시키기(?에순서대로 값 바인딩하기)
			pstmt.setInt(1, num);
			pstmt.setString(2, name);
			pstmt.setString(3, addr);
			//sql문 실행하기
			pstmt.executeUpdate();//insert,update,delete는 모두 exectueUpdate()를 호출하면 됨
			System.out.println("회원정보를 저장했습니다");
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

 

위에 코드에서 지역변수 num, name, addr에 대입하는 값을 다르게 하면 다른 값들도 입력이 되는데, 아무래도 이 부분을 inputstream과 outputstream 류 객체들을 이용하면 인터넷에서 입력된 정보를 데이터베이스에 입력하는 형태의 웹서버 앱을 만드는 것이 관건인듯.

 

 

예제)

//수정할 회원의 정보라고 가정하자
int num=1;//primary key
String name="에이콘";
String addr ="강남";

//위 정보대로 1번 회원의 이름을 에이콘, 주소를 강남으로 수정하는 프로그래밍 해보기

 

UPDATE 문 까먹고 있었음.... 휴....ㅠㅠ

더보기
package test.main;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class MainClass03 {
	public static void main(String[] args) {
		//수정할 회원의 정보라고 가정하자
		int num=1;//primary key
		String name="에이콘";
		String addr ="강남";
		
		//위 정보대로 1번 회원의 이름을 에이콘, 주소를 강남으로 수정하는 프로그래밍 해보기
		Connection conn=null;
		try {
			//오라클 드라이버 로딩
			Class.forName("oracle.jdbc.driver.OracleDriver");
			//접속할 DB 의 정보 @아이피주소:port번호:db이름
			String url="jdbc:oracle:thin:@localhost:1521:xe";
			//계정 비밀번호를 이용해서 Connection 객체의 참조값 얻어오기
			conn=DriverManager.getConnection(url, "scott", "TIGER");
			//예외가 발생하지 않고 여기까지 실행순서가 내려오면 접속 성공이다.
			System.out.println("Oracle DB 접속 성공");
		} catch (Exception e) {
			e.printStackTrace();
		}
		PreparedStatement pstmt=null;
		try {
			//실행할 미완성의 sql문
			String sql="""
					update member
					set name=?, addr=?
					where num=?
					""";
			//미완성의 sql문을 전달하면서 PreparedStatement 객체의 참조값 얻어내기
			pstmt=conn.prepareStatement(sql);
			//미완성인 sql 문 완성 시키기(?에순서대로 값 바인딩하기)
			pstmt.setInt(3, num);
			pstmt.setString(1, name);
			pstmt.setString(2, addr);
			//sql문 실행하기
			pstmt.executeUpdate();//insert,update,delete는 모두 exectueUpdate()를 호출하면 됨
			System.out.println("회원정보를 업데이트했습니다");
		}catch(Exception e){
			e.printStackTrace();
		}
		
		
	}
}

DELETE 문도 까먹고 있었음...

 

더보기
package test.main;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class MainClass04 {
	public static void main(String[] args) {
		//삭제할 회원의 PK라고 가정
		int num=1;
		//실제로 삭제하는 프로그래밍 해보기
		Connection conn=null;
		try {
			//오라클 드라이버 로딩
			Class.forName("oracle.jdbc.driver.OracleDriver");
			//접속할 DB 의 정보 @아이피주소:port번호:db이름
			String url="jdbc:oracle:thin:@localhost:1521:xe";
			//계정 비밀번호를 이용해서 Connection 객체의 참조값 얻어오기
			conn=DriverManager.getConnection(url, "scott", "TIGER");
			//예외가 발생하지 않고 여기까지 실행순서가 내려오면 접속 성공이다.
			System.out.println("Oracle DB 접속 성공");
		} catch (Exception e) {
			e.printStackTrace();
		}
		PreparedStatement pstmt=null;
		try {
			//실행할 미완성의 sql문
			String sql="""
					delete from member
					where num=?
					""";
			//미완성의 sql문을 전달하면서 PreparedStatement 객체의 참조값 얻어내기
			pstmt=conn.prepareStatement(sql);
			//미완성인 sql 문 완성 시키기(?에순서대로 값 바인딩하기)
			pstmt.setInt(1, num);
		
			//sql문 실행하기
			pstmt.executeUpdate();//insert,update,delete는 모두 exectueUpdate()를 호출하면 됨
			System.out.println("회원정보를 삭제했습니다");
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

 

DBConnector 객체로 편하게 오라클 연결하기

package test.util;

import java.sql.Connection;
import java.sql.DriverManager;

public class DBConnector {
	//Connection 객체를 리턴해주는 매소드
	//앞으로 Connection 객체 얻기 Connection conn=new DBConnector().getConn();
	public Connection getConn() {
		Connection conn =null;//DB 연결객체를 담을 지역 변수 만들기
		try {
			//오라클 드라이버 로딩
			Class.forName("oracle.jdbc.driver.OracleDriver");
			//접속할 DB 의 정보 @아이피주소:port번호:db이름
			String url="jdbc:oracle:thin:@localhost:1521:xe";
			//계정 비밀번호를 이용해서 Connection 객체의 참조값 얻어오기
			conn=DriverManager.getConnection(url, "scott", "TIGER");
			//예외가 발생하지 않고 여기까지 실행순서가 내려오면 접속 성공이다.
			System.out.println("Oracle DB 접속 성공");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
		
		
	}
}

 

package test.main;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import test.util.DBConnector;

public class MainClass05 {
	public static void main(String[] args) {
		//회원 목록을 불러와서 콘솔에 출력하기
		
		//필요한 객체를 담을 지역변수 미리 준비
		Connection conn=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		
		try {
			//우리가 설계한 클래스로 객체 생성후 Connection 객체 얻어내기
			conn=new DBConnector().getConn();
			String sql="""
					SELECT num, name, addr
					from Member
					order by num asc
			""";
			pstmt=conn.prepareStatement(sql);
			rs=pstmt.executeQuery();
			while(rs.next()) {
				int num=rs.getInt("num");
				String name=rs.getString("name");
				String addr=rs.getString("addr");
				System.out.printf("번호 :%d, 이름 :%s, 주소 :%s", num, name, addr);
				System.out.println();
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
		
	}
}

 

 

 

 

 

<15:30 6교시>

MemberDto 클래스를 만들었음

package test.dto;

public class MemberDto {
	//필드 선언
	private int num;
	private String name;
	private String addr;
	//디폴트 생성자
	public MemberDto() {}
	
	public MemberDto(int num, String name, String addr) {
		super();
		this.num = num;
		this.name = name;
		this.addr = addr;
	}

	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAddr() {
		return addr;
	}
	public void setAddr(String addr) {
		this.addr = addr;
	}
	
	
}

우리가 하려는 것

SELECT 된 ROW 하나의 정보를 MemberDto 객체에 담고 있고,

row가 여러개니까 MemberDto 객체 여러개가 있고,

이걸 다 List<MemberDto>객체에 순서대로 담는 연습을 하려는 것

 

 

package test.main;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import test.dto.MemberDto;
import test.util.DBConnector;

public class MainClass06 {
	public static void main(String[] args) {
		//회원 목록을 아주 쉽게 얻어낼 수 있다(날로 먹을 수 있다)
		List<MemberDto> list =getList();
		for(MemberDto tmp:list) {
			System.out.printf("번호:%d, 이름:%s, 주소:%s \r\n",tmp.getNum(), tmp.getName(),tmp.getAddr());
		}
	}
	//미리 준비된 메소드가 있다고 가정하면
	public static List<MemberDto> getList(){
		//여기에 어떻게 코딩하면 회원 목록(List<MemberDto>)를 리턴해줄 수 있을까? 코딩해보세요
		//리턴해줄 객체를 담을 지역변수 미리 준비
		List<MemberDto> list =new ArrayList<>();
		//필요한 객체를 담을 지역변수 미리 준비
		Connection conn=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		for(MemberDto tmp:list) {
			try {
				conn=new DBConnector().getConn();
				String sql="""
						SELECT num, name, addr
						from Member
						order by num asc
				""";
				pstmt=conn.prepareStatement(sql);
				rs=pstmt.executeQuery();
				while(rs.next()) {
					int num=rs.getInt("num");
					String name=rs.getString("name");
					String addr=rs.getString("addr");
				
					//select 된 row 하나의 정보를 memberdto 객체에 담는다.
					MemberDto dto=new MemberDto();
					dto.setNum(num);
					dto.setName(name);
					dto.setAddr(addr);
					//회원 한명의 정보가 담긴 MemberDto 객체를 ArrayList객체에 누적시킴
					list.add(dto);
				}
			}catch(Exception e) {
				e.printStackTrace();
			}	
			}
			return list;
	}
}

 

<16:30 7교시>

방금전 시간에 했던 걸 emp 테이블에 대해서 EmpDto를 만들고 진행

package test.dto;

public class EmpDto {
	private int empno;
	private String ename;
	private String job;
	private double sal;
	
	public EmpDto() {}

	public int getEmpno() {
		return empno;
	}

	public void setEmpno(int empno) {
		this.empno = empno;
	}

	public String getEname() {
		return ename;
	}

	public void setEname(String ename) {
		this.ename = ename;
	}

	public String getJob() {
		return job;
	}

	public void setJob(String job) {
		this.job = job;
	}

	public double getSal() {
		return sal;
	}

	public void setSal(double sal) {
		this.sal = sal;
	}
	
	
}

 

package test.main;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import test.dto.EmpDto;
import test.dto.MemberDto;
import test.util.DBConnector;

public class MainClass07 {
	public static void main(String[] args) {
		//사원 목록을 아주 쉽게 얻어낼수 있다 (날로 먹을수 있다)
		List<EmpDto> list=getList();
		for(EmpDto tmp:list) {
			System.out.printf("이름:%s, 번호:%d, 직무:%s, 급여:%f \r\n", 
					tmp.getEname(), tmp.getEmpno(), tmp.getJob(), tmp.getSal());
		}
	}
	
	//미리 준비된 메소드가 있다고 가정하면 
	public static List<EmpDto> getList(){
		
		//리턴해줄 객체를 미리 생성하기
		List<EmpDto> list=new ArrayList<>();
		
		//여기에 어떻게 코딩하면 회원 목록(List<MemberDto>) 를 리턴해줄수 있을까? 코딩해 보세요.
		//필요한 객체를 담을 지역변수 미리 준비
		Connection conn=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		
		try {
			//우리가 설계한 클래스로 객체생성후 Connection 객체 얻어내기
			conn=new DBConnector().getConn();
			String sql="""
				SELECT ename, empno, job, sal
				from emp
			""";
			pstmt=conn.prepareStatement(sql);
			rs=pstmt.executeQuery();
			while(rs.next()) {
				String ename=rs.getString("ename");
				int empno=rs.getInt("empno");
				String job=rs.getString("job");
				double sal=rs.getDouble("sal");
				//select 된 row 하나의 정보를 MemberDto 객체에 담는다.
				EmpDto dto=new EmpDto();
				dto.setEname(ename);
				dto.setEmpno(empno);
				dto.setJob(job);
				dto.setSal(sal);
				//사원 한명의 정보가 담긴 MemberDto 객체를 ArrayList 객체에 누적 시킨다.
				list.add(dto);
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
		
		return list;
	}
}

package test.main;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import test.dto.DeptDto;
import test.dto.EmpDto;
import test.util.DBConnector;

public class MainClass08 {
	public static void main(String[] args) {
		//부서 목록을 아주 쉽게 얻어낼수 있다 (날로 먹을수 있다)
		List<DeptDto> list=getList();
		for(DeptDto tmp:list) {
			System.out.printf("부서번호:%d, 부서이름:%s, 지역:%s \r\n", 
					tmp.getDeptno(), tmp.getDname(), tmp.getLoc());
		}
	}
	
	//미리 준비된 메소드가 있다고 가정하면 
	public static List<DeptDto> getList(){
		
		//리턴해줄 객체를 미리 생성하기
		List<DeptDto> list=new ArrayList<>();
		
		//여기에 어떻게 코딩하면 회원 목록(List<DeptDto>) 를 리턴해줄수 있을까? 코딩해 보세요.
		//필요한 객체를 담을 지역변수 미리 준비
		Connection conn=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		
		try {
			//우리가 설계한 클래스로 객체생성후 Connection 객체 얻어내기
			conn=new DBConnector().getConn();
			String sql="""
				SELECT deptno, dname, loc
				from dept
			""";
			pstmt=conn.prepareStatement(sql);
			rs=pstmt.executeQuery();
			while(rs.next()) {
				int deptno=rs.getInt("deptno");
				String dname=rs.getString("dname");
				String loc=rs.getString("loc");
				//select 된 row 하나의 정보를 DeptDto 객체에 담는다.
				DeptDto dto=new DeptDto();
				dto.setDeptno(deptno);
				dto.setDname(dname);
				dto.setLoc(loc);
			
				//부서의 정보가 담긴 DeptDto 객체를 ArrayList 객체에 누적 시킨다.
				list.add(dto);
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
		
		return list;
	}
}

 

package test.main;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import test.dto.EmpDeptDto;
import test.util.DBConnector;

public class MainClass09 {
	public static void main(String[] args) {
		//부서 목록을 아주 쉽게 얻어낼수 있다 (날로 먹을수 있다)
		List<EmpDeptDto> list=getList();
		for(EmpDeptDto tmp:list) {
			System.out.printf("사원번호:%d, 사원이름:%s, 부서번호:%d, 부서 이름:%s \r\n", 
					tmp.getEmpno(), tmp.getEname(), tmp.getDeptno(), tmp.getDname());
		}
	}
	
	//미리 준비된 메소드가 있다고 가정하면 
	public static List<EmpDeptDto> getList(){
		
		//리턴해줄 객체를 미리 생성하기
		List<EmpDeptDto> list=new ArrayList<>();
		
		//여기에 어떻게 코딩하면 회원 목록(List<DeptDto>) 를 리턴해줄수 있을까? 코딩해 보세요.
		//필요한 객체를 담을 지역변수 미리 준비
		Connection conn=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		
		try {
			//우리가 설계한 클래스로 객체생성후 Connection 객체 얻어내기
			conn=new DBConnector().getConn();
			String sql="""
				SELECT empno, ename, deptno, dname
				from emp
				join dept using (deptno)
			""";
			pstmt=conn.prepareStatement(sql);
			rs=pstmt.executeQuery();
			while(rs.next()) {
				int empno=rs.getInt("empno");
				String ename=rs.getString("ename");
				int deptno=rs.getInt("deptno");
				String dname=rs.getString("dname");//dname 대신 별칭을 줬다면 여기도 별칭으로 바뀌어야 함
				//select 된 row 하나의 정보를 DeptDto 객체에 담는다.
				EmpDeptDto dto=new EmpDeptDto();
				dto.setEmpno(empno);
				dto.setEname(ename);
				dto.setDeptno(deptno);
				dto.setDname(dname);
			
				//부서의 정보가 담긴 DeptDto 객체를 ArrayList 객체에 누적 시킨다.
				list.add(dto);
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
		
		return list;
	}
}

 

 

<17:30 8교시> 

지금까지 한거 일단 깃허브에 새로운 허브로 올려보려고 함.

그리고 어제 실패했던거 최대한 다시 해보려고 함..

아래는 삽질 하던데까지 백업..

더보기
package test.frame01;

import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class MemoFrame2 extends JFrame{
	//생성자
	public MemoFrame2(String title) {
		super(title);
		
		var topPanel=new JPanel();
		var loadBtn=new JButton("load");
		
		//페널에 UI 두개 추가

		topPanel.add(loadBtn);
		//프레임의 레이아웃 설정
		setLayout(new BorderLayout());
		//프레임의 북쪽에 페널 배치
		add(topPanel, BorderLayout.NORTH);
		//저장 버튼에 리스너 함수 등록 
		loadBtn.addActionListener((event)->{
			//입력한 문자열 읽어오기
			//String msg=inputMsg.getText();
			File f = new File("C:/Users/acorn/Desktop/playground/myFolder/memo.txt");
			
			try {
				//만일 해당 파일이 존재하지 않으면
				if(!f.exists()) {
					//새로 만들어라 
					f.createNewFile();
					System.out.println("memo.txt 파일을 만들었습니다.");
				}
				// new FileWriter(File 객체, append mode 여부 ) 
				var fr=new FileReader(f);	
			
				fr.close(); //마무리
				System.out.println("memo.txt 파일에 문자열을 기록 했습니다");		
			} catch (IOException e) {
				
				e.printStackTrace();
			}
		});
	}
	
	public static void main(String[] args) {
		var f=new MemoFrame2("메모 프레임");
		f.setBounds(100, 100, 500, 500);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setVisible(true);
	}
}