1. JDBC를 이한 DB 접근 3단계


1) 연결하기 -> Connection 생성


2) 질문하기 -> PreparedStatement 생성 후 executeQuery()하기


3) 답변받기 -> ResultSet 이용


개인적으로 생각하는 db 접근 방법이다. 



우선 JDBC를 이용한 DB접근을 하기위해서는 JDBC DRIVER가  필요하다. Oracle, MySQL, MsSQL 등 대부분의 디비에서 JDBC 드라이버를 제공해주기 때문에 알맞는 드라이버를 설치해서 Eclipse에 추가하도록 하자.



public class TestMain { public static void main(String[] args) { String serverURL = "jdbc:mysql://localhost:3306/sys"; // 주소:포트/db명 String id = "root"; // 계정명 String pw = "1234"; // 비밀번호 try { Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection(serverURL, id, pw); String sql = "insert into emp(empno, ename, age, deptno, mgr) values(1, '오라클', 22, 0423, 05)"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.executeUpdate(); } catch (ClassNotFoundException e) { System.out.println("드라이버가 존재하지 않습니다"); } catch (SQLException e) { e.printStackTrace(); } } }


위의 소스는 Mysql에 접속하기위한 커넥션 객체를 생성하고 Insert 문을 실행시키는 소스이다.  여기서 눈여겨 봐야할 부분은


커넥션 생성 부분, SQL 생성후 질의하는 부분 정도로 나눠볼수 있다.


Class.forName("com.mysql.jdbc.Driver");

임포트시킨 mysql connecter.jar 파일안에 있는 드라이버를클래스를 동적으로 생성후


Connection con = DriverManager.getConnection(serverURL, id, pw);


드라이버 매니저 객채를 통해 커넥션을 만든다. 이때 mysqlURL과, 계정, 비밀번호 정보를 파라메터로 넘겨준다.


String sql = "insert into emp(empno, ename, age, deptno, mgr) values(1, '오라클', 22, 0423, 05)";


그후 수행할 SQL문을 sql 변수에 입력 후


PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.executeUpdate();


PrepareStement 객체를 sql문을 넣어 객체를 생성한다.

pstmt.executeUpdate() 메소드를 실행시켜 sql문을 실행한다.




2. Statement


1) Statement 

 - Statement객체는 매개변수없는 간단한 SQL문을 질의할때 사용된다. SQL문을 실행하고 결과값을 받는데 필요한 기본적인 메소드를 제공한다.


2) PreparedStatement  (Statement 상속)

 - StatementStatement 객체는 IN 메개변수를 가지거나 가지지 않은 프리컴파일된 SQL문을 실행하는데 사용되고, IN 매개변수들을 다루기 위한 메소드들이 있다.


3) CallableStatement (PreparedStatement 상속)

 - 데이터베이스 저장 프로시저의 호출을 실행하는데 사용되며, out 매개변수들을 다루기 위한  메소드들이 있따.





3. 쿼리에 따른 실행 메소드


1) execute()

      : SQL문이 여러개의 ResultSet객체나 여러개의 갱신카운트 또는 ResultSet객체들과 갱신 카운트들의 결합을 리턴하는 것이 가능할때 사용한다.


2) executeQuery()

     - 하나의 ResultSet을 만드는 SQL문에서 사용(executeQyery 메소드는 ResultSet 객체를 리턴한다.)

     - 주로 SELECT문을 이용하는 조회에서 사용됨.


3) executeUpdate()

     -  INSERT, UPDATE, DELETE 등 (DML), CREATE, DROP 등(DDL)문들을 실행하는데 사용

 


실행문을 위한 모든 메소드들은 하나가 오픈되어있다면, 호출된 Statement 객체의 현재 ResultSet을 닫아야한다.

이것은 Statement 객체를 다시 실행기전에 현재 ResultSet 객체의 어떠한 처리도 완결해야 할 필요가 있다는 것을 의미한다.

Posted by 루우지




신과함께(인과 연) 

2018

3.5점



쿠키 있음. 영화 끝나고 배우 소개 화면과 엔딩크레딧 중간에 나옴



기대가 컷던걸까 전편보다 못한 후속작이였다. 

마동석을 이용한 코믹적인 요소가 보이긴 했는데 캐릭터들의 과거 회상씬으로 인해 

현재와 과거를 과하게 들락날락한다. 


전편 같은경우에는 사람을 울리기라도 했지 

이번편은 캐릭터의 과거를 풀기위한 내용 전개 때문인지 임팩트가 없었다.


그래도 생각치 못한 반전들이 공개되어 놀라긴했지!





'취미 > 영화' 카테고리의 다른 글

신과 함께(인과 연) 쿠키 정보  (0) 2018.08.13
어벤져스:인피니티 워 + 쿠키정보  (0) 2018.04.26
Posted by 루우지

1. JNI 변수 타입


JNI 변수 타입은 Java의 변수를 C++/C 에서 사용 할수 있게끔 호환해주는 변수 타입이다. 

jni.h를 인클루드하면 사용이 가능한데 자세한 정보는 아래의 표를 보면 알 수 있다.



JAVA 

C++/C 

C++/C 배열 

boolean

jboolean 

jbooleanArray 

byte

jbyte 

jbytArray

char 

jchar 

jcharArray 

short 

jshort 

jshortArray 

int 

jint 

jintArray 

long

jlong 

jlongArray 

float 

jfloat 

jfloatArray 

void 

jvoid 

jvoidArray 

Object 

jobject 

jobjectArray 

String 

jstring 

jstringArray 


java의 기본 변수형은 c++/c언어에서는 j가 붙은 클래스로 제공된다. int -> jint로 객체를 선언해서 사용해주면 되고, 배열도 마찬가지로 j+자료형+Array 객체형태로 생성해서 사용하면 된다.



c++ 에서의 사용 예


void main() {     jstring str;     jint num;     jobject obj;     ... }




2. JNI 시그니처

JNI 시그니처를 사용하는 이유는 JAVA에서 생성한 클래스나 함수에 접근하기위해 C++/C에서 사용하는 구분자라고 보면 된다. 


시그니처 

Type 

byte 

char 

double 

float 

int 

long 

short 

void 

boolean 

L클래스_이름 

패키지 경로/ 클래스 이름 

[ type 

type[] 배열 


public class aa {
	public int testInt(int a) {return a;}
	public String testString(String a) {return a;}
}


위와같은 java 소스에서 aa클래스 안에는 int testint(int) 메서드와 String testString(String) 메서드가 있다.

c++에서 위의 메서드를 콜하기 위해서는 아래와 같은 문법으로 접근해야한다.



void main() {
	jclass cls = (*env)->GetObjectClass(env, obj);
	jmethodID testInt = (*env)->GetMethodID(env, cls, "testInt", "(I)I");
	jint jnum = (*env)->CallIntMethod(env, obj, testInt, num);

	jmethodID testString = (*env)->GetMethodID(env, cls, "testString", "(Ljava.lang.String;)Ljava.lang.String;");
	jstring jstr = (*env)->CallObjectMethod(env, obj, testString, str);
}


GetMethodID()를 이용하여 java함수를 콜할수 있는데 JvmEnv, jclass, "함수명", 시그니처가 매개변수로 들어간다. aa클래스를 담고있는 jclass와 함게 함수명 "testInt" 그리고 시그니처 (I)I 를 넣어줘야 위의 Java에서 생성한  int testInt(int)를 가져올 수 있다.

String 형 같은 경우에는 기본 변수타입이 아니기때문에 Object형식으로 접근해야한다. Ljava.lang.String;으로 시그니처를 입력해야하는데 주의할 점은 ; 세미클론을 빼먹을 경우 인식을 하지 못한다. 이점 유의해서 사용하길 바란다.


String형과같은 Object형을 함수에서 return시키거나 input시킬때에는 해당 클래스의 임포트 경로를 입력해주면된다. 간단하져?




Posted by 루우지

앞서 C++에서 JNI를 사용하기위해 프로젝트 셋팅작업을 끝냈습니다.

이번에는 간단하게 Java class를 생성하여 클래스안에 있는 메서드를 호출하는 예제를 만들어보겠습니다. 

코드는 어려운게 없으니 천천히 따라오시면 쉽게 구현하실수 있습니다.




1. Hello.class 만들기


public class Hello {
	void sayHello() {
		System.out.println("Say HELLOOO");
	}
}


생성자가없는 Hello.java 파일입니다. 간단하게 sysout으로 인사말을 프린트 하는 메서드입니다. 위의 코드를 코딩하셔서 java파일로 만드시고

javac 명령어를 사용하여 java파일은 class파일로 컴파일 시켜주세요


javac Hello.java


위에서 생성한 Hello.class파일을 C:\Java\src 경로에 넣어주세요! 해당 경로는 c++ 에서 java 클래스파일을 읽어올 경로입니다. c++ 프로젝트 내부에 상대경로로 설정하셔도 됩니다만 저는 C드라이브 밑에  간단하게 테스트용으로 생성했습니다.



2. c++ 코딩


#include 
#include 
#include "stdafx.h"
#include 

using namespace std;

void main() {
	// JavaVM 생성 & JVM 환경설정
	JavaVMOption options;
	JavaVMInitArgs vm_args;
	JNIEnv *env;
	JavaVM *jvm;
	long status;

	options.optionString = "-Djava.class.path=C:\\Java\\src"; // 자바 클래스파일이 있는 경로
	memset(&vm_args, 0, sizeof(vm_args));
	vm_args.version = JNI_VERSION_1_6;
	vm_args.nOptions = 1;
	vm_args.options = &options;
	status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);

	cout << "JVM 구동!" << endl;
	jclass cls;
	jmethodID mid;
	jobject obj;
	int staticresult = 0;
	int result = 0;

	if (status != JNI_ERR)
	{
		cls = env->FindClass("Hello");		// Hello.class를 찾아 jclass를 생성한다.

		if (cls != 0)
		{
			jmethodID cls_constructor = env->GetMethodID(cls, "", "()V");		// Hello.class의 기본생성자를 찾아 생성자 메소드를 생성한다.
			if (cls_constructor != 0) {
				obj = env->NewObject(cls, cls_constructor, "()V");		// 클래스와 클래스 생성자를 이용해 객체(object)를 생성한다.
				mid = env->GetMethodID(cls, "sayHello", "()V");			// Hello.class에 정의한 sayHello() 메소드를 찾아 JmethodID 담는다.
				env->CallIntMethod(obj, mid);							// 메소드를 호출하는데 GetMethodID 함수를 이용해 위의 JmethodID를 파라메터로 넘겨준다.
			}
		}
		else
		{
			cout << "클래스를 찾을 수 없습니다." << endl;
			return;
		}

		jvm->DestroyJavaVM();
		cout << "JVM 삭제" << endl;
	}
}

}


간단하게 메인함수에서 호출하게 만들어봤습니다. 1편에서 셋팅을 제대로 하셨다면 컴파일 에러가 없으실꺼에요~


Posted by 루우지


티스토리 툴바