부트캠프(DB)

부트캠프28일차 (JDBC)

동곤일상 2025. 3. 12. 16:49
반응형

1)JDBC

 

1-1) jar파일  이클립스에연동

1-2) jdbc연결

1-3) JDBC사용해보기

1-4) JDBC  사용 객체와 작동방식

1-4)JDBC사용 예제

1-5) PreparedStatement

1-6)DB연결부분 develop

1-7)MetaData

1-8)execute

1-9) 예제

2) 내가만든 총 예제

 

 


1) @@ JDBC @@

1) 정의

  • Java Database Connectivity
  • 자바에서 데이터베이스에 연결하여, 데이터를 조회하거나 수정할 수 있도록 돕는 API
  • 자바 애플리케이션과 데이터베이스 간의 통신을 가능하게 함
  •  

2) 역할

  1. 데이터베이스 연결
  2. SQL 실행
  3. SQL 실행 결과 Java에서 처리

3) 설치

  1. Java와 MariaDB간의 호환성 확인

https://mariadb.com/kb/en/about-mariadb-connector-j/

 

About MariaDB Connector/J

LGPL-licensed MariaDB client library for Java applications.

mariadb.com

 

2.다음링크로 접속해 

https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client/3.5.1

 

 

 

Maven Repository에서 적절한 버전의 MariaDB Java Client jar파일 다운로드

 


1-1 ) jar파일을 이클립스에 넣기

 jar파일

 

1) 특징

  • Java Archive의 약자
  • 여러 개의 Java 클래스 파일, 리소스를 하나의 파일로 묶어둔 곳

2) 역할

  • 배포 : 여러 개의 Java 파일을 하나로 묶어서 배포하기 쉽게 함
  • 라이브러리 제공 : 다른 프로그램에서 사용할 수 있는 기능을 제공하는 라이브러리의 형태로 사용

 

 

 

이클립스

프로젝트생성(나는 jdbc라는 이름으로만듬)

다운받은 jar파일을 복사붙여넣기한 후

다음과같이 실행

jar파일 복붙

 

우클릭 후 다음과같은경로로 들어가

 

add JARs 를 클릭 후 복사붙여넣기한 jar파일을 찾아서 넣어준 후 apply

 

다음과같이 바뀔거임

 


1-2) JDBC 연결

package jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/*
 * JDBC : 자바애플리케이션과 DBMS를 연결하기위한도구
 * 		1.드라이버파일 연결 : classpath연결 : buildPath 메뉴이용
 * 		2.JDBC 관련패키지 : java.sql.* 
 * 		3.드라이브클래스를 메모리에 road
 * 		4.dbms와 java를 연결해 객체생성
 */
public class JdbcEx1 {
	public static void main(String[] args) throws ClassNotFoundException , SQLException{
		//3 Class.forName(문자열) : 문자열에해당하는 클래스찾아서 클래스파일을 메모리에 로드
		// mariadb : org.mariadb.jdbc.Driver
		// oracle : oracle.jdbc.driver.OracleDriver
		Class.forName("org.mariadb.jdbc.Driver");
		//4.conn : db와 연결객체
		//localhost : IP주소 
		//3306 : port번호 (maria , my sql : 3306) 
		Connection conn = DriverManager.getConnection
				("jdbc:mariadb://localhost:3306/gdjdb","gduser","1234");
		                                      //나의DB명 , 사용자명 , 비번
		System.out.println("jdbc 연결완료");

다음코드로  jdbc를 연결해준다(대소문자주의)

 

 

window -> show view -> other->Data Management -> Datasource Explorer

 

이와같은 폴더들이 뜰것임 Database connections 우클릭 -> new 클릭을 한다면

저렇게 DB고르는 화면이 나올것임 우리는 mariaDB를 사용하고있으므로 

mySQL 클릭하자

 

저 버튼 클릭

JAR List 선택 후 

있는 파일을 remove

 

add JAR을 누르고

아까 다운받은 jar파일을 넣어주자

 

 

다 됐다면 Properties 를 누른 후 다음과같이 설정해주자

(나의DB에맞게설정)

(mariaDB)나의 localhost와 DB임

 

ok 누른 후 test Connection을 클릭해서 Succeded!가 뜨면 완료

 

finish클릭 하면 밑에 사진과같이 나의DB가 들어올것임


1-3 ) JDBC 사용해보기

 

패키지에  new -> file을 해서

sql확장자를 가진 파일하나를 생성해준 후

다음과같이 설정해준다.

다음과같이 Execute로 실행해야함

DB연동완료(불편함)

 

껐다키면 연결이해제될 가능성이 높아

Data Source Explorer에서 mysql을 Conncet 해줘야함


 

연결후에 자바로 SQL사용해보자

package jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JdbcEx1 {
	public static void main(String[] args) throws ClassNotFoundException , SQLException{
		Class.forName("org.mariadb.jdbc.Driver");
		Connection conn = DriverManager.getConnection
				("jdbc:mariadb://localhost:3306/gdjdb","gduser","1234");
		                                      //나의DB명 , 사용자명 , 비번
		System.out.println("jdbc 연결완료");
		
		//이건 jdbc연결후에 실행하자
		//Statement : SQL명령문을 DB에 전달위한 객체
		Statement stmt = conn.createStatement();
		//stmt.executeQuery("sql문") : sql문장 실행
//		ResultSet : select구문의 결과를 저장하는 객체
		ResultSet rs = stmt.executeQuery("select * from student");
		while(rs.next()) { //레코드 하나씩 조회(모두읽을때까지)
					//rs.getString("컬럼명") : 컬럼의값을 문자열로읽어와
			System.out.print("학번 : "+rs.getString("studno"));
			System.out.print(",이름 : "+rs.getString("name"));
			System.out.print(",학년 : "+rs.getString("grade"));
			System.out.println(",학과코드: "+rs.getString("major1"));
		}
	}
}

1-4) . JDBC 사용 객체와 작동방식

1) 흐름

  1. DriverManager로 데이터베이스 연결 설정
  2. Connection으로 데이터베이스 연결 유지(통로)
  3. Statement 또는 PreparedStatement로 데이터베이스에 SQL문 전달
  4. SQL 실행 결과를 ResultSet을 통해 가져옴

2) 주요 객체

1. DriverManager

  • 역할 : JDBC 드라이버를 관리하고, 데이터베이스 연결 설정
  • 주요 메소드 : getConnection(String url, String user, String password)
  • 작동 방식 :
    • 적절한 드라이버를 선택하여 데이터베이스 연결
    • 연결 정보를 통해 Connection 객체 생성

2. Connection

  • 역할 : 데이터베이스와 애플리케이션 간의 연결 유지
  • 주요 메소드:
    • createStatement(): SQL문 실행을 위한 Statement 객체 생성
    • prepareStatement(String sql): SQL문이 미리 컴파일된 PreparedStatement 객체 생성
    • close(): 연결 종료
  • 작동 방식 :
    • 데이터를 읽고 쓰는 모든 작업은 Connection을 통해 이루어짐

3. Statement

  • 역할 : 데이터베이스에 SQL문 보냄
  • 주요 메소드:
    • executeQuery(String sql): SELECT문 실행
    • executeUpdate(String sql): INSERT, UPDATE, DELETE문 실행
  • 작동 방식 :
    • SQL문을 문자열 매개변수로 전달
    • 주로 정적인 쿼리에 사용

4. PreparedStatement

  • 역할 : 데이터베이스에 SQL문 보냄
  • 주요 메소드 :
    • executeQuery(): SELECT문 실행
    • executeUpdate(): INSERT, UPDATE, DELETE문 실행
  • 특징 :
    • 약속된 기호(?)를 사용하여 값 설정하기에 편함
    • 동적인 쿼리에 주로 사용

5. ResultSet

  • 역할 : SELECT문 실행 결과를 저장해서 가져옴
  • 주요 메소드 :
    • next(): 다음 행으로 이동
    • getString(String columnLabel): 데이터 가져오기.
  • 작동 방식 :
    • 행 단위로 데이터를 읽어옴
    • 커서를 통해 데이터에 순차적으로 접근
    •  

 


1-5) JDBC사용 예제

예제)

교수테이블에서 교수의번호,이름,id,입사일,급여 보너스,학과코드를 화면에출력하기

 

// 매번 연결객체를 적는것도 쉬운일이아니다 ( 메서드를 하나만들어버리자)

(이 메서드는 유저나 DB를 바꿀때마다 곤란해진다 밑에서  해결법을 다루겠다)

package jdbc;

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

public class DBConnection {
	
	static Connection getConnection() throws ClassNotFoundException, SQLException {
		Class.forName("org.mariadb.jdbc.Driver");
		//DB와 연결객체
		Connection conn = DriverManager.getConnection
				("jdbc:mariadb://localhost:3306/gdjdb","gduser","1234");
		return  conn;
	}
}
package jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

//교수테이블에서 교수의번호,이름,id,입사일,급여 보너스,학과코드를 화면에출력하기
public class Exam1 {
	public static void main(String[] args) throws SQLException, ClassNotFoundException {
    		//만들어 놓은 클래스메서드활용하기
		Connection conn = DBConnection.getConnection();
		
		//SQL 명령문 DB에 전달하기위한객체
		Statement st = conn.createStatement();
		
		//select문 결과를 저장할 객체
		ResultSet rs = st.executeQuery("select no,name,id,hiredate,salary,bonus,deptno from professor");
	
		while(rs.next()) {
			System.out.printf("교수번호 : "+rs.getString(1)); //이 번호는 스키마에있는번호가아님 (조호된 컬럼의 순서)
			System.out.printf(",이름 : "+rs.getString(2));
			System.out.printf(",id : "+rs.getString(3));
			System.out.printf(",입사일 : "+rs.getString(4));
			System.out.printf(",급여 : "+rs.getString(5));
			System.out.printf(",보너스 : "+rs.getString(6));
			System.out.println(",학과코드: "+rs.getString(7));
		}
	}

}

 


 

테이블생성 , 데이터삽입, 테이블삭제

package jdbc;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/*
 * ResultSet executeQuery(sql) : select 구문 실행 시 호출 (db로부터 조회된레코드 return)
 *      int  executeQuery(sql) : 실행 후 변경(추가,변경,삭제) 된 레코드의 갯수리턴
 *      						create,drop,alter, insert , update , delete구문에서사용 
 *    
 */     
public class JdbcEx2 {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		
		Connection conn = DBConnection.getConnection();
		
		//SQL 명령문 DB에 전달하기위한객체
		Statement st = conn.createStatement();
		
		String sql = "create table jdbctest (id int primary key , name varchar(100))";
		int result = st.executeUpdate(sql);//jdbctest테이블 생성
		System.out.println("1.결과 : "+result);//0(레코드의갯수가없음)
		
		sql = "insert into jdbctest values(1,'홍길동')";
		result = st.executeUpdate(sql);
		System.out.println("2.결과 : "+result); //레코드1개추가했으므로 1
		
		sql = "insert into jdbctest values(2,'김삿갓'),(3,'이몽룡')";
		result = st.executeUpdate(sql);
		System.out.println("3.결과 : "+result); //2개의 레코드변경
		
		ResultSet rs = st.executeQuery("select * from jdbctest");
		while(rs.next()) {
			System.out.print(rs.getString(1));
			System.out.println(rs.getString(2)); //어차피 컬럼이2개뿐이므로 1,2 출력하자
		}
		
		sql = "delete from jdbctest "; //where없으므로 모든레코드삭제
		result = st.executeUpdate(sql);
		System.out.println("4.결과 : "+result);
		
		//jdbctest테이블삭제
		sql = "drop table jdbctest";
		result = st.executeUpdate(sql);
		System.out.println("5.결과 : "+result);//0
	}
}

1.결과 : 0

2.결과 : 1

3.결과 : 2

1홍길동

2김삿갓

3이몽룡

4.결과 : 3

5.결과 : 0

 


예제)

* dept테이블을 이용해 서울지역레코드만 dept_seoul테이블로 생성하기

*

* dept_seoul테이블에

* deptno : 60 , dname : 특수영업부 , loc :서울레코드추가

*

* dept_seoul테이블에

* deptno:60 레코드의 dname : 특수영업1부로 수정하기

* dept_seoul 테이블의 모든컬럼의내용 화면에출력

 

package jdbc;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Exam2 {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		Connection conn = DBConnection.getConnection();
		Statement st = conn.createStatement();
		
		
		String sql = "create table dept_seoul select * from dept where loc='서울'";
		int result = st.executeUpdate(sql);
		System.out.println(result);
		
		sql = "insert into dept_seoul values(60,'특수영업부','서울')";
		result= st.executeUpdate(sql);
		System.out.println(result);
		
		sql = "update  dept_seoul set dname='특수영업1부' where deptno=60";
		result= st.executeUpdate(sql);
		System.out.println(result);
		
		
		ResultSet rs = st.executeQuery("select * from dept_seoul");
		while(rs.next()) {
			System.out.print("deptno : "+rs.getString(1));
			System.out.print(",dname : "+rs.getString(2));
			System.out.println(",loc : "+rs.getString(3));
		}
		
		sql = "drop table dept_seoul";
		result= st.executeUpdate(sql);
		System.out.println(result);

	}
}

4

1

1

deptno : 10,dname : 대표이사,loc : 서울

deptno : 20,dname : 기획부,loc : 서울

deptno : 30,dname : 기술부,loc : 서울

deptno : 40,dname : 영업부,loc : 서울

deptno : 60,dname : 특수영업1부,loc : 서울

0

 


1-5) PreparedStatement

Statemenet 보다 PreparedStatement 사용을 권장!

 

역할 : 데이터베이스에 SQL문 보냄

주요 메소드 :executeQuery(): SELECT문 실행

executeUpdate(): INSERT, UPDATE, DELETE문 실행특징

:약속된 기호(?)를 사용하여 값 설정하기에 편함

동적인 쿼리에 주로 사용

 * Statement의 하위 인터페이스
 * SetInt(순서,값) : 자료형인식

 

package jdbc;

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


public class JdbcEx3 {
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		Connection con = DBConnection.getConnection();
		PreparedStatement pstmt = con.prepareStatement
				("select * from student where grade=?");
			  //DB에 SQL문장을 먼저 전달 
		Scanner scan = new Scanner(System.in);
		System.out.print("학년을 입력하세요");
		int grade = scan.nextInt();
		pstmt.setInt(1, grade);
		//1:?의순서 (첫번쨰 ?) , grade:?에 치환 될 값
		ResultSet rs = pstmt.executeQuery();
		while(rs.next()) {
			System.out.printf("학번:%7s,이름:%-5s,학년:%3d,키:%5.2f,몸무게:%5.2f,학과코드:%-5s\n",
					rs.getString("studno"),
					rs.getString("name"),
					rs.getInt("grade"),
					rs.getDouble("height"),
					rs.getDouble("weight"),
					rs.getString("major1"));
			}
	}

}


insert에서의 사용

package jdbc;

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

public class JdbcEx4 {
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		Connection conn = DBConnection.getConnection();
		String sql = "create table login "
				+ "(id varchar(10) primary key , password varchar(10))";
		PreparedStatement ps = conn.prepareStatement(sql);//create table 실행 
		int result = ps.executeUpdate();//레코드의변경갯수반환
		System.out.println("loginTable create : "+result);//0
		
		//데이터추가1
		sql = "insert into login(id,password) values (?,?)";
		ps = conn.prepareStatement(sql); //sql문장 db에전달
		ps.setString(1, "hongkd");//1번쨰?의값
		ps.setString(2, "1234");//2번쨰?의값
		result = ps.executeUpdate();//보낸거를 실행 후 레코드의변경갯수 반환
		System.out.println("hongkd insert : "+result);
		//데이터추가2(다시 db에 sql을 보낼필요가없음)
		ps.setString(1, "dong");//1번쨰?의값
		ps.setString(2, "1532");//2번쨰?의값
		result = ps.executeUpdate();//보낸거를 실행 후 레코드의변경갯수 반환
		System.out.println("dong insert : "+result);
		
		
		//테이블조회
		sql ="select * from login order by password";
		ps = conn.prepareStatement(sql);//sql을 db에전달
		ResultSet rs = ps.executeQuery();//select문(sql)의 결과를 저장
		while(rs.next()) {
			System.out.print(rs.getString(1));
			System.out.println(","+rs.getString(2));
		}
		
		
		
		sql = "drop table login";
		ps = conn.prepareStatement(sql);
		result = ps.executeUpdate();
		System.out.println("login table drop : "+result);
	}

}

 

 

 

 


1-6) DB연결부분 변경

package jdbc;

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

public class DBConnection {
	
	static Connection getConnection() throws ClassNotFoundException, SQLException {
		Class.forName("org.mariadb.jdbc.Driver");
		//DB와 연결객체
		Connection conn = DriverManager.getConnection
				("jdbc:mariadb://localhost:3306/gdjdb","gduser","1234");
		return  conn;
	}
}

위 메서드를 사용하면 DB가 바뀌거나 , user가 바뀌거나한다면 모두바꿔야하고 컴파일도 다시해야하므로번거롭다


변경 후

다음과같이 jdbc.properties 라는 파일을 하나만들어준다

driver , url , user , password 4개로 나눠서 적어준다

↓                          ↓            ↓              ↓

package jdbc;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

/*
 * 외부파일에서 DB관련 설정내용을 저장.
 */
public class DBConnection {
	// 매번 연결객체를 적는것도 쉬운일이아니다 ( 메서드를 하나만들어버리자)
	static Connection getConnection() throws ClassNotFoundException, SQLException, IOException {
		/*
		 * Properties :  Hashtable의 하위클래스 (key,객체)-->(String,String) 제네릭표현없음
		 * 				FileInputStream과 연동해 Properties 객체로 값을 저장
		 */
		Properties pro = new Properties();
		FileInputStream fis = new FileInputStream("jdbc.properties");
		pro.load(fis); //properties의 내용을 (key,value)값으로 저장해줌
		
		Class.forName(pro.getProperty("driver"));//key=Driver의 value을 가져오란 소리.
					//pro.put("driver","org.mariadb.jdbc.Driver")와 같음
		//DB와 연결객체
		Connection conn = DriverManager.getConnection
				(pro.getProperty("url"),pro.getProperty("user"),pro.getProperty("password"));
		return  conn;
	}
}

 

이 메서드에는 driver, url , user , password 이 존재하지않으며 이 파일은 건드리지않아도됨

(바꾸고싶다면 Properties 파일을 건드려)

 


1-7)MetaData 이용

 

rsmd : 결과데이터의 정보를 저장 객체 (ResultSetMetaData 객체)

ResultSetMetaData rsmd = rs.getMetaData();

 

조회된 컬럼의 수 , 컬럼 명 , 컬럼타입 조회

package jdbc;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
/*
 * ResultSetMetaData : 조회된컬럼명,컬럼갯수 등의 정보저장객체
 */
public class JdbcEx5_MetaData {
	public static void main(String[] args) throws ClassNotFoundException, SQLException, IOException {
	
		String sql = "select * from student";
		Connection conn = DBConnection.getConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		//rs : DB에서전달해준 데이터정보(ResultSet객체)
		ResultSet rs = ps.executeQuery();
		
		//MetaData사용
		//rsmd : 결과데이터의 정보를 저장 객체 (ResultSetMetaData 객체)
		ResultSetMetaData rsmd = rs.getMetaData();
		int columnCount = rsmd.getColumnCount();
		//조회된 컬럼의 갯수(java는 db의스키마를알수없음 db가전달해준 컬럼의갯수)
		System.out.println("조회된 컬럼 수 : "+columnCount);//12
		System.out.printf("%-10s","컬럼명");
		System.out.printf("%-10s","컬럼타입");
		System.out.printf("%-10s\n","Null 허용");
		for (int i = 1; i <= columnCount; i++) {
			System.out.printf("%-10s",rsmd.getColumnName(i));//i번쨰로조회된 컬럼의이름
			System.out.printf("%s(%d)\t",rsmd.getColumnTypeName(i),rsmd.getPrecision(i));
			System.out.printf("%-10s\n",(rsmd.isNullable(i)==0)?"NOT NULL":"NULL");	
		}
	}
}


MetaData를 이용한 예제

package jdbc;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

/*
 * 학생의학번 이름 학년 학과코드 학과명 지도교수 이름을 출력해보자
 * 출력시 Header에 컬럼도 출력하기
 */
public class Exam3 {
	public static void main(String[] args) throws ClassNotFoundException, SQLException, IOException {
		Connection conn = DBConnection.getConnection();
		String sql = "select s.name,s.grade,s.studno,m.name ,p.name "
				+ "from student s join professor p join major m "//항상 줄을 바꿀때는 한칸씩 띄워주지
				+ "on s.profno = p.no and s.major1=m.code";
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		ResultSetMetaData rsmd = ps.getMetaData();
		for (int i = 1; i <= rsmd.getColumnCount(); i++) {
			System.out.printf("%-15s",rsmd.getColumnName(i));	
		}
		System.out.println();
		while(rs.next()) {
			System.out.printf("%-15s",rs.getString("s.name"));//1
			System.out.printf("%-15d",rs.getInt("s.grade"));//2
			System.out.printf("%-12d",rs.getInt("s.studno"));//3
			System.out.printf("%-10s\t",rs.getString("m.name"));//4
			System.out.printf("%8s\n",rs.getString("p.name"));//5
		}
	}
}

java는 DB스키마의정보를 알지못한다

MetaDate로 컬럼을 조회해 컬럼명을 알아내서 다음과같이 정렬하자!

 


1-8) execute


 * ResultSet executeQuery() : select 문장 실행
 * int executeupdate() : select 문장 이외의 구문 실행(craete , insert , drop ,,,,,)
 * bollean execute() : 모든 sql문장 사용가능 
       true : 실행된구문이 select
       false : 실행구문이 select가 아닌경우

package jdbc;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

public class JdbcEx6_execute {

	public static void main(String[] args) throws ClassNotFoundException, SQLException, IOException {
		String sql = "select * from student";
		Connection conn = DBConnection.getConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		
		if(ps.execute()) {//select구문인경우 : true리턴
			
			ResultSet rs = ps.getResultSet();//ResultSet을 반환
			ResultSetMetaData rsmd = rs.getMetaData();
			for (int i = 1; i <= rsmd.getColumnCount(); i++) {
				System.out.printf("%-10s",rsmd.getColumnName(i));
			}
			System.out.println();
			while(rs.next()) {
				for (int i = 1; i <= rsmd.getColumnCount(); i++) {
					System.out.printf("%-10s",rs.getString(i));
				}
				System.out.println();
			}
		}
		
		else {//select구문 이외의 sql문장
			System.out.println("변경된 레코드 건수 : "+ps.getUpdateCount());
		}
	}
}

"select * from student"  조회 시 출력

 

String sql = "insert into test3 values(10,'동곤',now())"; 실행 시

조회

 


1-9) 예제

간략하게 코드소개

 

DBConnection클래스의 클래스멤버인 getConnection()을 사용해

DB에 접근한다 (Drivermanager Connection , Class.forName 등이있음)
Connection 객체 conn 반환

 

Scanner 를이용해 nextLine()으로 sql 문을 입력받음

 

prepareStatement(sql)로 Sql을 DB에 전달해줌

 

그 후 excute() 를 이용해 true면 select문 처리

false 면 그 외의 문장처리

 

select 의 경우 : 

metaData() 함수를 이용해 ResultSetMetaData반환

(조회된컬럼의 수 , 컬럼명 등을 조회가능)

getColumnCount() : 조회된컬럼수

getColumnName(i) : i번쨰로조회된 컬럼명

 

getResultSet()를 이용해  ResultSet 객체rs반환해

레코드를 출력할 수 있게해줌

(executeQuery()를 사용한다고생각하자)

rs.getString() 사용

rs.last() : 마지막행으로이동

rs.first() : 첫번째행으로이동

rs.beforefirst() :첫번째행 이전으로이동

 

그외의경우

getUpdateCount() 로 변경된 레코드의수를 반환

executeUpdate() 와 같다고 생각하면 될것같음!

 

package jdbc;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Scanner;

public class Test {
	
	static Connection conn() throws ClassNotFoundException, SQLException, IOException {
		Connection cc = DBConnection.getConnection();
		return cc;
	}
	
	public static void main(String[] args) throws ClassNotFoundException, SQLException, IOException {
		Scanner scan = new Scanner(System.in);
		while(true) {
			try {
				int count=0;
				System.out.print("쿼리를 입력하세요 : ");
				String sql = scan.nextLine();
				if(sql.contains("exit")) {
					System.out.println("종료");
					return;
				}
				
				PreparedStatement ps = conn().prepareStatement(sql);//sql을 DB에전달
				

				if(ps.execute()) {//select문이면 true
					startSelect(ps, sql);
					}
				else {
					int updateCount = ps.getUpdateCount();
					System.out.println("변경된 레코드의 수 : "+updateCount);
					}
				}
			catch(Exception e) {
				System.out.println("잘못된 형식");
				System.out.println(e.getMessage());
				continue;
			}
		}
	}
}

 

select부분을 처리해주는 메서드 startSelect

	static void startSelect(PreparedStatement ps , String sql) throws SQLException, ClassNotFoundException, IOException {
		PreparedStatement countp = conn().prepareStatement("select count(*)  from("+sql+")b ");
		ResultSet crs= countp.executeQuery();
		while(crs.next()) {
			System.out.println("조회된 레코드의 수 : "+crs.getInt(1));
		}//레코드 갯수 구하는법1
		
		
		ResultSetMetaData psmd = ps.getMetaData();
		ResultSet rs = ps.getResultSet();
		
		/*
		레코드의 갯수 구하는법2
		rs.last();//rs를 마지막행으로 이동
		int row = rs.getRow();//row(행)의 길이반환
		System.out.println("조회된 레코드의 수 : "+row);
		rs.beforeFirst();//첫번째 행 이전으로 돌아감 
		//첫번째행으로 돌아가면 rs.next()를 만나면 2번째행부터실행됨!!!!(주의)*/
		
		for (int i = 1; i <= psmd.getColumnCount(); i++) {
			System.out.printf("%-10s",psmd.getColumnName(i));
			//i번쨰로조회한 컬럼의 이름
		}
		System.out.println();

		while(rs.next()) {
			for (int i = 1; i <= psmd.getColumnCount(); i++) {
				System.out.printf("%-10s",rs.getString(i));//i번쨰컬럼의 레코드
			}System.out.println();
		} 
		/* 
		레코드 갯수 구하는법3
		System.out.println("레코드 수 "+count/psmd.getColumnCount()); */
		//count를 컬럼1개당 ++를 해줬다
		//레코드 수를 찾으려면 count를 컬럼의갯수(psmd.getColumnCount)로 나눠줘야함
		
	}

 

 


2) 내가만든 총 예제

 * dongtb 라는 테이블을 생성한다 ( name varchar(10) primary key , height int , weight int)
 * 생성 이후에 이름 , 키 , 몸무게를 3번 넣는다 ( 이름 중복금지)
 * 그 후 dongtb의 전체 테이블컬럼과함께 출력해본 후
 * drop 한다 (실제DB가 어지럽혀지기때문)
 

package jdbc;

import java.io.IOException;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Scanner;

public class MyEx {
	public static void main(String[] args) throws ClassNotFoundException, SQLException, IOException {
		Scanner scan = new Scanner(System.in);
		Connection conn = DBConnection.getConnection();
		String sql = "create table dongtb "
				+ " (name varchar(10) primary key ,height int , weight int)";
		PreparedStatement ps = conn.prepareStatement(sql);
		int create = ps.executeUpdate();
		System.out.println("create 성공");

		//insert문
		sql = "insert into dongtb values(?,?,?)"; 
		PreparedStatement ps2 = conn.prepareStatement(sql);
		for (int i = 0; i < 3; i++) {
			try {
				System.out.print("이름  : ");
				String name = scan.nextLine();
				System.out.print("키 : ");
				int height = scan.nextInt();
				System.out.print("몸무게  : ");
				int weight = scan.nextInt();
				scan.nextLine(); 
				//\n을 지우기위한 수단 ( nextInt는 \n이사라지지않아  nextLine에 \n문자가 입력되버림
				ps2.setString(1, name);
				ps2.setInt(2, height);
				ps2.setInt(3, weight);
				ps2.executeUpdate(); // DB에 insert문 보내기
				}
			catch(Exception e) {
				System.out.println("오류 : "+e.getMessage());
				sql = "drop table dongtb";
				PreparedStatement ps4 = conn.prepareStatement(sql);
				ps4.executeUpdate(); //오류발생시 테이블 drop후 종료
				break;
			}
		}
		//select
		sql = "select * from dongtb";

		PreparedStatement ps3 = conn.prepareStatement(sql);
		ResultSetMetaData metaData = ps3.getMetaData();

		for (int i = 1; i <= metaData.getColumnCount(); i++) {
			//metaDate를 이용해 조회된 컬럼의 수 만큼 루프를돌린다
			System.out.printf("%-10s",metaData.getColumnName(i)); 
			//i번째 조회된 컬럼의 이름출력
		}System.out.println();

		ResultSet rs = ps3.executeQuery();//select을 저장해주는 메서드
		while(rs.next()) {
			System.out.printf("%-10s",rs.getString("name"));
			System.out.printf("%-10d",rs.getInt("height"));
			System.out.printf("%-10d\n",rs.getInt("weight"));
		}

		//drop
		sql = "drop table dongtb";
		PreparedStatement ps4 = conn.prepareStatement(sql);
		int drop = ps4.executeUpdate();
		System.out.println("drop 성공");
	}
}