JDBC, MySQL 연동 1 - 기본구조와 연동

JOY·2021년 12월 10일
0
post-thumbnail

📌 JDBC, MySQL 연동 1 - 기본구조와 연동


1. JDBC 기본 구조


2. MySQL 연동

RoleDao.java - getRole()

📍 RoleDao.java는 MySQL과 Role.java 클래스를 이용하여 데이터를 처리하는 클래스 이다.

1. JDBC 드라이버 로딩

  • JDBC API 사용을 위해 Class.forName 메서드를 이용하여 JDBC 드라이버 로딩
  • DB 마다 클래스 이름이 다르므로 해당 DB 이름을 정확하게 넣어야 한다.
Class.forName("com.mysql.jdbc.Driver");

📍 Oracle DB 사용시 "oracle.jdbc.driver.OracleDriver"

2. 데이터베이스 연결

private static String dburl = "jdbc:mysql://localhost:3306/connectdb1?serverTimezone=Asia/Seoul&useSSL=false";
private static String dbUser = "connectuser";
private static String dbpasswd = "비밀번호";
  • dburl : 접속 url, //ip:포트번호/사용id
    👉 MySQL의 기본 포트번호는 3306 이다.
  • dbUser : 사용할 유저 아이디
  • dbpasswd = 유저 비밀번호

📍 Oracle DB 사용시
url 부분 : "jdbc:oracle:thin:@localhost:1521:xe"
@ip:포트번호:xe
👉 Oracle의 기본 포트번호는 1521 이다.

  • 데이터베이스 연결 설정
//드라이버 로딩
Class.forName("com.mysql.jdbc.Driver");
//커넥션 객체
conn = DriverManager.getConnection(dburl, dbUser, dbpasswd);

3. SQL문 작성

PreparedStatement ps = null; //객체 생성

String sql = "SELECT description,role_id FROM role WHERE role_id = ?";
ps = conn.prepareStatement(sql);
ps.setInt(1, roleId);
rs = ps.executeQuery(); //명렁어 실행
  • PreparedStatement 에서는 필요한 변수를 ? 로 표시하여 사용
  • ? 파라미터 값에 setInt를 이용하여 roleId 매핑
if(rs.next()) {
	String description = rs.getString(1);
	int id = rs.getInt("role_id");
	role = new Role(id, description);				
}
  • rs.next() : 데이터 존재 여부 확인
    결과값이 있다면 첫번째 레코드에 가서 true 리턴
    결과값이 있다면 false 리턴

  • 컬럼의 데이터 타입에 맞춰 컬럼 순서 or 컬럼명 입력

4. SQL문 처리명령

  1. executeQuery
    select 명령문에서 사용
    반환값 : ResultSet 클래스의 인스턴스로 반환

  2. executeUpdate
    insert, update, delete 명령문에서 사용
    반환값 : int

5. 연결 해제

rs.close();
ps.close();
conn.close();


📕 전체 코드

RoleDao.java

package kr.or.connect.jdbcexam.dao;

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

import kr.or.connect.jdbcexam.dto.Role;

public class RoleDao {
	
	private static String dburl = "jdbc:mysql://localhost:3306/connectdb1?serverTimezone=Asia/Seoul&useSSL=false";
	private static String dbUser = "connectuser";
	private static String dbpasswd = "";
	

	
	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();
				}
			}
		}//연결한 부분 닫아주기 finally는 반드시 수행되다.
		
		//ex) ps에서 수행하다 예외 발생시
		//rs는 null인 상태일 때 rs. 수행되면  
		//nullpointerexception이 수행되기 때문에 예외처리
		
		return role;
	}

}

Role.java

package kr.or.connect.jdbcexam.dto;

public class Role {
	private Integer roleId;
	private String description;
	
	//자바에서 필드명은 항상 소문자로 시작,
	//단어 두개이상 연결될 때는 두번쨰 단어의 첫글자를 대문자
	//--> 카멜 표기법
	
	public Role(Integer roleId, String description) {
		super();
		this.roleId = roleId;
		this.description = description;
	}	
	
	public Integer getRoleId() {
		return roleId;
	}
	public void setRoleId(Integer roleId) {
		this.roleId = roleId;
	}
	public String getDescription() {
		return description;
	}
	public void setDescription(String description) {
		this.description = description;
	}
	
	//Role에 들어있는 값들을 편하게 출력할 목적으로 toString() 메서드를 오버라이딩
	@Override
	public String toString() {
		return "Role [roleId=" + roleId + ", description=" + description + "]";
	}
}

profile
Just Do IT ------- 🏃‍♀️

0개의 댓글