티스토리 뷰

1. JDBC

Java Database Connectivity의 약자이다. Java를 이용해서 데이터베이스에 접속하고 SQL을 수행하고, 결과로 얻어진 데이터의 핸들링을 제공한다. SQL문을 Java 프로그램 내에서 실행하기 위해 API를 제공해준다.


2, 환경 설정

JDBC를 사용하기 위해선 Maven에 아래와 같은 의존성을 추가하면 된다. 만약 다른 빌드 환경을 사용하고 있다면 알아서 찾아보길 바람..

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


3. JDBC를 이용한 프로그래밍

1. import java.sql.*;

2. Driver 로드

3. Connection 객체 생성

4. Statement 객체 생성 및 SQL 실행

5. ResultSet 객체 생성 및 결과 저장

6. 모든 객체를 닫는다.


[그림 1] JDBC 클래스의 생성 관계


위 그림 1은 JDBC로 SQL을 실행하고 결과를 가져오기까지 객체가 생성 및 사용되는 것을 나타낸 것이다.


4. JDBC 예제

보통 데이터를 저장할 클래스, 데이터 베이스에 직접 접근할 클래스 두가지를 만드는데, 이것을 DTO, DAO라고 부른다. 자세한 것은 이 블로그의 Web 카테고리에 정리해 놓았으니 참고바람.


[그림 2] Role Table


위 그림 2와 같은 Role이라는 이름의 테이블이 있다고 가정하자. 이 때 Role 테이블에서 얻어온 값을 저장할 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;
	}
	
	@Override
	public String toString() {
		return "Role [roleId= " + roleId + ", description= " + description + "]";
	}
}

DTO는 위와같이 테이블의 column 데이터 별로 private 멤버변수를 만들고, 그에 대한 getter, setter 함수를 정의하여 만든다. 필요하면 생성자나 다른 메소드도 추가시킨다.


DAO는 데이터베이스에 직접 연결되므로 여러가지 객체와 상수가 필요한데 아래처럼 만들 수 있다.

public class RoleDao { 
	private static String dburl = "jdbc:mysql://localhost:3306/connectdb";
	private static String dbuser = "connectuser";
	private static String dbpasswd = "connect123!@#";
	
	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 des = rs.getString(1);
					int id = rs.getInt("role_id");
					Role role = new Role(id, des);
					list.add(role);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return list;
	}
}

DAO에서 메소드 내의 Connection 객체에 항상 들어가는 상수들은 static 멤버변수로 뒀다.

getRole 함수를 보면 Class.forName 함수가 있는데, 이 함수는 Driver를 로드하는 역할을 한다. 그 후 Connection -> Statement -> ResultSet 객체를 생성하고 이용하는 순으로 동작한다.

이 때 예외처리 구문을 보면, try의 소괄호 안에 객체를 생성하는 것을 볼 수 있다. 저렇게 해놓으면 try의 scope를 나갈 때 만들어진 객체들이 모두 close 및 삭제돼서 일일이 finally에서 close할 필요가 없어진다.


또, 위 코드에서 ResultSet 객체를 이용해 getInt, getString을 사용하는 것을 볼 수 있는데, SELECT로 얻어온 테이블의 column 번호, 또는 column의 이름으로 데이터를 찾을 수 있다. rs.next()를 사용하면 다음 row의 데이터를 가리키게 된다.


마찬가지로 데이터를 테이블에 삽입할 때는 INSERT INTO role(role_id, description) VALUES ( ?, ? ); 같은 형식으로 삽입할 수 있는데, 여기서 '?'에 들어가는 값이 동적으로 매핑된다. PreparedStatement 객체의 setInt, setString과 같은 함수로 어떤 인덱스에 값을 매핑할지 지정할 수 있다.

'프로그래밍 > Mysql' 카테고리의 다른 글

Windows MySQL UTF-8 설정  (4) 2018.07.23
Mysql 설치 및 데이터베이스 생성  (0) 2018.01.23
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함