-
221229. DB 8. JDBC스타터스 백엔드 3기 2022. 12. 29. 16:56
하루입니다.
JDBC

- JDBC를 만드는 이유는 데이터베이스에 독립적인 프로그램을 만들기 위해서이다.
- 단, DB마다 종속적인 SQL이 있다. 그런 것 외는 독립적으로 동작하도록 한다.
- 사용하기 위해서는 DB별로 JDBC DRIVER가 필요하다.
- maria db jdbc driver + maria db
- oracle db jdbc driver + oracle db
- java.sql : 인터페이스 기능 선언 (자바쪽), 우리가 만드는 거 아니다
- jdbc driver : 상속 클래스들을 오버라이딩한 클래스의 모임 (메소드 이름 통일되었지만 구현내용만 다르게)
다운로드
https://mariadb.com/downloads/connectors/connectors-data-access/java8-connector/

- 자바와 연동할 거니까 jdk 필요
- 연결한 데이터베이스도 필요
- jdk와 db를 연결할 jdbc driver 필요 (mariadb 전용)
jdbc 구현 순서
0. jdbc driver 호출
1. 원하는 데이터베이스에 연결한다.
2. db로 전송할 sql을 하나 만들어서 보낸다.
3. sql의 결과가 있다면 받는다.
4. 더이상 할 작업이 없다면 db 연결해제한다.

properties - java build path - class path에서 다운받은 mariadb.jar 추가해주기
1. ConnectionInform
- DRIVER CLASS, JDBC URL, USERNAME, PASSWORD를 public final static 변수로 선언한다.
- 다른 클래스에서 사용하려면 ConnectionInform.변수명 이렇게 사용해야 한다.
- 다른 클래스에서 사용하게 하기 위한 목적도 있지만, 보안 목적도 있지 않을까?

2. ConnectionTest
순서
Connection - DriverManager - createStatement - Statement
ResultSet - next, close, wasNull
public interface Connection extends Wrapper, AutoCloseable
- A connection (session) with a specific database. SQL statements are executed and results are returned within the context of a connection.
- 특정 데이터베이스와의 연결(세션)입니다. SQL 문이 실행되고 연결 컨텍스트 내에서 결과가 반환됩니다.public class DriverManager {
// List of registered JDBC drivers
private static final CopyOnWriteArrayList<DriverInfo>;
private static loginTimeout = 0;
private static PrintWriter logWriter = null;
private static PrintStream logStream = null;
private static final String JDBC_DRIVERS_PROPERTY = "jdbc.drivers";
}
- The basic service for managing a set of JDBC drivers.
- The {@link javax.sql.DataSource} interface, provides
another way to connect to a data source.
The use of a {@code DataSource} object is the preferred means of connecting to a data source.
As part of its initialization, the {@code DriverManager} class will attempt to load available JDBC drivers by using:
- {@link javax.sql.DataSource} 인터페이스, 제공 데이터 소스에 연결하는 또 다른 방법입니다.
- 데이터 소스에 연결할 때는 {@codeDataSource} 개체를 사용하는 것이 좋습니다. 초기화의 일환으로 {@codeDriverManager} 클래스는 다음을 사용하여 사용 가능한 JDBC 드라이버를 로드하려고 시도합니다.public interface Connection extends Wrapper, AutoCloseable {
Statement createStatement() throws SQLException;
}
- Creates a {@code Statement} object for sending SQL statements to the database. SQL statements without parameters are normally executed using {@code Statement} objects. If the same SQL statement is executed many times, it may be more efficient to use a {@code PreparedStatement} object.
- Result sets created using the returned {@code Statement}
object will by default be type {@code TYPE_FORWARD_ONLY} and have a concurrency level of {@code CONCUR_READ_ONLY}.
- SQL 문을 데이터베이스로 보내기 위한 {@codeStatement} 개체를 생성합니다. 매개 변수가 없는 SQL 문은 일반적으로 {@codeStatement} 개체를 사용하여 실행됩니다. 동일한 SQL 문이 여러 번 실행되는 경우 {@codePreparedStatement} 개체를 사용하는 것이 더 효율적일 수 있습니다.
- 반환된 {@codeStatement}을(를) 사용하여 생성된 결과 집합
개체는 기본적으로 {@code TYPE_FORWARD_ONLY} 유형이 됩니다. 동시성 수준은 {@code CONCURE_READ_입니다.만}.public interface Statement extends Wrapper, AutoCloseable {
}
- The object used for executing a static SQL statement and returning the results it produces.
By default, only one {@code ResultSet} object per {@code Statement} object can be open at the same time. Therefore, if the reading of one {@code ResultSet} object is interleaved with the reading of another, each must have been generated by different {@code Statement} objects. All execution methods in the {@code Statement} interface implicitly close a current {@code ResultSet} object of the statement if an open one exists.
- 정적 SQL 문을 실행하고 결과를 반환하는 데 사용되는 개체입니다. 기본적으로 {@codeStatement} 개체당 하나의 {@codeResultSet} 개체만 동시에 열 수 있습니다. 따라서 한 {@codeResultSet} 개체의 읽기가 다른 개체의 읽기와 인터리브되는 경우 각 개체가 서로 다른 {@codeStatement} 개체에 의해 생성되어야 합니다. {@codeStatement} 인터페이스의 모든 실행 메서드는 열려 있는 문이 있는 경우 해당 문의 현재 {@codeResultSet} 개체를 암시적으로 닫습니다.public interface Statement extends Wrapper, AutoCloseable {
ResultSet executeQuery(String sql)
throws SQLException;
int executeUpdate(String sql) throws SQLException;
void close() throws SQLException;
}
executeQuery()
- ResultSet executeQuery(String sql) throws SQLException
- ResultSet단일 개체 를 반환하는 지정된 SQL 문을 실행 합니다.
- PreparedStatement 이 메서드는 또는 CallableStatement에서 호출할 수 없습니다 .
executeUpdate()
- int executeUpdate(String sql) throws SQLException
- 주어진 SQL 문을 실행합니다. 이 문은 INSERT, UPDATE또는 DELETE문이거나 SQL DDL 문과 같이 아무것도 반환하지 않는 SQL 문일 수 있습니다.
- PreparedStatement 이 메서드는 또는 CallableStatement에서 호출할 수 없습니다 .
close()
- void close() throws SQLException
- Statement자동으로 닫힐 때까지 기다리지 않고 이 개체의 데이터베이스와 JDBC 리소스를 즉시 해제합니다. 일반적으로 데이터베이스 리소스가 묶이지 않도록 작업을 마치는 즉시 리소스를 해제하는 것이 좋습니다.이미 닫힌 Statement 개체 에서 메서드 close를 호출해도 아무런 효과가 없습니다.
- Statement 개체가 닫히면 현재 개체( 있는 ResultSet경우)도 닫힙니다.public interface ResultSet extends Wrapper, AutoCloseable {
boolean next() throws SQLException;
void close() throws SQLException;
boolean wasNull() throws SQLException;
String getString throws SQLException;
boolean getBoolean throws SQLException;
int getInt throws SQLException;
float getFloat throws SQLException;
double getDouble throws SQLException;
// 그 외 byte[], Timestamp, Date, Array 등 ...
}
- 데이터베이스 결과 집합을 나타내는 데이터 테이블로, 일반적으로 데이터베이스 쿼리문을 실행하여 생성됩니다.
- ResultSet 개체는 현재 데이터 행을 가리키는 커서를 유지합니다. 처음에는 커서가 첫 번째 행 앞에 배치됩니다. 다음 메소드는 커서를 다음 행으로 이동하고 ResultSet 개체에 더 이상 행이 없을 때 false를 반환하므로 결과 집합을 반복하는 동안 루프에서 사용할 수 있습니다.
- ResultSet 인터페이스는 현재 행에서 열 값을 검색하기 위한 더 나은 메서드(getBoolean, getLong 등)를 제공합니다. 열의 인덱스 번호 또는 열의 이름을 사용하여 값을 검색할 수 있습니다. 일반적으로 열 인덱스를 사용하는 것이 더 효율적입니다. 열에는 1부터 번호가 매겨집니다. 이동성을 최대화하려면 각 행 내 결과 집합 열을 왼쪽에서 오른쪽 순서로 읽고 각 열을 한 번만 읽어야 합니다.
- getter 메소드의 경우, JDBC 드라이버는 기본 데이터를 getter 메소드에 지정된 Java 유형으로 변환하려고 시도하고 적절한 Java 값을 반환합니다.
- 가져오기 메서드에 대한 입력으로 사용되는 열 이름은 대소문자를 구분하지 않습니다. 열 이름으로 게터 메서드를 호출하고 여러 열의 이름이 동일하면 첫 번째 일치 열 값이 반환됩니다. 열 이름 옵션은 결과 집합을 생성한 SQL 조회에서 열 이름을 사용할 때 사용하도록 설계되었습니다. 쿼리에 명시적으로 이름이 지정되지 않은 열의 경우 열 번호를 사용하는 것이 가장 좋습니다. 열 이름이 사용되는 경우 프로그래머는 SQL AS 절을 통해 보장할 수 있는 의도된 열을 고유하게 참조하도록 주의해야 합니다.
- ResultSet 개체는 생성한 Statement 개체가 닫히거나, 다시 실행되거나, 여러 결과 시퀀스에서 다음 결과를 검색하는 데 사용될 때 자동으로 닫힙니다.
- ResultSet 개체의 열 수, 유형 및 속성은 ResultSet.getMetaData 메서드에서 반환하는 ResultSetMetaData 개체에 의해 제공됩니다.public interface ResultSet extends Wrapper, AutoCloseable {
boolean next() throws SQLException;
void close() throws SQLException;
boolean wasNull() throws SQLException;
}
next()
- boolean next() throws SQLException
- 커서를 현재 위치에서 한 행 앞으로 이동합니다. ResultSet커서는 처음에 첫 번째 행 앞에 위치합니다 . 메서드에 대한 첫 번째 호출은 next첫 번째 행을 현재 행으로 만듭니다. 두 번째 호출은 두 번째 행을 현재 행으로 만드는 식입니다.메서드 호출이 next반환 false되면 커서는 마지막 행 뒤에 위치합니다. ResultSet현재 행이 필요한 메서드를 호출하면 예외 SQLException가 발생합니다.
- true : 새로운 현재 행이 유효한 경우
- false : 더 이상 행이 없는 경우
- SQLException- 데이터베이스 액세스 오류가 발생하거나 닫힌 결과 집합에서 이 메서드가 호출된 경우
close()
- void close() throws SQLException
- ResultSet가 자동으로 닫힐 때까지 기다리지 않고 이 개체의 데이터베이스와 JDBC 리소스를 즉시 해제합니다.
-SQLException- 데이터베이스 접근 오류가 발생한 경우
wasNull()
void wasNull() throws SQLException
- 마지막으로 읽은 열의 값이 SQL NULL인지 여부를 보고합니다 . 먼저 열에서 getter 메서드 중 하나를 호출하여 해당 값을 읽은 다음 해당 메서드 wasNull를 호출하여 읽은 값이 SQL NULL인지 확인해야 합니다.
- true : 읽은 마지막 열 값이 SQL NULL인 경우
- false : 그렇지 않은 경우
- SQLException- 데이터베이스 액세스 오류가 발생하거나 닫힌 결과 집합에서 이 메서드가 호출된 경우public interface Connection extends Wrapper, AutoCloseable {
PreparedStatement prepareStatement(String sql)
throws SQLException;
}
- 미리 컴파일된 SQL 문을 나타내는 개체입니다.SQL 문은 미리 컴파일되어 PreparedStatement개체에 저장됩니다. 그런 다음 이 개체를 사용하여 이 문을 여러 번 효율적으로 실행할 수 있습니다.Statement를 사용한 maria db 접속



자바언어 : 플랫폼 독립적
jdbc : DB 독립적
그런데 우린 mariaDB를 써용. 되도록이면 모든 데이터베이스에 독립적이면 좋지만, 그렇지 못한 경우도 있다.
Statement, PreparedStatement


statement를 사용하는 경우

preparedStatement를 사용하는 경우

ConnectionTest ConnectionInform'스타터스 백엔드 3기' 카테고리의 다른 글
221230. DB 10. JDBC (수정, 삭제) (0) 2023.01.03 유데미 스타터스 취업 부트캠프 3기 - 백엔드 6주차 (0) 2022.12.30 221229. DB 7. 트랜잭션 (0) 2022.12.29 221228. DB 6. 함수, (트랜잭션) (0) 2022.12.28 221227. DB 5. 조인 (0) 2022.12.27