일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 웹게임
- HTML
- Cookie
- phaser
- docker
- model1
- 암호화
- JavaScript
- Spring
- 블록체인
- CSS
- Ajax
- SQL
- tiles.xml
- express
- autowired
- 배포
- PL/SQL
- 도커
- node.js
- RDS
- 비트코인
- 웹소켓
- websocket
- EC2
- AWS
- Servlet
- JSP
- jQuery
- 알고리즘
- Today
- Total
記錄
oracle database -2 (JDBC 상세설명 포함) 본문
JDBC
요약 자바 프로그램 안에서 SQL을 실행하기 위해 데이터베이스를 연결해주는 응용프로그램 인터페이스를 말한다.
자바 프로그램 내에서 데이터베이스 질의문 즉, SQL을 실행하기 위한 자바 API(application programming interface)이다. Java database connectivity의 약자로 생각하기도 하지만 실제로는 상표 이름이다. JDBC는 데이터베이스 및 애플리케이션 개발자들을 위한 표준 API를 제공하고 순수 자바 API만으로도 데이터베이스 응용업무를 만들게 해준다.
JDBC를 사용하면, 어떠한 관계 데이터베이스(relational database)에서도 SQL문을 사용하기 쉽다. 즉, JDBC API를 사용하면 DB2, Sybase, Oracle, Informix, mSQL 등의 데이터베이스에 접근하는 프로그램을 따로 만들 필요가 없다. 단지 하나의 프로그램을 작성하고 그 프로그램에서 SQL문을 적당한 데이터베이스에 전송할 수 있다.
또한 응용업무를 자바로 작성한다면 보유한 기종이나 소프트웨어에 따라 다르게 작성하지 않아도 되기 때문에 자바와 JDBC의 결합은 하나의 프로그램이 어디에서나 동작할 수 있게 해준다. 자바는 사용하기에 견고하고 안전하고 쉽고 이해하기 쉬우며 데이터베이스 응용업무를 만드는데 있어서 최적의 언어라 할 수 있다. 단지 필요한 것은 다양한 데이터베이스에 연결하는 방법일 것이다. JDBC는 이러한 것을 위한 도구이다.
JDBC는 자바의 기능을 확장한다. 예를 들어 자바와 JDBC API를 사용하면, 원격 데이터베이스에서 얻은 정보를 사용하는 애플릿을 웹 페이지에 포함시킬 수 있다. 또는 기업에서 서로 다른 플랫폼을 사용하는 사원들이 인트라넷을 사용하여 하나 이상의 내부 데이터베이스에 연결하는 데에도 JDBC가 사용될 수 있다. 기업은 이미 개발된 데이터베이스를 계속 사용할 수 있으며 정보가 다른 곳에 저장되어 있어도 쉽게 정보에 접근할 수 있다. 또 새로운 응용업무를 개발하는 데 소요되는 시간도 짧다.
출처 : [네이버 지식백과] JDBC (두산백과)
이 과정은 이해하고 충분히 숙지해두어야 코드들도 쉽게 생각이 난다
순서를 정리하자면..
1) class loader를 이용해서 주어진 string형식의 class name을 통해 class object를 return하는 Class.forName() 메소드를 이용해서 Class.forName("oracle.jdbc.driver.OracleDriver"); 라고 입력함으로써 메모리에 OracleDriver를 얹는다
2) OracleDriver가 메모리에 올라갔고 이를 통해 DriverManager.getConnection(url, id, pw)를 사용하여 database와의 연결을 담당하는 인터페이스인 Connection 객체를 만든다. SQL문의 명령은 Connection 인터페이스를 통해서 전달되고 결과값 역시 Connection 인터페이스를 통해 받게 된다.
3) SQL문 실행을 위한 executeQuery()와 executeUpdate()를 갖고 있는 인터페이스인 Statement 객체를 2번에서 생성한 Connection 객체의 .createStatement()를 통해 생성한다
4) 생성된 Statement 객체의 두 메소드(executeQuery(), executeUpdate())를 이용하여 SQL문을 명령하고 이 결과 값을 ResultSet 인터페이스에 초기화 한다. ResultSet은 database의 결과값을 담는 table of data로서 커서의 개념을 갖고 있다. 처음 커서의 위치는 BOF이고 끝의 위치는 EOF라고 한다
5) ResultSet 인터페이스의 .next()를 이용해서 true or false를 반환해 while 문을 돌려서 모든 데이터가 돌아가도록 하고 .getString("~~")을 이용해서 ~~에 database에서 사용한 속성명을 넣어서 값을 가져온다.
6) 역순으로 Connection, Statement, ResultSet을 닫아준다
sql문의 결과로 데이터의 변화가 일어나면 executeUpdate()이며 리턴은 ResultSet이다
단순히 조회(select)는 executeQuery()을 사용하고 리턴은 int이다
forName
public static Class<?> forName(String name,
boolean initialize,
ClassLoader loader)
throws ClassNotFoundException
Returns the Class object associated with the class or interface with the given string name, using the given class loader. Given the fully qualified name for a class or interface (in the same format returned by getName) this method attempts to locate, load, and link the class or interface. The specified class loader is used to load the class or interface. If the parameter loader is null, the class is loaded through the bootstrap class loader. The class is initialized only if the initialize parameter is true and if it has not been initialized earlier.
If name denotes a primitive type or void, an attempt will be made to locate a user-defined class in the unnamed package whose name is name. Therefore, this method cannot be used to obtain any of the Class objects representing primitive types or void.
If name denotes an array class, the component type of the array class is loaded but not initialized.
For example, in an instance method the expression:
Class.forName("Foo")
is equivalent to:
Class.forName("Foo", true, this.getClass().getClassLoader())
Note that this method throws errors related to loading, linking or initializing as specified in Sections 12.2, 12.3 and 12.4 of The Java Language Specification. Note that this method does not check whether the requested class is accessible to its caller.
If the loader is null, and a security manager is present, and the caller's class loader is not null, then this method calls the security manager's checkPermission method with a RuntimePermission("getClassLoader") permission to ensure it's ok to access the bootstrap class loader.
java.sql
Interface Connection
All Superinterfaces:
AutoCloseable, Wrapper
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.
A Connection object's database is able to provide information describing its tables, its supported SQL grammar, its stored procedures, the capabilities of this connection, and so on. This information is obtained with the getMetaData method.
java.beans
Class Statement
java.lang.Object
java.beans.Statement
Direct Known Subclasses:
Expression
public class Statement
extends Object
A Statement object represents a primitive statement in which a single method is applied to a target and a set of arguments - as in "a.setFoo(b)". Note that where this example uses names to denote the target and its argument, a statement object does not require a name space and is constructed with the values themselves. The statement object associates the named method with its environment as a simple set of values: the target and an array of argument values.
java.sql
Interface ResultSet
public interface ResultSet
extends Wrapper, AutoCloseable
A table of data representing a database result set, which is usually generated by executing a statement that queries the database.
A ResultSet object maintains a cursor pointing to its current row of data. Initially the cursor is positioned before the first row. The next method moves the cursor to the next row, and because it returns false when there are no more rows in the ResultSet object, it can be used in a while loop to iterate through the result set.
A default ResultSet object is not updatable and has a cursor that moves forward only. Thus, you can iterate through it only once and only from the first row to the last row. It is possible to produce ResultSet objects that are scrollable and/or updatable. The following code fragment, in which con is a valid Connection object, illustrates how to make a result set that is scrollable and insensitive to updates by others, and that is updatable. See ResultSet fields for other options.
가장 중요한 프로세스를 다시 정리한다
1) class loader를 이용해서 주어진 string형식의 class name을 통해 class object를 return하는 Class.forName() 메소드를 이용해서 Class.forName("oracle.jdbc.driver.OracleDriver"); 라고 입력함으로써 메모리에 OracleDriver를 얹는다
2) OracleDriver가 메모리에 올라갔고 이를 통해 DriverManager.getConnection(url, id, pw)를 사용하여 database와의 연결을 담당하는 인터페이스인 Connection 객체를 만든다. SQL문의 명령은 Connection 인터페이스를 통해서 전달되고 결과값 역시 Connection 인터페이스를 통해 받게 된다.
3) SQL문 실행을 위한 executeQuery()와 executeUpdate()를 갖고 있는 인터페이스인 Statement 객체를 2번에서 생성한 Connection 객체의 .createStatement()를 통해 생성한다
4) 생성된 Statement 객체의 두 메소드(executeQuery(), executeUpdate())를 이용하여 SQL문을 명령하고 이 결과 값을 ResultSet 인터페이스에 초기화 한다. ResultSet은 database의 결과값을 담는 table of data로서 커서의 개념을 갖고 있다. 처음 커서의 위치는 BOF이고 끝의 위치는 EOF라고 한다
5) ResultSet 인터페이스의 .next()를 이용해서 true or false를 반환해 while 문을 돌려서 모든 데이터가 돌아가도록 하고 .getString("~~")을 이용해서 ~~에 database에서 사용한 속성명을 넣어서 값을 가져온다.
6) 역순으로 Connection, Statement, ResultSet을 닫아준다
cf. ResultSet의 next 구동 원리
next
boolean next()
throws SQLException
Moves the cursor froward one row from its current position. A ResultSet cursor is initially positioned before the first row; the first call to the method next makes the first row the current row; the second call makes the second row the current row, and so on.
When a call to the next method returns false, the cursor is positioned after the last row. Any invocation of a ResultSet method which requires a current row will result in a SQLException being thrown. If the result set type is TYPE_FORWARD_ONLY, it is vendor specified whether their JDBC driver implementation will return false or throw an SQLException on a subsequent call to next.
If an input stream is open for the current row, a call to the method next will implicitly close it. A ResultSet object's warning chain is cleared when a new row is read.
Returns:
true if the new current row is valid; false if there are no more rows
Throws:
SQLException - if a database access error occurs or this method is called on a closed result set
=> 다음 row가 있으면 true를 반환하고 다음 row가 없으면 false를 반환한다. 다음 row에 이동을 무작정 먼저 하지 않고 일단 존재 여부만 파악 뒤 존재하면 true를 반환하면서 row이동이 되는 것이다. 이런 방식으로 쿼리 검색으로 나온 모든 데이터의 row를 next를 이용해 순차적으로 돌게 된다.
구체적으로는 처음에는 BOF에 있다가(BOF는 말 그대로 before the first라서 無의 공간이다) 첫번째 row로 이동하고 두번째 실행에는 확인 후 존재하면 true 반환 하면서 두번째 row로 옮겨가는 방식이다. 그러다가 다음 row가 존재하지 않으면(현재 row가 쿼리 실행 결과의 마지막 row라면) false를 반환하면서 함수가 종료된다. 정리를 하자면 n번째 실행때 커서의 위치는 n에 있고 n+1의 row가 없으면 false반환인 것이다.
커서가 row로 이동을 하면 ResultSet가 위치한 row 에서 .get~() 을 통해 데이터를 빼오면 되는데 .get~()의 파라미터에 컬럼명을 넣는 방식으로 컬럼을 특정해서 데이터를 뽑아온다. 명심할 것은 커서가 row 단위로 이동하기 때문에 언제든지 '현재'위치는 row라는 것이다.
'Web > JSP' 카테고리의 다른 글
DAO, DTO, PreparedStatement, 커넥션 풀(DBCP) (0) | 2018.01.19 |
---|---|
oracle database -3 (0) | 2018.01.17 |
oracle database -1 (0) | 2017.12.08 |
자바 빈(bean) (0) | 2017.12.07 |
예외페이지 (0) | 2017.12.07 |