newmin
개발 이것저것
newmin
전체 방문자
오늘
어제
  • 전체 보기
    • Language
      • C
      • Java
    • Algorithm
      • Problem Solving
    • Dev
      • 개발일기장
      • Android
      • Spring
      • 회고록
    • Github
    • IDE
      • eclipse
      • visual studio 2019
    • 대외활동
      • 사피엔스4.0 대학생 서포터즈
      • 코드클럽 SW교육기부단
      • 한국대학생IT경영학회 KUSITMS

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • code club
  • 안드로이드
  • SW교육기부
  • 사피엔스4.0
  • 알고리즘
  • 이클립스에러
  • 코드클럽 SW교육기부단
  • 깃허브
  • SW교육기부단
  • 사피엔스4.0 서포터즈
  • c언어
  • 코드클럽
  • 대학생 대외활동
  • 대학생 교육기부
  • eclipse
  • 코린이
  • KB디지털멘토링
  • 자바
  • C언어기초
  • 이클립스
  • C언어알고리즘
  • 코딩
  • 중현초등학교
  • 대학생 서포터즈
  • 큐시즘
  • 백준C언어
  • 프로그래밍
  • 개발자
  • BOJ
  • 백준

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
newmin

개발 이것저것

[Back-end] JDBC Programming
Dev/Spring

[Back-end] JDBC Programming

2022. 1. 22. 18:25

JDBC (Java Database Connectivity)

- 자바를 이용한 데이터베이스 접속과 SQL 문장의 실행, 그리고 실행 결과로 얻어진 데이터의 핸들링을 제공하는 방법과 절차에 관한 규약이다.

 

- 자바 애플리케이션에서 DBMS를 연동하기 위해 JDBC API를 제공하고 있다. 

- 애플리케이션은 JDBC API를 이용함으로써 DBMS의 종류에 상관없이 동일한 방법으로 데이터베이스를 이용할 수 있다.

 

- DBMS 접속 및 이용을 위한 인터페이스와 클래스들(인터페이스를 구현한 클래스)을 포함한다.

- DBMS vendor에서 제공하는 JDBC Driver를 통해 구현된다.

 

JDBC API

다음과 같은 두 개의 package로 구성된다.

1. java.sql

https://docs.oracle.com/javase/8/docs/api/

: Data source(일반적으로 관계형 DB)에 저장된 데이터를 접근하고 처리하기 위한 API를 제공

  • Class : DariverManager
  • Interface : Connection, Statement, PreparedStatement, CallableStatement, ResultSet, DatabaseMetaData, ResultSetMetaData 등

2. javax.sql

https://docs.oracle.com/javase/8/docs/api/

: 서버에 존재하는 data source를 접근하고 이용하기 위한 API를 제공

  • interface : DataSource, XADaraSource

 

JDBC 환경 구성

-JDK 설치

-JDBC 드라이버 설치

-Maven에 다음과 같은 의존성 추가 

참고 https://maven.apache.org/

<dependency>   
  <groupId>mysql</groupId>   
       <artifactId>mysql-connector-java</artifactId>
       <version>5.1.45</version>
 </dependency>

 

JDBC API 사용 프로그래밍 방법

1. JDBC 관련 Package import

import java.sql.*;

2. JDBC Driver를 로딩 및 등록

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

3. DBMS와의 Connection 객체를 생성한다.

String dburl  = "jdbc:mysql://localhost/dbName";

Connection con =  DriverManager.getConnection ( dburl, ID, PWD );

 

4. Statement 객체를 생성 및 질의 수행

Statement stmt = con.createStatement();

5. SQL문에 결과물이 있다면 ResultSet 객체를 생성한다.

ResultSet rs = stmt.executeQuery("select no from user" );

// ResultSet을 통해 접근
while ( rs.next() )
      System.out.println( rs.getInt( "no") );
      
// 참고
stmt.execute(“query”);             //any SQL
stmt.executeQuery(“query”);     //SELECT
stmt.executeUpdate(“query”);   //INSERT, UPDATE, DELETE

 

 

6. 모든 객체를 닫는다 = 자원 반납(ResultSet, Statement, Connection)

rs.close();

stmt.close();

con.close();

 

소스코드 (SELECT)

package kr.or.connect.jdbcexam.dao;

import kr.or.connect.jdbcexam.dto.*;
import java.sql.*;

public class RoleDao {
	private static String dburl = "jdbc:mysql://localhost:3306/dbname";
	private static String dbUser = "userId";
	private static String dbpasswd = "userPwd";

	public Role getRole(Integer roleId) {
		Role role = null;
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(dburl, dbUser, dbpasswd);
			String sql = "SELECT description, role_id "
					+ "FROM ROLE "
					+ "WHERE role_id = ?";
			ps = conn.prepareStatement(sql);
			ps.setInt(1,  roleId);
			rs = ps.executeQuery();
			
			if (rs.next()) {
				String description = rs.getString(1);
				int id = rs.getInt("role_id");
				role = new Role(id, description);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if(rs != null) {
				try {
					rs.close();
				} catch(SQLException e) {
					e.printStackTrace();
				}
				
			}
			if(ps != null) {
				try {
					ps.close();
				} catch(SQLException e) {
					e.printStackTrace();
				}
			}
			if(conn != null) {
				try {
					conn.close();
				} catch(SQLException e) {
					e.printStackTrace();
				}
			}
		}
		return role;
	}
	
	public int addRole(Role role) {
		int insertCount = 0;

		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		String sql = "INSERT INTO role (role_id, description) VALUES ( ?, ? )";

		try (Connection conn = DriverManager.getConnection(dburl, dbUser, dbpasswd);
				PreparedStatement ps = conn.prepareStatement(sql)) {

			ps.setInt(1, role.getRoleId());
			ps.setString(2, role.getDescription());

			insertCount = ps.executeUpdate();

		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return insertCount;
	}
	
	public List<Role> getRoles() {
		List<Role> list = new ArrayList<>();

		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}

		String sql = "SELECT description, role_id FROM role order by role_id desc";
		try (Connection conn = DriverManager.getConnection(dburl, dbUser, dbpasswd);
				PreparedStatement ps = conn.prepareStatement(sql)) {

			try (ResultSet rs = ps.executeQuery()) {

				while (rs.next()) {
					String description = rs.getString(1);
					int id = rs.getInt("role_id");
					Role role = new Role(id, description);
					list.add(role); // list에 반복할때마다 Role인스턴스를 생성하여 list에 추가한다.
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return list;
	}
	public int deleteRole(Integer roleId) {
		int deleteCount = 0;
		
		Connection conn = null;
		PreparedStatement ps = null;
		
		try {
			Class.forName( "com.mysql.jdbc.Driver" );
			
			conn = DriverManager.getConnection ( dburl, dbUser, dbpasswd );
			
			String sql = "DELETE FROM role WHERE role_id = ?";

			ps = conn.prepareStatement(sql);
			
			ps.setInt(1,  roleId);

			deleteCount = ps.executeUpdate();

		}catch(Exception ex) {
			ex.printStackTrace();
		}finally {
			if(ps != null) {
				try {
					ps.close();
				}catch(Exception ex) {}
			} // if
			
			if(conn != null) {
				try {
					conn.close();
				}catch(Exception ex) {}
			} // if
		} // finally

		return deleteCount;
	}
	
	public int updateRole(Role role) {
		int updateCount = 0;
		
		
		Connection conn = null;
		PreparedStatement ps = null;
		
		try {
			Class.forName( "com.mysql.jdbc.Driver" );
			
			conn = DriverManager.getConnection ( dburl, dbUser, dbpasswd );
			
			String sql = "update role set description = ? where role_id = ?";
			
			ps = conn.prepareStatement(sql);
			
			ps.setString(1, role.getDescription());
			ps.setInt(2,  role.getRoleId());
			
			updateCount = ps.executeUpdate();

		}catch(Exception ex) {
			ex.printStackTrace();
		}finally {
			if(ps != null) {
				try {
					ps.close();
				}catch(Exception ex) {}
			} // if
			
			if(conn != null) {
				try {
					conn.close();
				}catch(Exception ex) {}
			} // if
		} // finally
		
		return updateCount;
	}
}

 

 

참고

www.boostcourse.org/web326

 

웹 백엔드

부스트코스 무료 강의

www.boostcourse.org

 

'Dev > Spring' 카테고리의 다른 글

[Spring Boot] Heroku 서버 배포하기  (0) 2022.05.18
[Spring Boot] CORS 설정 시 addCorsMappings 에러 해결  (0) 2022.05.03
[Spring boot] JPA 카멜 표기법으로 이름 설정하기  (0) 2022.04.08
[Spring boot] 404 Not Found 에러 해결 - 경로  (0) 2022.04.08
[Spring] Maven이란?  (0) 2022.02.08
    'Dev/Spring' 카테고리의 다른 글
    • [Spring Boot] CORS 설정 시 addCorsMappings 에러 해결
    • [Spring boot] JPA 카멜 표기법으로 이름 설정하기
    • [Spring boot] 404 Not Found 에러 해결 - 경로
    • [Spring] Maven이란?
    newmin
    newmin
    매일 작심삼일로 작심일년

    티스토리툴바