본문 바로가기
데이터베이스/환경설정 및 개발

Java를 사용하여 DB연결

by 코이킹 2023. 7. 10.
반응형

최근 담당한 업무에서 다양한 DB를 만져야할 필요가 생겨 개발환경 구축을 했고 그 기록을 남긴다.

 

 

작업환경 및 전제조건

- Windows10 Home의 wsl에서 도커환경을 구축

- DBeaver설치(DB접속확인용)

- https://koiking.tistory.com/121 이 포스트대로 DB설치가 끝나있을 것

 

 

1. 라이브러리 준비하기  

라이브러리 의존성관리는 gradle을 사용했다. 

	// 11g의 드라이버는 MavenCetral에서 다운로드가 안되므로 직접 다운로드 하여 경로를 지정
    implementation files('libs/ojdbc6.jar') // ojdbc6.jar 파일의 경로를 지정합니다.

    // MySQL JDBC 드라이버 의존성 추가
    implementation 'mysql:mysql-connector-java:8.0.27'

	// PostgreSQL JDBC 드라이버 의존성 추가
    implementation 'org.postgresql:postgresql:42.2.24'

오라클의 11g를 지원하는  jdbc 드라이버는 mavenCentral에서 다운로드가 되지 않아. 

파일을 직접 참조할 수 있도록 했다. 

2. 코드 설명 

※ 전체코드 

https://github.com/leeyoungseung/database-ex/commit/8df39dcc05637bdb87f4c7273c4b92f5084253c6

public class DB_01_Connection {

	static Map<String, DB_Env> dbs;

    // 1. DB에 접속하기 위한 설정 값을 Map에 저장
    public static void init() {
    	dbs = new HashMap<String, DB_Env>();
    	dbs.put("oracle", new DB_Env("jdbc:oracle:thin:@localhost:1521:xe",
    			"hr",
    			"1234",
    			"oracle.jdbc.driver.OracleDriver",
    			"SELECT * FROM JOB_HISTORY WHERE ROWNUM <= 100"));
    	dbs.put("mysql", new DB_Env("jdbc:mysql://localhost:3307/world",
    			"root",
    			"mysql",
    			"com.mysql.cj.jdbc.Driver",
    			"SELECT * FROM city LIMIT 100"));
    	dbs.put("postgresql", new DB_Env("jdbc:postgresql://localhost:5433/postgres",
    			"admin",
    			"postgres",
    			"org.postgresql.Driver",
    			"SELECT * FROM category LIMIT 100"));
	}

    // 2. 실행시 파라미터로 oracle 또는 mysql 또는 postgresql을 설정한다.
	public static void main(String[] args) {
		init();

		if (args.length == 0 || args[0].equals("") || !dbs.containsKey(args[0])) {
			System.out.println("Param Error : "+args[0]);
			System.exit(100);
		}

		// JDBC 연결 정보 설정
		DB_Env env = dbs.get(args[0]);

        String url      = env.getUrl();
        String username = env.getUserName();
        String password = env.getPasswd();
        String driver   = env.getDriver();
        String sql      = env.getTestSql();

        // JDBC 드라이버 로드
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            return;
        }

        // 데이터베이스 연결
        PreparedStatement ps;
        ResultSet rs;
        try (Connection conn = DriverManager.getConnection(url, username, password)) {
            System.out.println("Connection Success -> " + env.toString());

            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();

            switch (args[0]) {
			case "oracle":
				selectTestOracle(rs); break;
			case "mysql":
				selectTesMySQL(rs); break;
			case "postgresql":
				selectTestPostgreSQL(rs); break;
			default: break;
			}

            rs.close();
            ps.close();
            conn.close();

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

// 3. ResultSet을 통해 SQL의 실행결과를 가져오는데 데이터 타입을 미리알고 있어야 한다.  
	public static void selectTestOracle(ResultSet rs) throws SQLException {
		while (rs.next()) {
			int employeeId = rs.getInt("EMPLOYEE_ID");
			Date startDate = rs.getDate("START_DATE");
			Date endDate = rs.getDate("END_DATE");
			String jobId = rs.getString("JOB_ID");
			System.out.printf("%s, %s, %s, %s \n", employeeId, startDate, endDate, jobId);
		}
	}

	public static void selectTesMySQL(ResultSet rs) throws SQLException {
		while (rs.next()) {
			int id = rs.getInt("ID");
			String name = rs.getString("Name");
			String countryCode = rs.getString("CountryCode");
			String district = rs.getString("District");
			int population = rs.getInt("Population");
			System.out.printf("%s, %s, %s, %s %s \n", id, name, countryCode, district, population);
		}
	}

	public static void selectTestPostgreSQL(ResultSet rs) throws SQLException {
		while (rs.next()) {
			String category_major_cd = rs.getString("category_major_cd");
			String category_major_name = rs.getString("category_major_name");
			String category_medium_cd = rs.getString("category_medium_cd");
			String category_medium_name = rs.getString("category_medium_name");
			String category_small_cd = rs.getString("category_small_cd");
			String category_small_name = rs.getString("category_small_name");
			System.out.printf("%s, %s, %s, %s, %s, %s \n",
					category_major_cd, category_major_name, category_medium_cd,
					category_medium_name, category_small_cd, category_small_name);
		}
	}

}

// DB 접속을 위한 설정값을 넣기위한 클래스
class DB_Env {
	private String url;
	private String userName;
	private String passwd;
	private String driver;
	private String testSql;

	public DB_Env(String url, String userName, String passwd, String driver, String testSql) {
		super();
		this.url = url;
		this.userName = userName;
		this.passwd = passwd;
		this.driver = driver;
		this.testSql = testSql;
	}

	@Override
	public String toString() {
		return "DB_Env [url=" + url + ", userName=" + userName + ", passwd=" + passwd + ", driver=" + driver + ", testSql=" + testSql + "]";
	}

	public String getUrl() { return url; }
	public String getUserName() { return userName; }
	public String getPasswd() { return passwd; }
	public String getDriver() { return driver; }
	public String getTestSql() { return testSql; }

}

 

3. 연결확인 

 

반응형

댓글