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--------------------------------
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();
}
}
}
}
실습파일. (답지는 중간에 있음)
'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 |