
Maven Repository에서 mysql-connector-java.jar 받기
lib 폴더 만들어서 JAR 넣기
Build Path 설정
Project 우클릭 > Build Path > Configure Build Path > Libraries탭
(1) Classpath에 jar 직접 추가 방법
Classpath 항목 선택
➕ Add JARs...또는Add External JARs...클릭
lib/mysql-connector-java.jar선택
Apply and Close
(2) User Library로 등록해서 재사용하고 싶다면? ✅
Add Library→User Library선택 →Next
New...클릭 → 이름 : lib
➕ Add JARs...눌러서lib/mysql-connector-java.jar찾아 추가
확인 → 프로젝트에 이 라이브러리 연결
| 구분 | 메서드 | 설명 |
|---|---|---|
| DDL, DML | executeUpdate() | 데이터 변경 계열 쿼리 실행 (리턴: 변경된 행 수 int) |
| SELECT | executeQuery() | 데이터 조회 쿼리 실행 (리턴: ResultSet) |
- DML=insert, update, delete
- DDL=create, drop, alter
SELECT 쿼리 결과를 행(Row) 단위로 저장해주는 객체
JDBC에서 executeQuery() 메서드를 실행하면 이 ResultSet을 반환해줌
ResultSet rs = null;
rs.next();
// DB 접속 성공 후
String sql = "SELECT * FROM emp"; // emp 테이블 전체 조회
pstmt = con.prepareStatement(sql); // 쿼리 준비
rs = pstmt.executeQuery(); // SELECT문 실행 → 결과 집합(ResultSet) 반환
// ResultSet 초기 커서 위치는 첫 번째 행 "이전"
while(rs.next()) { // 커서를 한 줄씩 아래로 이동하며 반복
// 현재 커서가 가리키는 행에서 각 컬럼 값 추출
String ename = rs.getString("ename");
int sal = rs.getInt("sal");
String job = rs.getString("job");
String hiredate = rs.getString("hiredate");
// 결과 출력
System.out.println("ename = " + ename
+ ", sal = " + sal
+ ", job = " + job
+ ", hiredate = " + hiredate);
MySQL에서 유저 생성하기
mysql -h localhost -u root -p show databases; use mysql; -- 각 유저 테이벌의 정보 알아보기 desc user; --user 테이블 : MySQL에서 모든 사용자 계정과 권한을 -- 저장/관리하는 핵심 시스템 테이블 -- 등록된 유저와 접속 허용 정보 확인 select user, host from user; -- 유저 만들기 create user 'java'(유저명)@'%'(접속정보)identified by '****'(비밀번호); (%: ip로 접속 가능) -- 권한 부여 grant all privileges on dev.(접속 db명)* to 'java'@'%' with grant option; -- 권한 갱신 flush privileges;
MySQL의 emp 테이블 데이터를 조회하여 JTable에 출력해보자!
package db;
import java.sql.*;
import javax.swing.*;
public class EmpLoad extends JFrame {
JTable table; // DB 결과를 보여줄 표 컴포넌트
JScrollPane scroll; // 표에 스크롤 기능 추가
String[][] data = null; // 몇 건인지 알 수 없으므로 null
String[] columns = {
"empno", "ename", "job", "mgr", "hiredate", "sal", "comm", "deptno"
};
//✅ DB에서 emp 테이블 데이터를 조회하고, 2차원 배열 data에 저장
public void loadData() {
String url = "jdbc:mysql://localhost:3306/dev"; //⭐암기
String user = "java";
String pwd = "****";
Connection con = null; // DB 접속 정보 객체
PreparedStatement pstmt = null; // SQL 실행 객체
ResultSet rs = null; // 표 데이터를 표현한 객체
try {
// 1. JDBC 드라이버 로드
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("Driver Load Success!!");
// 2. DB 연결
con = DriverManager.getConnection(url, user, pwd);
if (con != null) {
System.out.println("DB 접속 성공!");
// 3. SQL 준비 및 실행
String sql = "SELECT * FROM emp ORDER BY empno ASC";
pstmt = con.prepareStatement(sql,
ResultSet.TYPE_SCROLL_INSENSITIVE, // 커서 자유 이동 가능
ResultSet.CONCUR_READ_ONLY // 읽기 전용
);
rs = pstmt.executeQuery(); // select문은 ResultSet으로 결과를 받음
// 4. 레코드 수 파악
rs.last(); // 레코드의 마지막 행으로 강제이동
int total = rs.getRow(); // 총 레코드 수
System.out.println("▶ 총 레코드 수: "+total);
// 5. 배열 크기 결정
data = new String[total][8];
// 6. 커서 초기화 후, 반복문으로 데이터 추출
rs.beforeFirst(); // 커서를 처음 이전 위치로 이동
int i = 0;
while (rs.next()) {
data[i][0] = rs.getString("empno");
data[i][1] = rs.getString("ename");
data[i][2] = rs.getString("job");
data[i][3] = rs.getString("mgr");
data[i][4] = rs.getString("hiredate");
data[i][5] = rs.getString("sal");
data[i][6] = rs.getString("comm");
data[i][7] = rs.getString("deptno");
i++;
}
}
} catch (ClassNotFoundException e) {
System.err.println("❌ 드라이버 클래스를 찾을 수 없습니다.");
e.printStackTrace();
} catch (SQLException e) {
System.err.println("❌ SQL 오류 발생");
e.printStackTrace();
} finally {
// 7. 자원 해제 (역순으로 닫기)
try {if(rs!=null)rs.close();} catch (SQLException e){e.printStackTrace();}
try {if(pstmt!=null)pstmt.close();} catch (SQLException e){e.printStackTrace();}
try {if(con!=null)con.close();} catch (SQLException e){e.printStackTrace();}
}
}
//✅ 생성자: 데이터 로드 및 GUI 구성
public EmpLoad() {
loadData();
// DB로부터 사원 정보 로드한 후에 테이블에 정보 출력!
// JTable 구성
table = new JTable(data, columns);
scroll = new JScrollPane(table); // 스크롤 추가
add(scroll);
setSize(800, 600);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new EmpLoad();
}
}
PreparedStatement pstmt = con.prepareStatement(sql,
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY
);
TYPE_SCROLL_INSENSITIVE :
커서를 앞뒤, 임의 위치로 자유롭게 이동 가능
DB 내용이 바뀌어도 반영되지 않음
(SELECT가 실행된 순간에 조회된 데이터만 갖고 작업)
CONCUR_READ_ONLY :
결과 집합을 읽기 전용으로 사용. 수정 불가 (데이터 보호)
▶ 이 설정이 필요한 이유:
rs.last()로 커서를 마지막 행으로 이동하여 전체 레코드 수 파악rs.last(); // 레코드의 마지막 행으로 강제이동 int total = rs.getRow(); // 총 레코드 수 data=new String[total][8];
rs.beforeFirst()로 다시 커서를 맨 앞으로 돌려서 데이터 반복 처리
last()는 실제 마지막 데이터에 커서를 위치시킴beforeLast()는 마지막 직전의 위치에 커서를 둠next() 호출해야 데이터 접근 가능Java Swing에서 표 형식의 데이터를 시각적으로 표현하는 GUI 컴포넌트
DB 결과나 배열 데이터를 테이블 형태로 출력할 수 있게 해줌.
new JTable(data, columns) 2차원 배열과 열 제목을 받아 테이블 생성
//데이터에 사용될 이차원 배열
String[][] data = {
{"101", "Alice", "개발자"},
{"102", "Bob", "디자이너"},
};
//컬럼에 사용될 일차원 배열
String[] columns = {"사번", "이름", "직무"};
JTable table = new JTable(data, columns);
JScrollPane scroll = new JScrollPane(table);
frame.add(scroll);
JScrollPane(스크롤)을 설정하는 이유 :
데이터가 많을 때 화면에 다 안 보이기 때문