무룩 공부방

[Java03] DB연동 연습 (2) (Eclipse, SQL Developer) 본문

IT/Java03_JDBC

[Java03] DB연동 연습 (2) (Eclipse, SQL Developer)

moo_look 2023. 10. 15. 19:06

# 문제

고교 성적처리 프로젝트를 작성하라


<VO>

package java03_jdbc.dao;

public class HighVo {

	private String syear;       
	private String sclass;      
	private String sno; 
	private String sname; 
	private String birth;    
	private String gender;
	private String tel1; 
	private String tel2;      
	private String tel3;
	
	public String getSyear() {
		return syear;
	}
	public void setSyear(String syear) {
		this.syear = syear;
	}
	public String getSclass() {
		return sclass;
	}
	public void setSclass(String sclass) {
		this.sclass = sclass;
	}
	public String getSno() {
		return sno;
	}
	public void setSno(String sno) {
		this.sno = sno;
	}
	public String getSname() {
		return sname;
	}
	public void setSname(String sname) {
		this.sname = sname;
	}
	public String getBirth() {
		return birth;
	}
	public void setBirth(String birth) {
		this.birth = birth;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public String getTel1() {
		return tel1;
	}
	public void setTel1(String tel1) {
		this.tel1 = tel1;
	}
	public String getTel2() {
		return tel2;
	}
	public void setTel2(String tel2) {
		this.tel2 = tel2;
	}
	public String getTel3() {
		return tel3;
	}
	public void setTel3(String tel3) {
		this.tel3 = tel3;
	} 
	
	
}

package java03_jdbc;

import java.util.Scanner;

import java03_jdbc.dao.HighDao;

public class HighSchool {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		HighDao dao = new HighDao();
		boolean flag = true;
		
		while(flag) {
			
			System.out.print("[1]입력 [2]검색 [3]수정 [4]삭제 [5]종료 : ");
			int menu = sc.nextInt();
			
			switch(menu) {
				case 1 : 
					dao.view();
					break;
				case 5 : 
					System.out.println("종료");
					flag = false;
					break;
			}
		}
		
		sc.close();

	}

}

package java03_jdbc.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.Scanner;

import java03_jdbc.db.Db;

public class HighDao {

	Scanner sc = new Scanner(System.in);
	
	public void view() {
		
		System.out.print("학년 반 번호 이름 생년월일 성별 전화1 전화2 전화3 입력 : ");

		String syear = sc.next();       
		String sclass = sc.next();      
		String sno = sc.next(); 
		String sname = sc.next(); 
		String birth = sc.next();    
		String gender = sc.next();
		String tel1 = sc.next(); 
		String tel2 = sc.next();      
		String tel3 = sc.next();
		
		HighVo vo = new HighVo();
		
		vo.setSyear(syear);
		vo.setSclass(sclass);
		vo.setSno(sno);
		vo.setSname(sname);
		vo.setBirth(birth);
		vo.setGender(gender);
		vo.setTel1(tel1);
		vo.setTel2(tel2);
		vo.setTel3(tel3);
		
		insert(vo);
	
	}
	
	public void insert(HighVo vo) {
		
		Db db = Db.getDb();
		Connection conn = db.getConnection();
        System.out.println(conn);
		
		PreparedStatement pstmt = null;
		
		String sql = "insert into tbl_student (syear,sclass,sno,sname,birth,gender,tel1,tel2,tel3) "
				+ "values (?,?,?,?,?,?,?,?,?)"; 
		
		try {
			
			pstmt = conn.prepareStatement(sql);
			
			pstmt.setString(1, vo.getSyear());
			pstmt.setString(2, vo.getSclass());
			pstmt.setString(3, vo.getSno());
			pstmt.setString(4, vo.getSname());
			pstmt.setString(5, vo.getBirth());
			pstmt.setString(6, vo.getGender());
			pstmt.setString(7, vo.getTel1());
			pstmt.setString(8, vo.getTel2());
			pstmt.setString(9, vo.getTel3());
			
			pstmt.executeUpdate();
			System.out.println("OK");
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("Exception");
            e.printStackTrace();
		} finally {
			
		}
		
	}
	
}


 위의 결과를 얻는데 굉장히 우여곡절이 많았었다. 이전에 진행한 프로젝트의 코드와 유사한 형식으로 연습하였기 때문에 오류가 발생 할 것이하고는 생각지 못했는데 SQL Developer와 연동하여 데이터를 입력하는 과정에서 처리가 제대로 되지 않았었다.

 그 이유를 찾기 위해 상당히 고전했는데 DB접속과 주소체크, 오타 수정, 메인프로젝트 구성변경 등 많은 시도를 한 끝에 SQLIntegrityConstraintViolationException가 가장 큰 걸림돌이란 걸 알게 되었다.

 인터넷을 찾아보니 SQL Developer와 연동하여 데이터를 입력하며 Primary Key를 중복하여 여러번 같은데이터로 삽입한 문제인 것 같았다. 하여 테이블을 삭제하고 다시 같은 형식으로 생성한뒤 이클립스와 SQL Developer를 다시 실행하니 해결되었다.

그 동안 학습했던 것 이외에도 규칙을 위반할 수도 있다는 것을 알게 되었다. 이는 추후에 DB를 더 학습하면서 공부해나가야 할 부분인 것 같다.


<참고 블로그>

[MySQL] SQLIntegrityConstraintViolationException 원인 및 해결 방안 : 네이버 블로그 (naver.com)

 

[MySQL] SQLIntegrityConstraintViolationException 원인 및 해결 방안

Column 'SEQ' in field list is ambiguous MySQL 사용 시 무결성 제약조건에 위배되는 ...

blog.naver.com

PreparedStatement.executeUpdate();가 동작하지 않을 때 (tistory.com)

 

PreparedStatement.executeUpdate();가 동작하지 않을 때

결론은 '껐다 켜기'다. JDBC를 통해 DB를 연동하면 자바를 통해 SQL 문을 수행할 수 있다. 이때 PreparedStatement 객체를 만들어 SQL 문을 저장한다. 만약 SQL문이 update, delete, insert 중 하나면 PreparedStatement

change-words.tistory.com