학습 목표
- JDBC를 이용해 입력/수정/삭제/조회 프로그래밍을 할 수 있다.
1번째 강의는 20분짜리 내용은 많은데 스크립트는 코드밖에 없어서 자체해석하면서 설명을 하겠습니다.
앞서 db에 만든 role이라는 테이블을 활용해서 셀렉트하는 과정까지가 이번 20분짜리 강의이다.
먼저 만든 클래스
Role.java
package kr.or.connect.jdbcexam.dto;
public class Role {
private Integer roleId;
private String description;
public Role() {
}
public Role(Integer roleId, String description) {
super();
this.roleId = roleId;
this.description = description;
}
public Integer getRoleId() {
return roleId;
}
public void setRoleId(Integer roleId) {
this.roleId = roleId;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public String toString() {
return "Role [roleId=" + roleId + ", description=" + description + "]";
}
}
데이터를 주고 받기 때문에 get과 post 모두를 활용했다.
조회하길 원하는 데이터는 roleid가 100인 데이터를 조회하는 것이 목적이다.
super로 상속받는 이유는 솔직히 잘 모르겠지만 일단 따라했다.
조회된 roleid와 description을 tostiong을 통해 출력하는 구문이다.
나머지는 이클립스 자체 세팅?으로 구현했다.
두 번째 쿼리문 클래스
RoleDao.java
package kr.or.connect.jdbcexam.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import kr.or.connect.jdbcexam.dto.Role;
public class RoleDao {
private static String dburl = "jdbc:mysql://localhost:3306/connectdb";
private static String dbUser = "connectuser";
private static String dbpasswd = "connect123!@#";
public Role getRole(Integer roleId) {
Role role = null;
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(dburl, dbUser, dbpasswd);
String sql = "SELECT description,role_id FROM role WHERE role_id = ?";
ps = conn.prepareStatement(sql);
ps.setInt(1, roleId);
rs = ps.executeQuery();
if (rs.next()) {
String description = rs.getString(1);
int id = rs.getInt("role_id");
role = new Role(id, description);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return role;
}
}
dburl과 유저, 패스워드는 계속 사용하기 때문에 따로 전역변수로 뺴놓았다.
그리고 조회할 테이블인 role을 만들고
conn, ps, rs를 생성한다.
getRole(Integer roleId)에서 roleId는
내가 셀렉트할 roleId를 의미한다. 나는 100번쨰 roleId값의 데이터가 궁금하기 때문에 저기에는 100이 들어간다.
실행
JDBCExam1.java
package kr.or.connect.jdbcexam;
import kr.or.connect.jdbcexam.dao.RoleDao;
import kr.or.connect.jdbcexam.dto.Role;
public class JDBCExam1 {
public static void main(String[] args) {
RoleDao dao = new RoleDao();
Role role = dao.getRole(100);
System.out.println(role);
}
}
데이터 전체 조회
데이터를 전부 조회하려면 list를 활용해야한다.
알아보기 앞서서 기존의 코드는 null값을 계속 넣고 부분마다 close를 해줘야해서 매우 귀찮았다.
최근에 try with resource라는 문법이 추가되서 이를 무척 간단하게 할 수 있다.
기존 문법과 차이점은
finally부분부터 close가 적힌 코드를 전부 다 지우고, null값이 들어간 conn, ps, rs도 삭제한다.
첫 트라이 구문에 forname으로 드라이버 연결을 하고 쿼리문을 작성한 후
try문에 소괄호부분에서 코드를 작성한다.
try (Connection conn = DriverManager.getConnection(dburl, dbUser, dbpasswd); PreparedStatement ps = conn.prepareStatement(sql)) {}
이게 끝이다. 이후에 close는 자동으로 호출되서 따로 작성할 필요 없다.
이것을 활용해 전체조회를 하는 코드를 살펴보자
package kr.or.connect.jdbcexam.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import kr.or.connect.jdbcexam.dto.Role;
public class RoleDao {
private static String dburl = "jdbc:mysql://localhost:3306/connectdb";
private static String dbUser = "connectuser";
private static String dbpasswd = "connect123!@#";
public List<Role> getRoles() {
List<Role> list = new ArrayList<>();
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
String sql = "SELECT description, role_id FROM role order by role_id desc";
try (Connection conn = DriverManager.getConnection(dburl, dbUser, dbpasswd);
PreparedStatement ps = conn.prepareStatement(sql)) {
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
String description = rs.getString(1);
int id = rs.getInt("role_id");
Role role = new Role(id, description);
list.add(role); // list에 반복할때마다 Role인스턴스를 생성하여 list에 추가한다.
}
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception ex) {
ex.printStackTrace();
}
return list;
}
}
'IT > 부스트코스' 카테고리의 다른 글
DAO와 DTO사용 이유/getter setter (1) | 2020.02.29 |
---|---|
부스트코스 DB연결웹앱 #9 WEB API, REST API (0) | 2020.02.04 |
부스트 코스 DB연결 웹앱#8 JDBC-1 (0) | 2020.02.03 |
부스트코스 DB연결 웹앱#7 SQL-2 (0) | 2020.01.31 |
부스트코스 DB연결 웹앱#7 SQL (0) | 2020.01.30 |