본문 바로가기

Database/mysql

06.08 JDBC 드라이버 로딩 및 DBMS 접속(eclipse에서 db연계)

vJDBC(Java DataBase Connectivity)
§자바/JSP 프로그램 내에서 데이터베이스와 관련된 작업을 처리할 수 있도록 도와주는 자바 표준 인터페이스
 
 
v2.3 Connection 객체 생성하기
§JDBC 드라이버에서 데이터베이스와 연결된 커넥션을 가져오기 위해 DriverManager 클래스의 getConnection( ) 메소드를 사용

 

§DriverManager 클래스로 Connection 객체를 생성할 때 JDBC 드라이버를 검색하고, 검색된 드라이버를 이용하여 Connection 객체를 생성한 후 이를 반환

String driver = "com.mysql.cj.jdbc.Driver";

String url = "jdbc:mysql://localhost:3306/연결할db이름";

 

properties 객체를 이용하면 추후 수정이 가능하다.

 


 

C:\Program Files (x86)\MySQL\Connector J 8.0

 

해당 project에 외부 라이브러리 build path

 


eclipse 데이터베이스 확장

 

help -> install new software

2023-03 - https://download.eclipse.org/releases/2023-03/

database만 선택해서 install

 

window -> show view-> other -> Data Source Explorer

 

 

 

=============================================

## project에 MySQL JDBC 등록하기

 

mvnrepository.com 접속

검색창에 mysql-connector 검색

 

MySQL Connector/J 선택

 

내컴퓨터에 설치된 version 선택

 

Files 탭의 jar파일 다운로드

 

=============================================

 

## MySQL 설치 시 connector/J 설치 완료 시

 

C:\Program Files (x86)\MySQL\Connector J 8.0

경로로 이동하여

mysql-connector-java-version.jar 확인

 

----------------------------------------------

 

project 우클릭 -> build path ->

Add External Archives 선택

 

다운로드 받은 jar 파일 선택 후 열기

(mysql-connector-java-version.jar)

 

-> Referenced Libraries 에 등록된 jar 확인 후 완료

 

----------------------------------------------

 

project에 library 파일이 있는 경우

 

file 우클릭 -> build path -> add to Build Path

 

Referenced Libraries 에 등록된 jar 확인 후 완료

 

=============================================

 

-- eclipse 에 data source explorer 설치하기

 

Help -> install new Software... 선택

 

Work With 작성란에 해당 내용 기입

https://download.eclipse.org/releases/2023-03/

후 Enter

 

검색된 내용 중

 

Database Development Check 후 next

 

I accept 동의 후 finish

 

설치 완료 되면 eclipse restart

 

재시작 후

 

Window -> Show View -> Other 선택

 

Data Management -> Data Source Explorer 선택

 

Data Source Explorer탭의

DataBase Connections 우클릭 New... 선택

 

JDBC 추가

다운로드 받은 mysql-connector jar 파일 등록

 

접근 하려는 DBMS url, username, password 정보를 등록 하여

 

connection 정보 추가

 

SQL 파일 생성 후 상단의 Type , Name , DataBase 선택

연결된 DBMS의 database 와 계정 정보를 통해

Query(질의) 작성 후 실행

 

================================================

 

## JDBC(Java DataBase Connectivity)

 

JAVA 프로그램 내에서 데이터베이스와 관련된 작업을 처리할 수 있도록 도와주는 자바 표준 인터페이스

관계형 데이터베이스 시스템에 접근하여 SQL 문을 실행하기 위한 자바 API 또는 자바 라이브러리

JDBC API를 사용하면 DBMS의 종류에 상관없이 데이터베이스 작업을 처리할 수 있음

 

================================================

 

## JDBC를 사용한 JAVA와 데이터베이스의 연동

 

1 java.sql.* 패키지 임포트,

 

2 JDBC 드라이버 로딩,

 

3 데이터베이스 접속을 위한 Connection 객체 생성

- Connection : Database 와 계정정보를 통해 연결된 객체, Schema, user, password 정보를 저장

 

4 쿼리문을 실행하기 위한

Statement/PreparedStatement/CallableStatement 객체 생성

Statement : 구문 - 질의를 실행 시키고 결과를 반환환하는 객체

 

5 쿼리 실행,

쿼리 실행의 결과 값(int 또는 ResultSet) 사용

ResultSet : 검색 쿼리의 결과를 저장하는 객체

int : UPDATE, DELETE, INSERT 작업이 수행된 행의 개수

 

6 사용된 객체(ResultSet, Statement/PreparedStatement/CallableStatement, Connection)

사용 완료 시 자원해제 (close)

 

===================================================

## JDBC 드라이버 로딩하기

 

JDBC 드라이버 로딩 단계에서는 드라이버 인터페이스를 구현하는 작업

Class.forName(String className) 메소드를 이용하여 JDBC 드라이버를 로딩

-- 등록된 라이브러리 확인

 

-- JDBC 드라이버가 로딩되면 자동으로 객체가 생성되고 DriverManager 클래스에 등록

 

JDBC 드라이버 로딩은 프로그램 수행 시 한 번만 필요

 

# 2 Connection 객체 생성하기

JDBC 드라이버에서 데이터베이스와 연결된 커넥션을 가져오기 위해 DriverManager 클래스의 getConnection( ) 메소드를 사용

DriverManager 클래스로 Connection 객체를 생성할 때 JDBC 드라이버를 검색하고, 검색된 드라이버를 이용하여 Connection 객체를 생성한 후 이를 반환

 

java.sql.Connection conn = java.sql.DriverManager.getConnection(url, username, password);

 

#3 데이터베이스 연결 닫기

데이터베이스 연결이 더 이상 필요하지 않으면 데이터베이스와 JDBC 리소스가 자동으로 닫힐 때까지 대기하는 것이 아니라 close( ) 메소드로 생성한 Connection 객체를 해제

일반적으로 데이터베이스 리소스를 사용하지 않기 위해 사용을 끝내자마자 리소스를 해제하는 것이 좋음

 

부가 설명

 

-- 우리가 작업하는 프로그래밍의 변수나 instance들은 메모리에 있는

value와 address를 제어하는 것.

 

File은 HDD즉 메모리 외부에 존재하는 자원이고 이 자원을 쓰려면 외부자원을

open 해서 메모리에 가지고 와야하며 다 사용하고 나면 연결을 해제(close) 해줘야 함.

 

database management system에 연결된 connection도 외부자원이므로 사용하고 나면 close 해줘야함.

 

# 데이터베이스 SQL문 실행

## 1 Statement 객체로 데이터 접근하기

 

Statement 객체

정적인 쿼리에 사용

하나의 쿼리를 사용하고 나면 더는 사용할 수 없음

하나의 쿼리를 끝내면 close( )를 사용하여 객체를 즉시 해제해야 함

close()를 사용하여 객체를 즉시 해제하지 않으면 무시할 수 없는 공간이 필요하며 다른 작업을 수행하는 동안 멈추지 않기 때문.

복잡하지 않은 간단한 쿼리문을 사용하는 경우에 좋음

 

public ResultSet executeQuery(String sql);

검색질의 SELECT 문을 사용할때 사용(ResultSet 객체반환)

 

public int executeUpdate(String sql);

DML(INSERT , UPDATE, DELETE SQL문을 사용할때 사용)

테이블에 변경된 행의 개수를 반환

 

public void close();

Statement 객체를 반환(자원해제)할때 사용

 

 

## 2 PreparedStatement 객체로 데이터 접근하기

PreparedStatement 객체

동적인 쿼리에 사용

Prepared Statement 객체는 하나의 객체로 여러 번의 쿼리를 실행할 수 있으며, 동일한 쿼리문을 특정 값만 바꾸어서 여러 번 실행해야 할 때, 매개변수가 많아서 쿼리문을 정리해야 할 때 유용

 

public ResultSet executeQuery();

검색질의 SELECT 문을 사용할때 사용(ResultSet 객체반환)

 

public int executeUpdate();

DML(INSERT , UPDATE, DELETE SQL문을 사용할때 사용)

테이블에 변경된 행의 개수를 반환

 

public void close();

Statement 객체를 반환(자원해제)할때 사용

 

 

 

## 3 ResultSet - 검색 결과를 저장하는 객체

ResultSet 객체

SELECT 검색 질의로 실행된 행의 정보를 행단위로 읽어오는 객체

 

public boolean next();

검색 질의 실행 후 결과가 존재하는지 확인하는 method

true : 존재함, false : 더이상 읽을 행정보가 없음.

읽을 행정보가 존재하면 해당 행으로 이동하여 속성(column)별로 값을 읽을 수 있도록 함.

 

public type getType(column number or column name);

읽어올 데이터 타입별 method가 존재

column과 일치하는 java의 데이터 타입을 지정하면

지정된 타입으로 database에서 읽어들인 행의 속성값을 반환


[workbench 필기 내용]

-- 20230608.sql
SELECT * FROM usertbl;
commit; -- 외부 세션 적용된건 다시 트랜잭션 오픈해서 확인해야함.

DESC usertbl;

 


database_jdbc.zip
0.02MB
database_question.zip
4.49MB

database_jdbc--------------------------------

 

package a_base;

 

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.util.Properties;

 

public class ConnectionExample {

 

int a; // field 선언

 

ConnectionExample(){

System.out.println("3. ConnectionExample 생성자 호출"+a);

}

 

static{

System.out.println("1. 설계 정보 등록 시 실행");

}

 

{

// 접근할 수 있는 식별자가 존재하지 않기 때문에

// 인스턴스가 생성이 되면 즉시 실행

a = 100;

System.out.println("2. instance 생성 시 실행되는 블럭");

}

 

public static void main(String[] args) {

System.out.println("Main 시작");

new ConnectionExample();

 

String driver = "com.mysql.cj.jdbc.Driver";

String url = "jdbc:mysql://localhost:3306/sqldb";

String user = "root";

String pass = "12345";

 

try {

Class.forName(driver);

System.out.println("Driver Class 존재함");

 

// java.sql.Connection

Connection conn = DriverManager.getConnection(

"jdbc:mysql://localhost:3306/sqlDB?user=root&password=12345"

);

System.out.println(conn);

conn.close();

// 2번 방법

conn = DriverManager.getConnection(url,user,pass);

System.out.println(conn);

conn.close();

 

// 3번 방법

Properties prop = new Properties();

prop.setProperty("user", user);

prop.setProperty("password", pass);

conn = DriverManager.getConnection(url,prop);

System.out.println(conn);

conn.close();

 

// 4번 방법 - 외부 properties 파일 이용

File file = new File("prop/mysql.properties");

FileReader reader = new FileReader(file);

prop = new Properties();

prop.load(reader);

System.out.println(prop);

conn = DriverManager.getConnection(url,prop);

System.out.println(conn);

conn.close();

 

} catch (ClassNotFoundException e) {

System.out.println("jdbc Mysql Driver가 존재하지 않음" + e.getMessage());

} catch (SQLException e) {

System.out.println("DB 연결 정보 오류 : " + e.getMessage());

} catch (FileNotFoundException e) {

System.out.println("경로에 파일 찾지 못함" + e.getMessage());

} catch (IOException e) {

System.out.println("properties 파일의 형식 오류" + e.getMessage());

}

 

 

 

}

 

}


 

package a_base;

 

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.Scanner;

 

public class PreparedStatementExample {

 

public static void main(String[] args) {

// Prepared - 준비가 된

Connection conn = null;

// 동적 쿼리 객체

// 쿼리를 먼저 등록 시켜놓고 질의 실행에 필요한 데이터(값)을 나중에 대입

PreparedStatement pstmt = null;

ResultSet rs = null;

try {

conn = DriverManager.getConnection(

"jdbc:mysql://localhost:3306/sqldb",

"root",

"12345"

);

System.out.println("DB 연결 완료");

 

// 등록할 질의

String sql = "SELECT * FROM usertbl WHERE userID = ?";

// 입력받은 ID의 회원 정보를 검색

Scanner sc = new Scanner(System.in);

System.out.println("검색할 회원의 아이디를 작성해주세요 > ");

String id = sc.next();

 

pstmt = conn.prepareStatement(sql);

// ? wildcard 자리에 데이터 삽입 - ? 배치에 따라 왼쪽에서 부터 1, 1씩 증가

pstmt.setString(1, id);

// "SELECT * FROM usertbl WHERE userID = 'id'"

rs = pstmt.executeQuery();

// WHERE 조건절에 검색에 사용한 속성이 PRIMARY KEY

// userID 가 일치하는 행의 정보를 반환하거나 존재하지 않으면 없거나 둘 중 하나

if(rs.next()) {

// 1 2 3 4 5 6 7 8

// userID, name, birthyear, addr, mobile1, mobile2, height, mdate

// 각 타입에 맞는 get메소드를 사용

String userId = rs.getString(1);

String name = rs.getString(2);

int birthYear = rs.getInt(3);

String addr = rs.getString("addr");

java.util.Date mdate = rs.getDate(8);

String result = userId+"-"+name+"-"+birthYear+"-"+addr+"-"+mdate;

System.out.println(result);

System.out.println("--------------------------------------------------");

}else {

System.out.println(id+" 회원은 존재하지 않습니다.");

}

// mobile1, mobile2, height, mdate

sql = "UPDATE userTbl SET "

+ "mobile1 = ? , mobile2 = ? , height = ? , mdate = ? "

+ "WHERE userID = ? ";

rs.close();

pstmt.close();

 

pstmt = conn.prepareStatement(sql);

pstmt.setString(1, "010");

pstmt.setInt(3, 190);

pstmt.setString(2, "94867166");

pstmt.setDate(4, new java.sql.Date(System.currentTimeMillis()));

pstmt.setString(5, id);

 

int result = pstmt.executeUpdate();

System.out.println(result+"개의 행 수정 완료");

 

 

} catch (SQLException e) {

e.printStackTrace();

}finally {

 

try {

if(rs != null) {

rs.close();

}

if(pstmt != null) {

pstmt.close();

}

if(conn != null) {

conn.close();

}

} catch (SQLException e) {

e.printStackTrace();

}

}

}

 

}


package a_base;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import java.util.Scanner;

public class StatementExample {

public static void main(String[] args) {
// Statement - Connection 객체의 연결 정보를 이용하여 질의를 실행시키고
// 결과를 반환하는 class

// DBMS와 연결된 session 정보를 저장하고 있는 객체
Connection conn = null;
// session 안에서 질의 전송을 도와주는 객체
Statement stmt = null;
// 검색 질의의 결과 정보를 저장하는 객체
ResultSet rs = null;

try {
// 라이브러리 등록되어있는지 확인하는 용도임. 필수x
// Class.forName("com.mysql.cj.jdbc.Driver");

conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/sqldb",
"root",
"12345"
);
System.out.println(conn.getAutoCommit());
System.out.println(conn);

// auto commit 설정 변경
conn.setAutoCommit(false);

// 연결된 database ex) sqldb에 질의를 수행할 Statement 객체 반환
stmt = conn.createStatement();
String sql = "SELECT * FROM usertbl";

// 검색 질의에 대한 결과를 저장하는 class
// 검색 질의 실행 후 반환
rs = stmt.executeQuery(sql);
// rs.next()
// 읽어올 행 정보가 있으면 해당 위치로 이동한 후 true 반환
// 읽어올 행 정보가 없으면 false 반환
while(rs.next()) {
// 1 2 3 4 5 6 7 8
// userID, name, birthyear, addr, mobile1, mobile2, height, mdate
// 각 타입에 맞는 get메소드를 사용
String userId = rs.getString(1);
String name = rs.getString(2);
int birthYear = rs.getInt(3);
String addr = rs.getString("addr");
Date mdate = rs.getDate(8);
String result = userId+"-"+name+"-"+birthYear+"-"+addr+"-"+mdate;
System.out.println(result);
System.out.println("--------------------------------------------------");

}

Scanner sc = new Scanner (System.in);
System.out.println("userID를 입력해주세요.");
String id = sc.next();
System.out.println("이름을 입력해주세요 > ");
String name = sc.next();
System.out.println("생년월일을 입력해주세요 ex) 1982 > ");
int birthYear = sc.nextInt();
System.out.println("주소를 입력해주세요 도시이름 2자 > ");
String addr = sc.next();

rs.close();
stmt.close();

stmt = conn.createStatement();

//문자열은 ''로 감싸주기
sql = "INSERT INTO usertbl(userID,name,birthYear,addr)"
+ "VALUES('"+id+"','"+name+"',"+birthYear+",'"+addr+"')";
System.out.println(sql);
int result = stmt.executeUpdate(sql);
System.out.println(result+"개의 행 삽입 완료");
// 쿼리 commit
conn.commit();

// } catch (ClassNotFoundException e) {
//e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
try {
//1개라도 오류 발생 시 현재 실행 처리문 삽입 이전 시점으로 rollback
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally {
try {
// 역순으로 닫아주기 
if(rs !=null) rs.close();
if(stmt != null) stmt.close();
if(conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

}

}

 


module database_jdbc {

requires java.sql;

}

 


 


database_question.zip
0.02MB

실습파일. (답지는 중간에 있음)

'Database > mysql' 카테고리의 다른 글

06.13 변수, MySQL 내장 함수, join  (0) 2023.06.21
06.12 sub query, GROUP BY ~ HAVING, DCL  (0) 2023.06.21
java sql 설정  (0) 2023.06.09
06.07 example data Import  (0) 2023.06.07
06.05 mysql시작  (0) 2023.06.05