BoostCourse | JDBC

judyzero·2025년 1월 29일

BoostCourse

목록 보기
1/7

JDBC란?

Java Datebase Connectivity의 줄임말이다.

  • java를 이용해서 DB로부터 정보를 조회하는 방법이다.
  • 웹을 실행할 때, java와 DB의 다리 역할을 한다.

JDBC를 이용한 프로그래밍 방법은 아래와 같다.

  1. import java.sql.*;
  2. 드라이버 로드하기
  3. Connection 객체 생성하기
  4. Statement 객체를 생성 및 질의 수행하기
  5. SQL문에 결과물이 있다면 ResultSet 객체를 생성하기
  6. 모든 객체 닫기

DriverManager

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

Connection

String dburl = @url
Connection con = DriverManager.getConnection(dburl, ID, PWD)

Statement

실제 쿼리를 작성할 때 사용한다.
Statement stmt = con.createStatement()
ResultSet rs = stmt.executeQuery("select no from user")

stmt.execute("query") : any SQL
stmt.executeQuery("query") : SELECT
stmt.executeUpdate("quere") : INSERT, UPDATE, DELETE

ResultSet

DB에서 결과값을 받아오면 된다.

ResultSet rs = stmt.executeQuery("select no from user")
while(rs.next())
	System.out.println(rs.getInt("no"))

JDBC실습 (1)

이번에는 JDBC를 이용해 DB에서 CRUD를 하는 프로그램을 만들어보자.
이번 프로젝트는 순수 java를 이용하는 프로젝트로, maven을 사용한다.

cd /usr/local/mysql/bin
./mysql -u root -p 해당 명령어로 mysql 서버를 켰다.

CREATE USER 'connectuser'@'%' IDENTIFIED BY 'connect123!@#';
grant all privileges on connectdb.* to connectuser@'%';
flush privileges;

위의 코드로 connectuser 계정을 생성하고 connect123!@#'로 비밀번호를 부여하였다.
이제 connectuser 계정으로 CRUD 작업을 수행할 수 있다.

1.mysql 로그인 -> 데이터베이스 선택하기
2.source <파일경로>
해당 방법으로 이미 만들어놓은 sql파일을 서버에 업로드하였다.

public class Role {
	private Integer roleId;
	private String description;

	public Role() {

	}

	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패키지 안에 Role폴더를 만들어 class에 생성자, getter, setter, toString를 만든다.
이렇게해서 Role 객체를 DB에 저장하고 불러올 수 있다.

public class RoleDao {
	private static String dburl = "jdbc:mysql://localhost:3306/connectdb";
	private static String dbUser = "connectuser";
	private static String dbpasswd = "connect123!@#";

	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;
	}
}

RoleDao를 만들었다.
여기서는 JDBC 객체를 연결해서 DB에 Role객체를 저장한다.
String sql = "SELECT description,role_id FROM role WHERE role_id = ?"; 여기서 ?는 ps.setInt(1, roleId); 를 통해 roleId 값이 들어가게 된다. 참고로, 1은 첫번재 물음표라는 의미이다.

DB에 값이 있다면, 값을 가져온다.

if (rs.next()) {
String description = rs.getString(1);
int id = rs.getInt("role_id");
role = new Role(id, description);
}

실행한 쿼리에서 값을 가져오는데 순서가 포인트이다.
String sql = "SELECT description,role_id FROM role WHERE role_id = ?";
해당 코드에서 description 다음 role_id를 작성하였다.
때문에, 가져올때도 description, role_id 순서대로 가져올 수 있다.
description을 가져올 때처럼 1,2로 작성할 수도 있고 id를 가져올 때 처럼 쿼리문에 있는 column명을 써서 가져올 수도 있다.

JDBC실습 (2)

이번에는 DB에 데이터를 넣어보겠다.

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 java.util.ArrayList;
import java.util.List;

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

public class RoleDao {
	private static String dburl = "jdbc:mysql://localhost:3306/connectdb";
	private static String dbUser = "connectuser";
	private static String dbpasswd = "connect123!@#";

	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;
	}
}

dao 패키지 안에 RoleDao class를 생성하였다.
그리고 JDBC를 연결하는데 이번에는 dto 할 때와 달리 코드가 굉장히 줄어들었다.
왜냐하면, finally 부분에서 객체를 close하는 부분이 빠졌기 때문인데 try문 안에 conn과 ps를 적게되면 자동으로 해주기 때문에 코드를 간소화할 수 있다.
이 방법을 훨씬 추천한다.

해당 코드에서도 role_id와 description의 순서에 주의하여서 Role객체 값을 DB에 저장하였다.

JDBC실습 (3)

이번에는 Role 테이블에 있는 모든 데이터를 가져오는 실습을 해보았다.

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 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;
	}
}

모든 Role 객체들을 가져올 것이기 때문에 List<Role> 를 리턴하도록 한다.
그리고 while(rs.next())를 통해 description과 id를 가져오고 Role 인스턴스를 list에 추가한다.
while(rs.next()) 는 모든 데이터를 다 돌 수 있도록 한다.

이제 다음에는 JDBC를 활용해서 명함 관리 프로그램을 만들어보자.

0개의 댓글