본문 바로가기
프로그램/JAVA

[ Java ] JDBC를 이용한 MySql 연동 (첫번째)

by 구서기 2014. 7. 22.

Lastupdate 2014. 10. 30 

FLEX를 사용할때 DB와 연계를 위해 JAVA를 사용한다.

그외의 방법도 있겠지만 (JSP, PHP 등등) 

그런데 FLEX 와 JAVA 사이에  또 Blazeds 와 같은 중간 매개체 가 있어야 하니.... (왕짜증...)

그래서 FLEX에서 바로 JAVA와 통신하기 위해 서블릿을 사용 (그럼 향후 FLEX가 아니더라도 클래스는 그대로 사용할 수 있지 않겠는가? ^^)

 

그를 위한 초석! 우선 DB컨텍션 클래스를 만들자

 

package drv;
/**
 *  모듈이름		Mysql JDBC 컨넥션
 *  작성일자		2011.	03.	 02	
 * 			2014. 07. 21	Select 문 필드명까지 리턴 
 * 					(Servlet 에서 사용하기 위해 수정함)
 *  작성자명		Hwang kyuseok
 *  	참고
 * 	사용예포함 
 * 	쿼리문 내부로직	쿼리문실행전 connect 결과 리턴후 disconnect
 * 	mysql-connector-java-5.1.6-bin.jar 드라이버위치 \java\jre6\lib\ext\ 
 * */


import java.sql.Connection; 
import java.sql.DriverManager;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
import java.util.*;


public class Hmysqlconnect {

	//DB 접속 변수
	private Connection con = null;
	private Statement stmt = null;
	private ResultSet rs = null;
	
	private String user;
	private String pwd;

	private String dbname;
	private String dbip;
	private int 		dbport;
	private String url;		//String url = "jdbc:mysql://DB IP:DB Port/DB name";
	
	/**********************************************************************************************
	 * 생성자함수 DB접속정보 전달
	 * @param 0:dbip, 1:dbport, 2:dbname, 3:user, 4:pwd
	 * ********************************************************************************************/
	public Hmysqlconnect(String ...strings)
	{
		dbip 		= strings[0];
		dbport	= Integer.parseInt(strings[1]);
		dbname	= strings[2];
		user		= strings[3];
		pwd 		= strings[4];
		url		= "jdbc:mysql://" + dbip + ":" + dbport + "/" + dbname;
	}
	/********************************************************************************************** 
	 * 트랜잭션을 사용한 INSERT / UPDATE / DELETE 쿼리문 실행 클래스  
	 * @param strSql[] 쿼리문
	 * @return 성공:쿼리문갯수, 실패:-1
	 * ********************************************************************************************/
	public int fn_ExecuteU2(String[] strSql) throws SQLException 
	{
		int icnt = 0;
		int iret = -1;
		int i;
		icnt = strSql.length;	//배열갯수
		fn_Connect(1);
		try {
			for(i=0;i <icnt;i++) {
				stmt.executeUpdate(strSql[i]);
			}
			iret = icnt;
			con.commit();
		}
		catch(Exception e){	//catch(SQLException e) 
			iret = -1;
			con.rollback();
		}
		finally{
			fn_Disconnect(1);
		}
		return iret;
	}
	/**********************************************************************************************
	 * 트랜잭션을 사용하지 않는 INSERT / UPDATE / DELETE 쿼리문 실행 클래스  (2014.10.07추가)
	 * @param strSql[] 쿼리문
	 * @return 성공:쿼리문갯수, 양수이면 개수만큼 쿼리문실행 / -이면 갯수만큼만 성공 / 0이면 처음부터 실패
	 * ********************************************************************************************/
	public int fn_ExecuteU(String[] strSql) throws SQLException 
	{
		int icnt = 0;
		int iret = -1;
		int i=0;
		icnt = strSql.length;	//배열갯수
		fn_Connect(0);
		try {
			for(i=0;i<icnt;i++) {
				stmt.executeUpdate(strSql[i]);
			}
			iret = icnt;
		}
		catch(Exception e){	//catch(SQLException e) 
			iret = -1 * i;
		}
		finally{
			fn_Disconnect(0);
		}
		return iret;
	}
	/**********************************************************************************************
	 * DB SELECT 쿼리문 실행 클래스
	 * @param strSql 쿼리문
	 * @return Hmysqlconnect_ret 제너릭(클래스) 리턴
	 * ********************************************************************************************/
	public ArrayList<Hmysqlconnect_ret> fn_ExecuteS(String strSql)
	{
		int	i;
		int field_cnt;
		String[][] s;// 필드로 사용할  배열변수
		ArrayList<Hmysqlconnect_ret> al = new ArrayList<Hmysqlconnect_ret>();		
		fn_Connect(0);
		//
		try {
			rs = stmt.executeQuery(strSql); 
			ResultSetMetaData metadata = rs.getMetaData();
			field_cnt =metadata.getColumnCount();	//필드 갯수 
			while(rs.next()){
				s = new String[2][field_cnt];	//필드갯수만큼 배열공간잡기
				for(i=0;i <field_cnt;i++){
					s[0][i] = metadata.getColumnLabel(i+1);	//필드명	
					s[1][i] = rs.getString(i+1);		//데이터
				}
				al.add(new Hmysqlconnect_ret(s)); 
			}
		}
		catch(Exception e){
			e.printStackTrace();
		}
		finally{
			fn_Disconnect(0);
		}
		return al; 
	} 	
	
	/**********************************************************************************************
	 * DB 연결
	 * ********************************************************************************************/
	private void fn_Connect(int imode)
	{
		try {
			////Class.forName("org.gjt.mm.mysql.Driver");
			Class.forName("com.mysql.jdbc.Driver");
			
			con = DriverManager.getConnection(url,user,pwd);
			if(imode == 1)	con.setAutoCommit(false);
			stmt = con.createStatement();
		}
		catch(Exception e){
			e.printStackTrace();
		}
	}
	
	/**********************************************************************************************
	 * DB 연결끊기
	 * @param imode 0-일반  1-트랜잭션 
	 * *********************************************************************************************/
	private void fn_Disconnect(int imode)
	{
		if(stmt != null) try { stmt.close(); }
		catch(Exception e){ }
		if(con != null) 
			try {	
				if(imode == 1)con.setAutoCommit(true);
				con.close(); 
			}
			catch(Exception e){ }
	}
	/**********************************************************************************************
	 * 제너릭으로 사용할 클래스
	 * ********************************************************************************************/
	public class Hmysqlconnect_ret {
		public String[][] s;// 필드 배열([2][?] = 0:필드명,1:데이터)
		public Hmysqlconnect_ret(String[][] s) 
		{   
			this.s = s; 
		}
	}
	//#######################################################################
	/**
	 * 사용예
	 * */
	public static void main(String[] args) {
		
		ArrayList<Hmysqlconnect_ret> al = new ArrayList <Hmysqlconnect_ret>();	//리턴 배열선언
		//디비연결 클래스선언 (DB접속정보 파라메터)
		Hmysqlconnect test = new Hmysqlconnect("DBip","DBport","DBname","DBid","DBpassword");	
                                
                               //============================
 		//SELECT쿼리문 사용예
		al = test.fn_ExecuteS("SELECT * FROM tbl_login  ORDER BY  C_name DESC");					
		System.out.println("레코드갯수: " +  al.size() ); 		//행,레코드갯수 
		System.out.println("필드갯수: " + ((String[])al.get(0).s[0]).length); 	//열,필드갯수
		//첫번째레코드
		System.out.println("첫번째레코드 세번째필드명: " + ((String[])al.get(0).s[0])[3]);//세번째 필드명
		System.out.println("첫번째레코드 세번째데이터: " + ((String[])al.get(0).s[1])[3]);//세번째 데이터
		
                                //=============================
		//INSERT쿼리문 사용예
		String[] strSql = new String[1];
		//strSql[0] = "INSERT INTO tbl_login (C_id,C_pass,C_name) VALUES('guest','1234','손님')";
		strSql[0] = "DELETE FROM tbl_login WHERE C_id = ' guest' ";
		try {
			int ret = test.fn_ExecuteU2(strSql);
			System.out.println("결과: " + ret);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

 

※ 실행결과

레코드갯수: 4
필드갯수: 9
첫번째레코드 세번째필드명: C_name
첫번째레코드 세번째데이터: 황규석
결과: 1