
test 에는 juint을 위한 샘플이 들어온다
pom.xml이 가장 중요한데, 프로젝트마다 아파치메이븐 설정파일이 있는데
메이븐 설정파일이 pom.xml이다. 폼이 폼으로 있는 것이 아니라 의미가 있다.
Apach Maven Project의 설정파일 => pom.xml
pon => Project Object Model
객체를 모델링한 관점으로 바라보고 그 결과물로 pom.xml에 메이븐 프로젝트에 필요한 설정들을 하도록 해 놓았다.
프로젝트를 객체로 보고 어떻게 프로젝트를 설정파일에 넣어야 관리 가능할지 고안해서 만들어낸 설정파일이 pom.xml
이 파일을 가지고 의존성 라이브러리 관리도 하고, 이 프로젝트에 필요한 자바컴파일러의 버전은 몇이고 각종 기능들이 이 설정파일 안에 들어있다.
이 프로젝트를 생성할때 디렉토리 예제소스가 나왔고 이 소스들로 빌드를 들어가고 success가 된다
두 소스는 main과 test부분이다.

프로젝트 관리는 생성부터 컴파일까지 메이븐이 하고, 이클립스가 하는 것이 아니라는 것이고
이클립스에 아파치를 설치하면 메이븐이 컴파일하게 된다.
메이븐이 설정대로 컴파일한다.

scoop에서
mvn compile : 프로젝트 전체를 컴파일한다.
mvn test : 컴파일 후에는 테스트를 test폴더에서 테스트를 한다.
mvn package : 운영서버에 배포할 폴더를 만들자! test파일을 jar파일로 만든다.

package만 수행해서 compile, test가 자동으로 수행된다. 이것이 라이프사이클 관리이다.

main target classes,
test-classes테스트 파일
메이븐 자신을 위한 소스폴더와 컴파일을 저장하는 폴더
mvn clean은 타겟폴더를 날려버린다.

-e: 오류가 나면 자세하게 오류를 작성하라
-x: 전체 디버그 로깅 사용
거의 모든 것을 메이븐 페이스를 이클립스가 생성한다.




정의된 속성은 다른 태그에 사용될 수 있다.
기본생성된 속성으로는


컴파일시 수행되는 자바소스는 1.7로 컴파일 하게게되고
그 타겟도 1.7기준 자바 7기준으로 생성해내겠다.
하지만 우리는 17을 사용하기 때문에 17로 바꿔주었다.

빌드는 속성이다.!

scope 의존하는 범위를 설정, scope에 무엇을 넣어야 하느냐?

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.zerock</groupId>
<artifactId>jdbcexamples</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>jdbcexamples</name>
<url>http://maven.apache.org</url>
<properties>
<java-version>17</java-version>
</properties>
<dependencies>
<!-- Jnit Test Framework -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.19.0</version>
</dependency>
<!-- <dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
<version>1.16</version>
</dependency> -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8-production</artifactId>
<version>21.3.0.0</version>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>com.oracle.database.ha</groupId>
<artifactId>simplefan</artifactId>
</exclusion>
<exclusion>
<groupId>com.oracle.database.ha</groupId>
<artifactId>ons</artifactId>
</exclusion>
<exclusion>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>rsi</artifactId>
</exclusion>
<exclusion>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ucp</artifactId>
</exclusion>
<exclusion>
<groupId>com.oracle.database.xml</groupId>
<artifactId>xdb</artifactId>
</exclusion>
<exclusion>
<groupId>com.oracle.database.xml</groupId>
<artifactId>xmlparserv2</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<release>${java-version}</release>
</configuration>
</plugin>
</plugins>
</build>
</project>
provide : 컴파일에서는 사용하는데 배포할 때는 빼라!

자바에서는 quickstart로 가고
webapp은 webapp으로 간다.










package org.zerock.myapp;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import lombok.extern.log4j.Log4j2;
@Log4j2
public class Ex1 {
// 1. jdbc구동기 역활을 하는 클래스의 FQCN을 알아야 한다.
// 하지만 이미지 DB별로 정해져 있습니다.(아래는 오라클 JDBC드라버의 구동기 클래스)
// static final String jdbcDriver = "oracle.jdbc.driver.OracleDriver";
static final String jdbcDriver = "oracle.jdbc.OracleDriver";
// 2. JDBC url 설정(EZCONNECT 방식의 url)
static final String jdbEZConnectcUrl = "jdbc:oracle:thin:@DESKTOP-3FD0EM7:1521/XEPDB1";
// 2. JDBC url 설정 (TNSNAMES 방식)
static final String jdbcTNSNamesUrl = "jdbc:oracle:thin:@XEPDB1?TNS_ADMIN=C:/u01/oracle/product/18.0.0/dbhomeXE/network/admin";
// 2. JDBC url 설정 (Oracle Cloud 연결방식)
static final String jdbcOracleCloudUrl = "jdbc:oracle:thin:@atp20191201_high?TNS_ADMIN=c:/opt/OracleCloudWallet/ATP";
//3. 로그인(인증, Authentication) 정보 제공
static final String user = "HR";
static final String passwordForCloud = "Oracle12345678";
static final String passwordForLocal = "oracle";
public static void main(String[] args) throws SQLException, ClassNotFoundException {
Connection conn =null;
ResultSet rs = null;
Statement stmt = null;
PreparedStatement pstmt = null;
//Step.1 Oracle JDBC Driver Class Loading
Class.forName(jdbcDriver);
//Step.2 Get
// conn = DriverManager.getConnection(jdbEZConnectcUrl, user, passwordForLocal);
conn = DriverManager.getConnection(jdbcTNSNamesUrl, user, passwordForLocal);
log.info("1. conn:{}", conn);
conn.close();
}//main
}//end class


package org.zerock.myapp;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.Objects;
import lombok.extern.log4j.Log4j2;
@Log4j2
public class Ex2 {
// 1. jdbc구동기 역활을 하는 클래스의 FQCN을 알아야 한다.
// 하지만 이미지 DB별로 정해져 있습니다.(아래는 오라클 JDBC드라버의 구동기 클래스)
// static final String jdbcDriver = "oracle.jdbc.driver.OracleDriver";
static final String jdbcDriver = "oracle.jdbc.OracleDriver";
// 2. JDBC url 설정(EZCONNECT 방식의 url)
static final String jdbEZConnectcUrl = "jdbc:oracle:thin:@DESKTOP-3FD0EM7:1521/XEPDB1";
// 2. JDBC url 설정 (TNSNAMES 방식)
static final String jdbcTNSNamesUrl = "jdbc:oracle:thin:@XEPDB1?TNS_ADMIN=C:/u01/oracle/product/18.0.0/dbhomeXE/network/admin";
// 2. JDBC url 설정 (Oracle Cloud 연결방식)
static final String jdbcOracleCloudUrl = "jdbc:oracle:thin:@atp20191201_high?TNS_ADMIN=c:/opt/OracleCloudWallet/ATP";
//3. 로그인(인증, Authentication) 정보 제공
static final String user = "HR";
static final String passwordForCloud = "Oracle12345678";
static final String passwordForLocal = "oracle";
public static void main(String[] args) {
try {
Connection conn =null; //연결하는 객체
Statement stmt = null; // Connection으로 연결한 객체에게, Query 작업을 실행하기 위한 객체
ResultSet rs = null; //dql결과 어떠한 규격은 지켜야 한다.
PreparedStatement pstmt = null;//
//Step.1 Oracle JDBC Driver Class Loading
// Class.forName(jdbcDriver); //4.~이상부터는 생략되어서 개발자가 더 이상 생략하지 않아도 된다.
//Step.2 Get A Connection By Using TNSNAMES
// conn = DriverManager.getConnection(jdbEZConnectcUrl, user, passwordForLocal);
conn = DriverManager.getConnection(jdbcTNSNamesUrl, user, passwordForLocal);
log.info("1. conn:{}", conn);
//Step.3 GET A Connection form oracle Cloud By Using TNSNAMES
// conn = DriverManager.getConnection(jdbcOracleCloudUrl, user, passwordForCloud);
// log.info("1. conn:{}", conn);
//Step.4 Statement 객체 생성 (용도: Dynamic SQL문장을 생성)
stmt = conn.createStatement(); //return type: Statement
log.info("2. stmt: {}", stmt);
//step.5 수행시킬 SQL 문장을 문자열로 준비
String sql = """
SELECT *
FROM employees
""";
// step 6. 준비된 Statement객체와 SQL문자열로 실제 SQL문장을 실행
// (Oracle Server로 던짐)
rs = stmt.executeQuery(sql); //DQL Query
log.info("3. rs: {}", rs);
//step.8 ResultSet 객체에 있는 모든 행들을 추출
while(rs.next()) {//더 이상 추출할 행들이 없을 때까지 반복
//추출된 각 행의 컬럼들의 값을 얻어낸다!!!
int employeeId = rs.getInt("EMPLOYEE_ID");
String firstName = rs.getString("FIRST_NAME");
String lastName = rs.getString("LAST_NAME");
Timestamp hireDate = rs.getTimestamp("HIRE_DATE");
double salary = rs.getDouble("SALARY");
log.info("employeeId:{}, firstName:{}, lastName:{}, hireDate:{}, salary:{}",
employeeId, firstName, lastName, hireDate, salary);
}//while
assert rs != null; //1st. method
Objects.requireNonNull(rs); //2nd. method 전문가는 체크를 이것으로 한다.
if(rs != null) rs.close(); //3rd. method
// assertNotNull(rs); //4th. method(단 JUnit Test Framework에 속한 메소드)
} catch(SQLException e){
e.printStackTrace();
}finally {
try{if(rs != null) rs.close();} catch(SQLException e){;;}
try{if(stmt != null) stmt.close();} catch(SQLException e){;;}
try{if(conn != null) conn.close();} catch(SQLException e){;;}
}//try-catch-finally
}//main
}//end class

assert rs != null; //1st. method
Objects.requireNonNull(rs); //2nd. method 전문가는 체크를 이것으로 한다.
if(rs != null) rs.close(); //3rd. method
// assertNotNull(rs); //4th. method(단 JUnit Test Framework에 속한 메소드)
try catch 사용하여 예외처리 가능!

package org.zerock.myapp;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.Objects;
import lombok.extern.log4j.Log4j2;
@Log4j2
public class Ex3 {
// 1. jdbc구동기 역활을 하는 클래스의 FQCN을 알아야 한다.
// 하지만 이미지 DB별로 정해져 있습니다.(아래는 오라클 JDBC드라버의 구동기 클래스)
// static final String jdbcDriver = "oracle.jdbc.driver.OracleDriver";
static final String jdbcDriver = "oracle.jdbc.OracleDriver";
// 2. JDBC url 설정(EZCONNECT 방식의 url)
static final String jdbEZConnectcUrl = "jdbc:oracle:thin:@DESKTOP-3FD0EM7:1521/XEPDB1";
// 2. JDBC url 설정 (TNSNAMES 방식)
static final String jdbcTNSNamesUrl = "jdbc:oracle:thin:@XEPDB1?TNS_ADMIN=C:/u01/oracle/product/18.0.0/dbhomeXE/network/admin";
// 2. JDBC url 설정 (Oracle Cloud 연결방식)
static final String jdbcOracleCloudUrl = "jdbc:oracle:thin:@atp20191201_high?TNS_ADMIN=c:/opt/OracleCloudWallet/ATP";
//3. 로그인(인증, Authentication) 정보 제공
static final String user = "HR";
static final String passwordForCloud = "Oracle12345678";
static final String passwordForLocal = "oracle";
public static void main(String[] args) {
// Connection conn =null; //연결하는 객체
Statement stmt = null; // Connection으로 연결한 객체에게, Query 작업을 실행하기 위한 객체
//for Prepared SQL
// PreparedStatement pstmt = null;//for DynamcSQL
ResultSet rs = null; //dql결과 어떠한 규격은 지켜야 한다.
//=================================================
//step.1 수행시킬 SQL 문장을 문자열로 준비
//=================================================
String sql = """
SELECT *
FROM employees
-- ? = Bind Variable
WHERE salary > ?
""";
try (//JAVA7
//Step.2 Get A Connection By Using TNSNAMES
Connection conn = DriverManager.getConnection(jdbcTNSNamesUrl, user, passwordForLocal);
//Step.4 PreparedStatement 객체 생성 (용도: Dynamic SQL문장을 생성)
PreparedStatement pstmt = conn.prepareStatement(sql) ;//for DynamcSQL
) {
log.info("1. conn:{}", conn);
log.info("2. pstmt:{}", pstmt);
// Step.5 준비된 SQL문장의 바은드변수(Bind Variables)에 값을 설정
pstmt.setDouble(1, 1000);
//=================================================
// step 5. 준비된 PreparedStatement객체와 SQL문자열로 실제 SQL문장을 실행
// (Oracle Server로 던짐)
//=================================================
rs = pstmt.executeQuery(); //DQL Query
log.info("3. rs: {}", rs); //결과셋이 나오게 된다.
//=================================================
//step.6 ResultSet 객체에 있는 모든 행들을 추출
//=================================================
while(rs.next()) {//더 이상 추출할 행들이 없을 때까지 반복
//추출된 각 행의 컬럼들의 값을 얻어낸다!!!
int employeeId = rs.getInt("EMPLOYEE_ID");
String firstName = rs.getString("FIRST_NAME");
String lastName = rs.getString("LAST_NAME");
Timestamp hireDate = rs.getTimestamp("HIRE_DATE");
double salary = rs.getDouble("SALARY");
log.info("employeeId:{}, firstName:{}, lastName:{}, hireDate:{}, salary:{}",
employeeId, firstName, lastName, hireDate, salary);
}//while
assert rs != null; //1st. method
Objects.requireNonNull(rs); //2nd. method 전문가는 체크를 이것으로 한다.
if(rs != null) rs.close(); //3rd. method
// assertNotNull(rs); //4th. method(단 JUnit Test Framework에 속한 메소드)
} catch(SQLException e){
e.printStackTrace();
}
}//main
}//end class
package org.zerock.myapp;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.Objects;
import lombok.extern.log4j.Log4j2;
@Log4j2
public class Ex4 {
static final String jdbcDriver = "oracle.jdbc.OracleDriver";
static final String jdbcTNSNamesUrl = "jdbc:oracle:thin:@XEPDB1?TNS_ADMIN=C:/u01/oracle/product/18.0.0/dbhomeXE/network/admin";
// static final String jdbcOracleCloudUrl = "jdbc:oracle:thin:@atp20191201_high?TNS_ADMIN=c:/opt/OracleCloudWallet/ATP";
static final String user = "HR";
static final String passwordForCloud = "Oracle12345678";
static final String passwordForLocal = "oracle";
public static void main(String[] args) {
ResultSet rs = null; //dql결과 어떠한 규격은 지켜야 한다.
//=================================================
//step.1 수행시킬 SQL 문장을 문자열로 준비
//=================================================
String sql = """
SELECT *
FROM employees
-- ? = Bind Variable
WHERE salary > ?
""";
try (//JAVA7
Connection conn = DriverManager.getConnection(jdbcTNSNamesUrl, user, passwordForLocal);
PreparedStatement pstmt = conn.prepareStatement(sql) ;//for DynamcSQL
) {
log.info("1. conn:{}", conn);
log.info("2. pstmt:{}", pstmt);
pstmt.setDouble(1, 1000);
rs = pstmt.executeQuery(); //DQL Query
log.info("3. rs: {}", rs); //결과셋이 나오게 된다.
while(rs.next()) {
int employeeId = rs.getInt("EMPLOYEE_ID");
String firstName = rs.getString("FIRST_NAME");
String lastName = rs.getString("LAST_NAME");
Timestamp hireDate = rs.getTimestamp("HIRE_DATE");
double salary = rs.getDouble("SALARY");
log.info("employeeId:{}, firstName:{}, lastName:{}, hireDate:{}, salary:{}",
employeeId, firstName, lastName, hireDate, salary);
}//while
} catch(SQLException e){
e.printStackTrace();
}
}//main
}//end class
삭제
package org.zerock.myapp;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import lombok.extern.log4j.Log4j2;
@Log4j2
public class Ex4 {
static final String jdbcDriver = "oracle.jdbc.OracleDriver";
static final String jdbcTNSNamesUrl = "jdbc:oracle:thin:@XEPDB1?TNS_ADMIN=C:/u01/oracle/product/18.0.0/dbhomeXE/network/admin";
// static final String jdbcOracleCloudUrl = "jdbc:oracle:thin:@atp20191201_high?TNS_ADMIN=c:/opt/OracleCloudWallet/ATP";
static final String user = "HR";
static final String passwordForCloud = "Oracle12345678";
static final String passwordForLocal = "oracle";
public static void main(String[] args) throws SQLException {
ResultSet rs = null; //dql결과 어떠한 규격은 지켜야 한다.
//=================================================
//step.1 수행시킬 SQL 문장을 문자열로 준비
//=================================================
String sql = """
DELETE FROM EMPLOYEES
WHERE EMPLOYEE_ID = ?;
""";
Connection conn = DriverManager.getConnection(jdbcTNSNamesUrl, user, passwordForLocal);
PreparedStatement pstmt = conn.prepareStatement(sql) ;//for DynamcSQL
try (conn;pstmt;) {
log.info("1. conn:{}", conn);
log.info("2. pstmt:{}", pstmt);
pstmt.setInt(1, 111);
int affectedLines = pstmt.executeUpdate();//DML, DDL, DCL은 실행시키는 쿼리가 틀리다.
//영향받은 행이 몇개이냐를 저장하는 변수!
log.info("3. affectedLines: {}", affectedLines); //결과셋이 나오게 된다.
} catch(SQLException e){
e.printStackTrace();
}//try - catch
}//main
}//end class
package org.zerock.myapp;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import lombok.extern.log4j.Log4j2;
@Log4j2
public class Ex5 {
static final String jdbcDriver = "oracle.jdbc.OracleDriver";
static final String jdbcTNSNamesUrl = "jdbc:oracle:thin:@XEPDB1?TNS_ADMIN=C:/u01/oracle/product/18.0.0/dbhomeXE/network/admin";
// static final String jdbcOracleCloudUrl = "jdbc:oracle:thin:@atp20191201_high?TNS_ADMIN=c:/opt/OracleCloudWallet/ATP";
static final String user = "HR";
static final String passwordForCloud = "Oracle12345678";
static final String passwordForLocal = "oracle";
public static void main(String[] args) {
ResultSet rs = null; //dql결과 어떠한 규격은 지켜야 한다.
//=================================================
//step.1 수행시킬 SQL 문장을 문자열로 준비
//=================================================
String sql = """
DELETE FROM EMPLOYEES
WHERE EMPLOYEE_ID = ?
""";
try (Connection conn = DriverManager.getConnection(jdbcTNSNamesUrl, user, passwordForLocal);
PreparedStatement pstmt = conn.prepareStatement(sql) ;) {
log.info("1. conn:{}", conn);
log.info("2. pstmt:{}", pstmt);
// ==========================================================
// Local Transaction (Local Tx) <=> Global(=Distributed) TX
// ==========================================================
conn.setAutoCommit(false);
pstmt.setInt(1, 112);
int affectedRows = pstmt.executeUpdate();//DML, DDL, DCL은 실행시키는 쿼리가 틀리다.
//영향받은 행이 몇개이냐를 저장하는 변수!
log.info("3. affectedRows: {}", affectedRows); //결과셋이 나오게 된다.
assert affectedRows == 1;
//TCL - Connect 인터페이스의 추상메소드로 선언되어 있습니다.
// conn.commit();
conn.rollback();
} catch(SQLException e){
e.printStackTrace();
}//try - catch
}//main
}//end class

package org.zerock.myapp;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import lombok.extern.log4j.Log4j2;
@Log4j2
public class Ex6 {
static final String jdbcDriver = "oracle.jdbc.OracleDriver";
static final String jdbcTNSNamesUrl = "jdbc:oracle:thin:@XEPDB1?TNS_ADMIN=C:/u01/oracle/product/18.0.0/dbhomeXE/network/admin";
// static final String jdbcOracleCloudUrl = "jdbc:oracle:thin:@atp20191201_high?TNS_ADMIN=c:/opt/OracleCloudWallet/ATP";
static final String user = "HR";
static final String passwordForCloud = "Oracle12345678";
static final String passwordForLocal = "oracle";
public static void main(String[] args) {
ResultSet rs = null; //dql결과 어떠한 규격은 지켜야 한다.
//=================================================
//step.1 수행시킬 SQL 문장을 문자열로 준비
//=================================================
String sql = """
DELETE FROM EMPLOYEES
WHERE EMPLOYEE_ID = ?
""";
try {
Connection conn = DriverManager.getConnection(jdbcTNSNamesUrl, user, passwordForLocal);
conn.setAutoCommit(false);
PreparedStatement pstmt = conn.prepareStatement(sql) ;
log.info("1. conn:{}", conn);
log.info("2. pstmt:{}", pstmt);
try (conn;pstmt;) {
pstmt.setInt(1, 112);
int affectedRows = pstmt.executeUpdate();//DML, DDL, DCL은 실행시키는 쿼리가 틀리다.
//영향받은 행이 몇개이냐를 저장하는 변수!
log.info("3. affectedRows: {}", affectedRows); //결과셋이 나오게 된다.
assert affectedRows == 1;
conn.rollback();
}//Tx종료지점
} catch(SQLException e){
e.printStackTrace();
}//try - catch
}//main
}//end class
package org.zerock.myapp;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import lombok.extern.log4j.Log4j2;
@Log4j2
public class Ex6 {
static final String jdbcDriver = "oracle.jdbc.OracleDriver";
static final String jdbcTNSNamesUrl = "jdbc:oracle:thin:@XEPDB1?TNS_ADMIN=C:/u01/oracle/product/18.0.0/dbhomeXE/network/admin";
// static final String jdbcOracleCloudUrl = "jdbc:oracle:thin:@atp20191201_high?TNS_ADMIN=c:/opt/OracleCloudWallet/ATP";
static final String user = "HR";
static final String passwordForCloud = "Oracle12345678";
static final String passwordForLocal = "oracle";
public static void main(String[] args) {
ResultSet rs = null; //dql결과 어떠한 규격은 지켜야 한다.
//=================================================
//step.1 수행시킬 SQL 문장을 문자열로 준비
//=================================================
String sql = """
DELETE FROM EMPLOYEES
WHERE EMPLOYEE_ID = ?
""";
try {
Connection conn = DriverManager.getConnection(jdbcTNSNamesUrl, user, passwordForLocal);
conn.setAutoCommit(false);
PreparedStatement pstmt = conn.prepareStatement(sql) ;
log.info("1. conn:{}", conn);
log.info("2. pstmt:{}", pstmt);
try (conn; pstmt;) {
pstmt.setInt(1, 112);
pstmt.executeUpdate();//DML, DDL, DCL은 실행시키는 쿼리가 틀리다.
//영향받은 행이 몇개이냐를 저장하는 변수!
conn.commit();
} catch(SQLException e){
conn.rollback();
e.printStackTrace();}
} catch(SQLException e){
e.printStackTrace();
}//try-catch
}//main
}//end class

package org.zerock.myapp;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import lombok.extern.log4j.Log4j2;
@Log4j2
public class Ex6 {
static final String jdbcDriver = "oracle.jdbc.OracleDriver";
static final String jdbcTNSNamesUrl = "jdbc:oracle:thin:@XEPDB1?TNS_ADMIN=C:/u01/oracle/product/18.0.0/dbhomeXE/network/admin";
// static final String jdbcOracleCloudUrl = "jdbc:oracle:thin:@atp20191201_high?TNS_ADMIN=c:/opt/OracleCloudWallet/ATP";
static final String user = "HR";
static final String passwordForCloud = "Oracle12345678";
static final String passwordForLocal = "oracle";
public static void main(String[] args) {
ResultSet rs = null; //dql결과 어떠한 규격은 지켜야 한다.
//=================================================
//step.1 수행시킬 SQL 문장을 문자열로 준비
//=================================================
String sql = """
DELETE FROM EMPLOYEES
WHERE EMPLOYEE_ID = ?
""";
try {
Connection conn = DriverManager.getConnection(jdbcTNSNamesUrl, user, passwordForLocal);
try(conn;) {
conn.setAutoCommit(false);
PreparedStatement pstmt = conn.prepareStatement(sql) ;
try (pstmt;) {
pstmt.setInt(1, 112);
pstmt.executeUpdate();
conn.commit();
}//try- with resources
}catch(SQLException e){
conn.rollback();
e.printStackTrace();}
} catch(SQLException e){
e.printStackTrace();
}
}//main
}//end class

글로벌 트랜잭션은 왜 jcdb에서 사용이 불가능한가.




driverspy log4jdbc 설정
package org.zerock.myapp;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import lombok.extern.log4j.Log4j2;
@Log4j2
public class Ex8 {
//Step.1 jdbcDriver 클래스의 이름을, DriverSpy가 제공하는 클래스로 변경
static final String jdbcDriver = "net.sf.log4jdbc.sql.jdbcapi.DriverSpy";
//Step.2 jdbcUrl에 "log4jdbc"라는 단어를 하나 더 아래와 같이 추가
static final String jdbcOracleCloudUrl = "jdbc:log4jdbc:oracle:thin:@vfx20221212_high?TNS_ADMIN=C:/opt/OracleCloudWallet/ATP";
static final String user = "HR";
static final String passForCloud = "Oracle12345678";
//핵심포인트 : JDBC 프로그래밍 + DriverSpy 추가하여, 디버깅을 원활하게 하자!!!
public static void main(String[] args) {
ResultSet rs = null;
String sql="""
SELECT *
FROM employees
-- ? = Bind Variable
WHERE salary > ?
""";
try {
Connection conn = DriverManager.getConnection(jdbcOracleCloudUrl, user, passForCloud);
PreparedStatement pstmt = conn.prepareStatement(sql);
try (conn; pstmt;) {
log.info("1. conn: {}", conn);
log.info("2. pstmt: {}", pstmt);
pstmt.setDouble(1, 1000);
rs = pstmt.executeQuery();
log.info("3. rs: {}", rs);
while(rs.next()) {
int employeeId = rs.getInt("EMPLOYEE_ID");
String firstName = rs.getString("FIRST_NAME");
String lastName = rs.getString("LAST_NAME");
Timestamp hireDate = rs.getTimestamp("HIRE_DATE");
double salary = rs.getDouble("SALARY");
log.info("employeeId: {}, firstName: {}, lastName: {}, hireDate: {}, salary: {}",
employeeId, firstName, lastName, hireDate, salary);
} // while
} // try-with-resources
} catch(SQLException e) {
e.printStackTrace();
} // try-catch
} // main
} // end class
driverspy log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
<Properties>
<Property name="LOG_PATTERN">%d{HH:mm:ss.SSS} %5p --- [%10.50t] %-1.50c{1.}.%-1.20M:%L: %m%n%ex</Property>
</Properties>
<Appenders>
<Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
<PatternLayout pattern="${LOG_PATTERN}"/>
</Console>
</Appenders>
<Loggers>
<Logger name="org.zerock.myapp" level="trace" />
<!-- <logger name="log4jdbc.log4j2" level="info" additivity="false">
<MarkerFilter marker="LOG4JDBC_OTHER" onMatch="DENY" onMismatch="NEUTRAL"/>
<appender-ref ref="ConsoleAppender"/>
</logger> -->
<logger name="log4jdbc.log4j2" level="info" additivity="false">
<MarkerFilter marker="LOG4JDBC_JDBC" onMatch="DENY" onMismatch="NEUTRAL"/>
<appender-ref ref="ConsoleAppender"/>
</logger>
<Root level="warn">
<AppenderRef ref="ConsoleAppender" />
</Root>
</Loggers>
</Configuration>'코딩 > Database' 카테고리의 다른 글
| 데이터베이스 모델링 (0) | 2023.01.05 |
|---|---|
| 데이터베이스 시스템 (1) | 2023.01.05 |
| 대용량 데이터베이스 솔루션 - 강사님 추천 책 (0) | 2022.12.30 |
| 오라클 데이터베이스 관련자료 (0) | 2022.12.22 |
| dba관련 okky글 (0) | 2022.12.19 |