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:  전체 디버그 로깅 사용

거의 모든 것을 메이븐 페이스를 이클립스가 생성한다.

태그는 데이터를 설명하는 데이터인 메타데이터이다.
project는 최상위 부모태그이고 자식들이 생기게 된다.

정의된 속성은 다른 태그에 사용될 수 있다.

기본생성된 속성으로는

 

컴파일시 수행되는 자바소스는 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으로 간다.

 

TNS_ADMIN환경변수에 가면 atp20191201_high파일의 경로를 알 수 있다.
MYSQL의 구동기 클래스!

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

jdbc에서 두개의 커넥션을 전부 혹은 아무것도 커밋하는 것은 불가능하다. 즉 global트랜잭션이 불가능하다.

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

+ Recent posts