
오늘은 자바가 끝나고 데이터베이스 시작날이다! 벌써 자바가 끝난 게 믿기지 않지만... 나의 반려 복습 친구들만 늘어난다 ㅎ
스프링부트로 넘어 가기 전, 데이터베이스를 다뤄야 하기 때문에 기본적인 sql은 다룰줄 알아야 한다.
강의에서는 MariaDB를 이용하지만 sql을 다루는데 tool은 별로 상관이 없다. 나는 주로 oracle을 사용 했지만 차이점은 거의 없는 것 같다. 마리아디비를 쓰는게 훨씬 직관적이라서 편한 것 같긴 하다.
쿼리를 작성할 때 가장 기본이 되는 형태이다.
SELECT 출력할 컬럼, FROM 테이블 이름, WHERE 조건
AS는 기존에 있는 이름명이 아니고 새롭게 별칭을 붙이는 걸 말한다. 예를 들어 FROM 직업 AS 미래직업 이렇게 표현하면, 직접 테이블명이 미래직업이라는 별칭을 갖게 된다.
LIKE와 %는 거의 같이 쓰이는 코드이다.
LIKE '%a%'; -> a를 포함.
퍼센트 앞뒤로!
AND 연산자는 OR 연산자 보다 우선순위가 높다.
LIMIT 0, 10;
시작하는 인덱스, 개수.
정렬을 할 때 디폴트 값은 오름차순이다. 쿼리를 넣는 순서를 잘 고려해야 한다.
사용 툴 : 인텔리제이 (무료 버전)
DB : MariaDB.
mariaDB jar 설치
https://mvnrepository.com/

설치한 jar 파일을 프로젝트에 옮기고 라이브러리에 추가한다.
DB 연결 코드 작성
연결 코드는 공통!
드라이버 로딩
Class.forName("org.mariadb.jdbc.Driver");
DB 연결
Connection con = DriverManager.getConnection(url, id, pw);
String url = "jdbc:mariadb://localhost:3306/java";
명령문 실행하기 위한
PreparedStatement stmt = conn.prepareStatement(sql);
String sql = "select * from emp limit 0, 10";
쿼리 실행 코드
ResultSet rs = stmt.executeQuery();
데이터 가리키는 커서 역할
rs.next();
int id2 = rs.getInt("id");
String address = rs.getString("address");
String name = rs.getString("name");
닫는 코드
rs.close();
stmt.close();
con.close();
순서 중요!
기본적으로 try - catch - finally를 사용한다.
close() 문장들은 빼고, 모두 try 에 집어 넣고, close는 finally로 넣는다.
finally 에 있는 rs, stmt, con 변수를 모두 사용하기 위해서는 try 위에서 선언이 되어야 하기 때문에,
Connection con = null;
PreparedStatement stmt = null; ->+ sql injection 방어
ResultSet rs = null;
위처럼 null로 선언해 주어야 한다.
그리고, finally에 있는 코드들도 try - catch로 예외처리를 하고, if 문으로 null이 아니라는 조건문을 주면 예외처리가 모두 완성된다.
import java.sql.*;
public class Jdbc {
public static void main(String[] args) {
Connection con = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
Class.forName("org.mariadb.jdbc.Driver");//로
String url = "jdbc:mariadb://localhost:3306/java"; //연결
String id = "아이디 이름";
String pw = "비밀번호";
con = DriverManager.getConnection(url, id, pw);
String sql = "select * from holiday_parking limit 0, 10";
stmt = con.prepareStatement(sql);
rs = stmt.executeQuery(); //sql 조회된 모습
while(rs.next()) {
// rs.next(); 커서로 데이터 가리키게 됨
int id2 = rs.getInt("id");
String address = rs.getString("address");
String name = rs.getString("name");
System.out.println(id2);
System.out.println(address);
System.out.println(name);
}
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
try {
if(rs != null) rs.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
try {
if(stmt != null) stmt.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
try {
if(con != null) con.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
}
DAO -> 데이터 제어 객체
DTO -> 데이터 전송 객체
empDAO를 만들면 그 안에 SELECT, INSERT, UPDATE, DELETE가 들어 있다. 그러면, 이곳에 db연결 코드도 같이 들어가고, 연결해서 이곳에서 sql문을 제어하는 것이다.
empDTO
-> emp테이블에 있는 객체 속성들이 모두 들어 있어야 한다.
-> getter, setter 생성
-> 우리가 보기 쉬운 형태로 바꾸기 위해서 toString()을 오버라이드 해야 한다.
1. 생성자 생성
empDTO dto = new empDTO();
int empno;
String name;
String job;
-> emp 테이블에 있는 속성들
2. 스트링 오버라이드 (결과 출력 알 수 있게 들어오도록)
@Override
public String toString() {
return "HoildayParkingDTO{" +
"사번=" + empno +
", 이름='" + name + '\'' +
", 부서='" + job + '\'' +
'}';
}
3. getter setter
public int getEmpno() {
return empno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
...etc....
public class empDAO {
public List<empDTO> select() { // 여러 값을 담기 위해서 리스트로 변경
List<HoildayParkingDTO> list = new ArrayList<>(); 리스트 객체 생성
위에서 봤던 db 연결 코드
...
while(rs.next()) {
empDTO dto = new empDTO(); // dto 객체 생성
rs.next();
int empno2 = rs.getInt("empno");
String job = rs.getString("job");
String name = rs.getString("name");
dto.setId(id2);
dto.setAddress(job);
dto.setName(name);
-> 생성한 dto 객체를 이용해서 dto안에 있는 도구들 사용.
list.add(dto);
-> 리스트에 dto 담기.
}
...
return list;
empDAO dao = new empDAO();
List<empDTO> result = dao.select();
System.out.println(result);
이렇게 실행하면 값이 잘 들어오는 것을 확인할 수 있다.
이로써.. db와 자바의 연결이 끝났다. 이 형식은 공통이므로 눈을 감더라도 쓸 수 있게 익숙해져야 한다고 한다. 틈날때마다 코드를 들여봐야겠다.