본문 바로가기
front-end

[JDBC] JDBC란?

by CodeMango 2023. 2. 9.

JDBC란?

https://dyjung.tistory.com/50

 

JDBC - JDBC란?

JDBC- Java Database Connectivity- 자바에서 DB 프로그래밍을 하기 위해 사용되는 API ==> 데이터베이스 종류에 상관없다. JDBC API 사용 어플리케이션의 기본 구성 - JDBC 드라이버 : 각 DBMS에 알맞는 클라이언

dyjung.tistory.com

- 자바에서 DB 프로그래밍을 하기 위해 사용되는 API

 ==> 데이터베이스 종류에 상관없다. 오라클, MS SQL 상관없이 구동할 수 있다.

오라클이나 MS SQL에서 JDBC드라이버를 다운 받아서 JAVA언어로 쓸 수 있다.

 

JDBC 작업 순서

JDBC가 가지고 있는 기능은 없고, 실제 기능은 DRIVER가 가지고 있다.

 

1. DB접속 - Driver 클래스 로드 : 메모리상에 드라이버가 올라감

    -> Class.forName("db주소") 로 연결하기

Class.forName("com.mysql.cj.jdbc.Driver");

2. DriverManager.getConnection() 으로 연결 얻기 : db정보와 연결되고 객체가 반환된다. 

   -> Connection con = DriverManager.getConnection("주소", "계정명", "비밀번호")

Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "1234");

3. Connection 인스턴스를 이용해서 Statement 객체 생성 : 쿼리문 적용

1번 예전방식
	Statement st = con.createStatement();
2번 최신방식
	st = con.prepareStatement(sql);

4. Statement 객체의 결과를 ResultSet 이나 int에 받기 : 결과집합을 이용할 수 있는 상태가됨

   -> ResultSet rs = st.executeQuery(sql);

ResultSet rs = null;

5. rs.next();   

 

다음꺼 주세요

커서 한칸 내려가면서 첫번째 레코드가 rs에 담기게 됨.

이제 rs에 있는 값을 꺼내야함.

꺼낼 때는 컬럼 단위(속성 단위, 필드 단위)로 데이터를 꺼낼 수 있음 

 

6. String name= rs.getString("name");

String _name = rs.getString("name");

name이라는 컬럼을 갖고 있는데, name컬럼에 해당되는 값을 string으로 받아서 _name에 담는다

컬럼명 또는 컬럼번호를 적을 수 있다. 

 

삼형제 선언
Connection conn = null; //db정보 얻어오기 위해
PreparedStatement psmt = null; //쿼리문 적용하기 위해
ResultSet rs = null; //결과값 얻어오기 위해

 

접속 해제 

객체의 자원들을 역순으로 닫아준다.

rs.close();

psmt.close();

st.close();

con.close();

 

 

BOF/ EOF

Before of File --> End of File  : BOF 에서 EOF가 된다.

데이터 의 앞머리를 가리키고 있던 커서가 레코드를 다음(next)으로 전달하면서 title 컬럼에 해당되는 것을 문자열로 준다.

계속 반복하면서 데이터를 다 전달한 것을 파일의 끝 즉, EOF 라고 한다.

 

 

try catch문

참조 : https://cheershennah.tistory.com/147

try {

//예외발생할 가능성이 있는 문장 
    
}catch(Exception1 e1) {

 //Exception1이 발생했을 경우, 이를 처리하기 위한 문장적는다.
 //보통 이곳에 예외메세지를 출력하고 로그로 남김.
 
}catch(Exception2 e2) {

 //Exception2이 발생했을 경우, 이를 처리하지 위한 문장적는다.
 
}catch(ExceptionN eN) {

 //ExceptionN이 발생했을 경우, 이를 처리하지 위한 문장적는다.
 
}finally{

//예외발생여부에 관계없이 상항 수행되어야 하는 문장적는다.

}

*finally 블록은 어떤 경우에 사용할까?

 보통은 자원이나 DB에 커넥션 한 경우, 파일 닫기, 연결 닫기(close) 등과 같은 "정리"코드를 넣는 데 사용된다.

 

 

 

내 아이디 아는법

 

명령프롬포트 - idconfig 검색 - IPv4 주소 보기

 

JDBC 사용방법

JDBC 란 자바에서 제공하는 데이터베이스와 연결하여 데이터를 주고 받을 수 있도록 하는 인터페이스입니다.

JDBC를 사용하는 방법은 어떤 데이터베이스를 사용하던지 같습니다. 방법은 간략하게 다음과 같습니다.

  1. Class.forName() 을 이용해서 드라이버 로드
  2. DriverManager.getConnection() 으로 연결 얻기
  3. Connection 인스턴스를 이용해서 Statement 객체 생성
  4. Statement 객체의 결과를 ResultSet 이나 int에 받기

 

1. JDBC 작업의 일반적인 순서

참조 : https://limdevbasic.tistory.com/26

JDBC를 사용하여 DB에 접근하는 일반적인 순서는 다음과 같습니다.

1. Driver 클래스 로드

2. DB 연결을 위한 Connection 객체 생성

3. SQL을 담는 Statement 또는 PreparedStatement 객체 생성

4. SQL 실행

5. 리소스 정리

 

예제코드

// 1. Driver 클래스 로드
Class.forName("com.mysql.cj.jdbc.Driver");

// 2. DB 연결을 위한 Connection 객체 생성
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/...");

// 3. SQL을 담는 PreparedStatement 객체 생성
PreparedStatement preparedStatement = connection.prepareStatement(
"INSERT into user(id, name, password) values(?,?,?)"
);
preparedStatement.setLong(1, 1);
preparedStatement.setString(2, "name");
preparedStatement.setString(3, "password");

// 4. SQL 실행
preparedStatement.executeUpdate();

// 5. 리소스 정리
preparedStatement.close();
connection.close();

 

 

 

 

JDBC 프로그래밍에 사용하는 객체

참조 : https://programmingyoon.tistory.com/53

 

JDBC ! JDBC에서 사용하는 객체 ( DriverManager, Connection, Statment, PrepareStatement, CallableStatement, ResultSet )

JDBC 프로그래밍에 사용하는 객체 1. DriverManagerr 클래스 - DriverManager 클래스는 데이터 원본에 JDBC 드라이버를 통하여 커넥션을 만드는 역할을 한다. Class.forName() 메소드를 통해서 생성되는데, 이 메

programmingyoon.tistory.com

 

1. forName

https://kyun2.tistory.com/23

 

[Java 궁금증] Class.forName()은 어떻게 동작할까?

JDBC 란 자바에서 제공하는 데이터베이스와 연결하여 데이터를 주고 받을 수 있도록 하는 인터페이스입니다.JDBC를 사용하는 방법은 어떤 데이터베이스를 사용하던지 같습니다. 방법은 간략하게

kyun2.tistory.com

https://limdevbasic.tistory.com/26

 

[Java] JDBC에서 Class.forName과 클래스 로딩에 대해 알아보기

지난 포스팅에서 Java Reflection에 대해 다뤘습니다. JDBC를 사용할 때 쓰이는 Class.forName 역시 Java Reflection에서 제공하는 기능 중에 하나입니다. JDBC 를 사용하여 DB에 접근하기 위해서는 제일 먼저 드

limdevbasic.tistory.com

JDBC를 사용할 때 쓰이는 Class.forName 역시 Java Reflection에서 제공하는 기능 중에 하나입니다. JDBC 를 사용하여 DB에 접근하기 위해서는 제일 먼저 드라이버 클래스를 로드해야 하는데, 그 때 Class.forName을 사용합니다. 이번 포스팅에서는 드라이버를 로드할 때 Class.forName이 어떻게 활용되는지 알아보겠습니다.

 

MySQL DBMS를 사용한다고 가정할 때, 맨 처음에 Driver 클래스를 로드하기 위해 Class.forName 메소드를 활용합니다.

Class.forName("com.mysql.cj.jdbc.Driver");

 

2. DriverManager 클래스

- DriverManager 클래스는 데이터 원본에 JDBC 드라이버를 통하여 커넥션을 만드는 역할을 합니다

Class.forName() 메소드를 통해서 생성되는데, 이 메소드는 인터페이스 드라이버를 구현하는 작업입니다

 

Class.forName("oracle.jdbc.driver.OracleDriver") 처럼 특정 클래스를 로딩하면 자동으로 객체가 생성되고

DriverManager에 등록됩니다.

드라이버 클래스를 찾지 못할 경우 forName() 메소드는 ClassNotFoundException 예외를 발생시키므로,

반드시 예외처리를 해야 합니다.

 

- 드라이버 클래스들은 로드될 때 자신의 인스턴스를 생성하고, 자동적으로 DriverManager 클래스 메소드를 호출하여 인스턴스를 등록합니다.

DriverManager 클래스의 모든 메소드는 static 이기 때문에 반드시 객체를 생성시킬 필요가 없습니다.

DriverManager 클래스는 Connection 인터페이스의 구현 객체를 생성하는데 getConnection() 메소드를 사용합니다.

 

3. createStatement

데이터베이스로 SQL 문을 보내기 위한 SQLServerStatement 개체를 만듭니다.

 

4. Execute

참조 : https://mozi.tistory.com/26

참조 : https://lelecoder.com/2

 

1. 수행결과로 Boolean 타입의 값을 반환합니다.

2. 모든 구문을 수행할 수 있습니다.

 

execute 함수를 사용하는 방법입니다.

  -> 리턴값이 ResultSet 일 경우에는 true, 이 외의 경우에는 false 로 출력됩니다.

  -> 리턴값이 ResultSet 이라고 하여 ResultSet 객체에 결과값을 담을 수 없습니다.

 

5. ExecuteQuery

 

1. 수행결과로 ResultSet 객체의 값을 반환합니다.

2. SELECT 구문을 수행할 때 사용되는 함수입니다.

 

executeQuery 함수를 사용하는 방법입니다.

 -> ResultSet 객체에 결과값을 담을 수 있습니다.

 

6. ExecuteUpdate

 

데이터베이스에서 데이터를 추가(Insert), 삭제(Delete), 수정(Update)하는 SQL 문을 실행합니다. 메서드의 반환 값은 해당 SQL 문 실행에 영향을 받는 행 수를 반환합니다.

 

1. 수행결과로 Int 타입의 값을 반환합니다.

2. SELECT 구문을 제외한 다른 구문을 수행할 때 사용되는 함수입니다.

 

executeUpdate 함수를 사용하는 방법입니다.

 -> INSERT / DELETE / UPDATE 관련 구문에서는 반영된 레코드의 건수를 반환합니다.

 -> CREATE / DROP 관련 구문에서는 -1 을 반환합니다.

 

7. ResultSet 인터페이스

ResultSet은 SELECT문의 결과를 저장하는 객체입니다.

 

- SQL 문에서 SELECT 문을 사용한 질의의 경우 성공 시 결과물로 ResultSet을 반환합니다.

ResultSet 은 SQL 질의에 의해 생성된 테이블을 담고 있다. 또한 ResultSet 객체는 '커서(cursor)' 라고 불리는 것을 가지고 있는데, 그것으로 ResultSet에서 특정 행에 대한 참조를 조작할 수있습니다.

 

- 커서는 초기에 첫번째 행의 직전을 가리키도록 되어 있는데, ResultSet 객체의 next() 메소드를 사용하면 다음 위치로 커서를 옮길 수 있습니다.

메소드 설명
first() 커서를 첫번째 행으로 옮긴다.
last() 커서를 마지막 행으로 옮긴다.
beforeFirst() 커서를 첫번째 행 이전으로 옮긴다.
afterLast() 커서를 마지막 행 다음으로 옮긴다.
next() 커서를 다음 행으로 옮긴다.
previous() 커서를 이전 행으로 옮긴다.

 

- ResultSet에서 행을 처리하는데 반복문을 사용하며 next() 메소드가 유효한 행이 있으면 true, 없으면 false를 리턴하는 것을 이용하여 while 으로 제어할 수 있다.

 

1
2
3
4
while(rs.next()){
        String name = getString("해당 컬럼명");
        String id = getString("해당 컬럼명");
}

 

- ResultSet 객체에서 현재 행에서 필드명 혹은 레코드셋에서의 위치를 통해서 어떤 필드의 값을 가져올 수 있는데, 때 getXxxx() 메소드를 제공한다.

 

- 해당 필드의 데이터 타입이 문자열이면 getString()이 되고, 해당 필드의 데이터 타입이 int이면 getInt()가 된다.

 

메소드
getString("해당 컬럼명") getDate("해당 컬럼명") getBytes("해당 컬럼명") getDouble("해당 컬럼명")
getInt("해당 컬럼명") getTimestamp("해당 컬럼명") getObject("해당 컬럼명") getLong("해당 컬럼명")

 

 

 

 

 

 

 


JDBC 는 최신 방식이 있고 예전 방식이 있다.

예전 방식 예제

 

DBCConnectionTest.java

package main;

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

public class DBConnectionTest {
// 옛날방식	
	
//1. 이 드라이브가 있는지 한번 확인
	public void initConnection() {		
		try {
	// Class.forname : Driver 클래스 로드
	// 클래스는 mysql-connector 자료파일을 lib에 추가해야 나옴
			Class.forName("com.mysql.cj.jdbc.Driver"); // 현재 이 클래스가 있느냐 없느냐
			System.out.println("Driver Loading Success"); // 클래스를 찾으면 나옴
		} catch (ClassNotFoundException e) {			
			System.out.println("DB Driver를 찾지 못했습니다"); // 클래스가 없으면
			e.printStackTrace();
		}		
	}
	 // return값이 void가 아니라 Connection 형태	
	
//2. db에 대한 커넥션 정보를 수시로 얻어옴
	public Connection getConnection() {
		Connection conn = null;		//conn = 멤버변수
		try {
			
	//DriverManager 클래스 : 데이터 원본에 JDBC 드라이버를 통하여 커넥션을 만드는 역할
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "1234");
											// 1. db서버 데이타					2.계정명	  3.비밀번호
			System.out.println("Connection Success");			
		} catch (SQLException e) {			
			System.out.println("db을 연결하지 못했습니다");
			e.printStackTrace();
		}	
		return conn; 
		}
	
	// return값 : int
	public int insert(String id, String name, int age) {
		
	//sql 쿼리문 작성 -> 맨 끝에는 한칸 띄고 " 쳐야한다.
		String sql = " insert into user(id, name, age, joindate) "
				+ "    values('" + id + "', '" + name + "', " + age + ", now()) ";
							//문자열에는 앞뒤로 '' 집어넣어야 DB에 들어간다.
		
	// Connection: 접속정보 / 현재 getConnection이 접속정보 가지고 있음
		Connection conn = getConnection();
		Statement psmt = null; //Statement-java.sql 추가
		int count = 0;  
		
		try {
	//createStatement : 순방향으로만 이동 (테이블 레코드 순대로 읽음)
	//연결된 정보 conn을 통해서 생성해줌
			psmt = conn.createStatement();	// 접속 초기화
	
			count = psmt.executeUpdate(sql); // sql 실행
			
			System.out.println("db에 데이터 추가 성공!");
			
		} catch (SQLException e) {			
			e.printStackTrace();
	
// db서버는 생성된 걸 다 닫아줘야한다.
		} finally {
			
	//접속해제		
			try {
				if(conn != null) {	// db의 후처리
					conn.close();
				}
				if(psmt != null) {
					psmt.close();
				}
			} catch (SQLException e) {				
				e.printStackTrace();
			}			
}// finally end 
				
		return count;
	}
}

 

MainClass.java

package main;

public class MainClass {
	public static void main(String[] args) {
		/*
			JDBC Java DataBase Connectivity		
		*/
		
		DBConnectionTest dbtext = new DBConnectionTest();
		dbtext.initConnection();
		
// id, 이름, 나이 필요함, joindate는 쿼리문에서 now로 설정했으니까 여기에 안 써도됨
		
		String id = "abc";
		String name = "성춘향";
		int age = 16;
		
		int count = dbtext.insert(id, name, age);
		if(count > 0) {
			System.out.println("추가되었습니다");
		}
		
	}
}

MySQL Workbench

use mydb;

select * from emp;

create table user(
	id varchar(30),
    name varchar(50),
    age int,
    joindate date
);

insert into user(id, name, age, joindate)
values('abc', '홍길동', 24, now());

select * 
from user;
-- where id = 'abc';

set sql_safe_updates = 0;

update user
set age = 22, id = 'bcd'
where name = '홍길동';

delete from user
where id = 'bcd';

drop table user;

create table user(
	id varchar(30),
    name varchar(50),
    age int,
    joindate date
    );
    
-- 외부접속 허용 - 모든 root /  비번 1234
create user 'root'@'%' identified by '1234';


-- grant : 권한설정		/ 외부의 어떤 아이디든 접속 허용하겠다
grant all privileges on *.* to 'root'@'%' with grant option;
flush privileges

JDBC 실전 예제 (최신방식)

MainClass.java  : 실행 화면

    package main;

import java.util.List;

import db.DBConnection;
import dto.User;
import jdbc.JdbcTest;

public class MainClass {
	public static void main(String[] args) {
		DBConnection.initConnection();
	// 객체 생성할 필요 없이 부를 수 있다. initConnection이 static 객체니까!				
		
	//JdbcTest 클래스 생성으로 준비하기					
	
		
		JdbcTest jt = new JdbcTest();
		
		/*
		String id = "aabbcc";
		String name = "이찬성";
		int age = 35;
		
		boolean b = jt.insert(id, name, age);
		if(b == true) {
			System.out.println("정상적으로 추가되었습니다");
		}
		*/
		
		String id = "aabbcc";
		
	//jdbcTest로부터 user를 넘겨받는다.	
		User user = jt.search(id);
		if(user != null) {	//user에 데이터 있을때
			System.out.println(user.toString());
		}else {
			System.out.println("해당하는 정보를 찾을 수 없습니다");
		}
		
		
		List<User> list = jt.select();
		
// jdbcTest로부터 List 를 넘겨받는다.
// foreach문 : list에 있는걸 하나씩 User 객체로 넘겨받음
		for(User u : list) {
			System.out.println(u.toString());
		}
		/*
//for 쓸 경우 (같은 결과값)
		for(int i = 0;i < list.size(); i++) {
			User u = list.get(i);
			
		}
		*/
				
		id = "aabbcc";
		String name = "이재범";
		int age = 27;
//update 호출		
		boolean b1 = jt.update(id, name, age);
		if(b1 == true) {
			System.out.println("정상적으로 수정되었습니다");
		}
	
	}
}

db- DBConnection.java : 데이터 연결 화면

    package db;

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

public class DBConnection {
// 이 창은 드라이버를 확인하고 커넥션되는 정보를 얻기 위한 창
	
//이 드라이브가 있는지 한번 확인
	//언제든지 부를 수 있도록 static으로 만들어놓음	
	public static void initConnection() {
		try {
/*1번*/	Class.forName("com.mysql.cj.jdbc.Driver");
			System.out.println("Driver Loading Success");
		} catch (ClassNotFoundException e) {			
			System.out.println("DB Driver를 찾지 못했습니다");
			e.printStackTrace();
		}
	}
// db에 대한 커넥션 정보를 수시로 얻어옴
	//언제든지 부를 수 있도록 static으로 만들어놓음	
/*2번*/	public static Connection getConnection() {
		Connection conn = null;		
		try {
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "1234");
			System.out.println("Connection Success");			
		} catch (SQLException e) {			
			System.out.println("db을 연결하지 못했습니다");
			e.printStackTrace();
		}	
		return conn;
	}
	// 접속해제는 DBClose파일에 따로 만들기	
	
}// DBConnection end

 

JdbcTest.java :  JDBC 함수 구현 화면

    package jdbc;

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

import db.DBClose;
import db.DBConnection;
import dto.User;

public class JdbcTest {
// 최신방식
	
// insert delete select update 구현하는 화면

//insert -> db가 바뀜
	public boolean insert(String id, String name, int age) { //추가됐으면 true나옴

	//sql쿼리문 (JDBCtest-DBConnectionTest과 다른 방법)		
		String sql = " insert into user(id, name, age, joindate) "
				+ "    values(?, ?, ?, now()) ";
		
//커넥션 정보 얻어오기(DB정보)	
		
	//Connection 정보 얻어오는걸 잠깐 보류 (null)
		Connection conn = null;
		
	//Statement에서 발전된 PreparedStatement
		PreparedStatement psmt = null;
		
		int count = 0; // boolean 리턴인데 왜 int? : return에서 이용하는 변수니까
		
	//DBConnection 파일로부터 커넥션 정보 얻어오기	
		try {
			conn = DBConnection.getConnection();		
			
			// sql 문장을 prepareStatement에 집어넣는다.				
/*3번*/			psmt = conn.prepareStatement(sql);

	// ? 에 집어넣기 위해 set 만든다.
			//db는 1번지부터 시작
			psmt.setString(1, id);  //setString(count, sql);
			psmt.setString(2, name);
			psmt.setInt(3, age);
			
	// executeUpdate: 해당 SQL 문 실행에 영향을 받는 행 수를 반환 , 리턴값: integer
			count = psmt.executeUpdate();
			
			System.out.println("성공적으로 추가되었습니다");
			
	//SQLException 부적합한 열 인덱스 오류		
		} catch (SQLException e) {	
			System.out.println("추가되지 않았습니다");
			e.printStackTrace();
			
	//finally : 예외 발생 여부에 관계없이 상항 수행되어야 하는 문장적는다.
		} finally {
			DBClose.close(conn, psmt, null);
	//	DBClose.close(conn, psmt, resultset); -> insert,delete,update에선 resultset 사용 안 한다
		}
		
		return count>0?true:false;		// 0보다 크면 true 반환 (리턴값 boolean이니까)
		//삼항연산자 : 참이면 true 리턴, 거짓이면 false리턴
	}
	
//delete -> db가 바뀜
	
	
	
//select -> 검색: db가 안 바뀌므로 db에 영향 안줌
	//Q. 1개(object)의 데이터를 가져와라
	//User : 리턴값으로 데이터 1개만 내보내는것
	//쿼리문에서 " 앞뒤로 띄어쓰기 해야함
	public User search(String id) {  // id로 찾는다
		
		String sql = " select id, name, age, joindate  " //모든 컬럼이니까 select * 라고 적어도됨
				+ "    from user "
				+ "    where id = ? ";
		//Connection 정보 얻어오는걸 잠깐 보류 (null)
		Connection conn = null;
		//Statement에서 발전된 PreparedStatement
		PreparedStatement psmt = null;
		
		//insert delete update 에서는 executeUpdate를 쓰지만, select는 결과값이 있으므로 ResultSet을 사용한다.
		ResultSet rs = null;
		
	// return해야되는 것 User , 객체 하나만 준비
		User user = null;
		
	//DBConnection 파일로부터 커넥션 정보 얻어오기
		try {
			conn = DBConnection.getConnection();
			
	// sql 문장을 prepareStatement에 집어넣는다.
/*3번*/		psmt = conn.prepareStatement(sql);

	// ? 에 집어넣기 위해 set 만든다.
			psmt.setString(1, id); //위 String sql에서 id가 매개변수로 들어와서 id를 넣어줌
			
		// executeQuery : Statement 객체의 결과를 rs에 받기 -select만 Query를 쓴다.		
/*4번*/		rs = psmt.executeQuery();
			

/*5번 rs.next*/
		//데이터 하나 : 조건문 -> id가 있을 수도 있고 없을 수도 있으므로 조건문 쓴다.
			if(rs.next()) { //rs의 결과값이 있다면 true/아니면 false
								//id를 집어넣어주고 상응하는 데이터를 찾았을 때
/*6번 id컬럼의 해당값 주세요 */
				//id컬럼에 해당되는 값을 String으로 받아서 _id에 넣는다
				String _id = rs.getString("id"); // =getString(1)
				String _name = rs.getString("name");
				int _age = rs.getInt("age");
				String _joindate = rs.getString("joindate");
				
			// 생성되면서 4개 칼럼의 데이터 들어가면서 인스턴스가 할당됨
				user = new User(_id, _name, _age, _joindate);
			}			
			
	//SQLException 부적합한 열 인덱스 오류
		} catch (SQLException e) {
	
			e.printStackTrace();
		} finally {
			DBClose.close(conn, psmt, rs); //3가지를 해방시킨다.
		}
		
		return user; // 데이터 없었으면 user의 초기값 null 이 나오게됨
					// 데이터가 있다면 객체가 return돼서 넘어간다.
	}
	
	// 다수의 데이터를 취득
	// 다수니까 List로 잡고 <User>안에 있는 데이타 불러오기
	public List<User> select() {
		
		//user테이블에서 전체 데이타 가져오기
		String sql = " select id, name, age, joindate "
				+ "    from user "; 
	//삼형제 선언	
		Connection conn = null;			//db정보 얻어오기 위해
		PreparedStatement psmt = null;	//쿼리문 적용하기 위해
		ResultSet rs = null;			//결과값 얻어오기 위해
		
	// 리턴 해줄 list 객체 생성 : 데이터 하나도 없더라도 객체 생성해서 준비해놔야함.
		List<User> list = new ArrayList<User>();
				
		
		try {		
				
	//DBConnection 파일로부터 커넥션 정보 얻어오기
			conn = DBConnection.getConnection();
	// sql 문장을 prepareStatement에 집어넣는다.		
			psmt = conn.prepareStatement(sql);
	// executeQuery : Statement 객체의 결과를 rs에 받기 -select만 Query를 쓴다.	
			rs = psmt.executeQuery();
	
	// 데이터 다수 : while문
	// 위에선 데이타 하나밖에 없으니까 if문으로 불러왔음 (하나가 있느냐 없느냐)
			while(rs.next()) { //next : 참일때 그다음, 참일때 그다음
				String _id = rs.getString(1);		//id
				String _name = rs.getString(2);		//name
				int _age = rs.getInt(3);			//age
				String _joindate = rs.getString(4);
				
	//생성
				User user = new User(_id, _name, _age, _joindate);
	//list에 추가하기 (while문 안이니까 모든 데이타가 담김)			
				list.add(user);
		} // while end			
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			DBClose.close(conn, psmt, rs);
		}
		return list;
	}

	
//update -> db가 바뀜
	//update의 리턴값은 boolean
	public boolean update(String id, String name, int age) {
		
		String sql = " update user "
				+ "    set name=?, age=? "	//name과 age를 바꾸겠다.
				+ "    where id=? ";
		
		//Connection 정보 얻어오는걸 잠깐 보류 (null)
		Connection conn = null;
		//Statement에서 발전된 PreparedStatement
		PreparedStatement psmt = null;
		
		//return에 이용할 count 선언
		int count = 0;  
		
		//DBConnection 파일로부터 커넥션 정보 얻어오기			
		try {
			conn = DBConnection.getConnection();
			// sql 문장을 prepareStatement에 집어넣는다.			
			psmt = conn.prepareStatement(sql);
			psmt.setString(1, name);	// setString(count, sql);
			psmt.setInt(2, age);
			psmt.setString(3, id);
			
			// executeUpdate: 해당 SQL 문 실행에 영향을 받는 행 수를 반환 , 리턴값: integer
			count = psmt.executeUpdate();						
			
		} catch (SQLException e) {			
			e.printStackTrace();
		} finally {
			DBClose.close(conn, psmt, null);
		}
		
		return count>0?true:false; // 0보다 크면 true 반환 (리턴값 boolean이니까)
	}
}

db- DBClose.java : Close 화면

    package db;

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

public class DBClose {
	
	public static void close(Connection conn, Statement psmt, ResultSet rs) {
		try {
			if(conn != null) {	// db의 후처리
				conn.close();
			}
			if(psmt != null) {
				psmt.close();
			}
			if(rs != null) {
				rs.close();
			}
	//SQLException 부적합한 열 인덱스 오류
		} catch (SQLException e) {	// ResultSet	
			e.printStackTrace();
		}
	}
}

User.java : dto 화면

package dto;

import java.io.Serializable;

public class User implements Serializable{
	
	private String id;
	private String name;
	private int age;
	private String joindate;
	
	public User() {
	}

	public User(String id, String name, int age, String joindate) {
		this.id = id;
		this.name = name;
		this.age = age;
		this.joindate = joindate;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getJoindate() {
		return joindate;
	}

	public void setJoindate(String joindate) {
		this.joindate = joindate;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", age=" + age + ", joindate=" + joindate + "]";
	}

}

 

'front-end' 카테고리의 다른 글

JSTL 개념, 라이브러리 종류  (0) 2023.03.20
[bootstrap] 부트스트랩 사용법  (0) 2023.02.22
[Ajax] Ajax 비동기방식 개념  (0) 2023.02.08
[JSP] JSP의 개념  (0) 2023.02.08
[servlet] servlet 개념 알기, GET/POST, Session  (0) 2023.02.06

댓글