-
[Back End] JDBC - 실습Web Development/부스트코스 - Back-End(Java) 2020. 3. 14. 20:52
JDBC 실습
- 메이븐 프로젝트를 생성한다.
- pom.xml에 jdk버전 관련 설정을 하고, 의존성에 mysql 드라이버를 추가한다.
- mysql에 localhost 사용자를 등록해준다. (아이디 : "connectuser", 비밀번호 : "connect123!@#")
- myqsl에 "connectdb"라는 이름의 DB를 생성한다.
- "connectdb"에 Role 테이블을 생성하고, 샘플 데이터를 몇 개 넣어준다.
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>kr.or.connect</groupId> <artifactId>jdbcexam</artifactId> <version>0.0.1-SNAPSHOT</version> <name>jdbcexam</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> //mysql 5.1.21 드라이버 등록 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.21</version> </dependency> </dependencies> <build> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle --> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.1.0</version> </plugin> <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> </plugin> <plugin> <artifactId>maven-jar-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle --> <plugin> <artifactId>maven-site-plugin</artifactId> <version>3.7.1</version> </plugin> <plugin> <artifactId>maven-project-info-reports-plugin</artifactId> <version>3.0.0</version> </plugin> //jdk8 사용을 위한 플러그인 설정 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.6.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </pluginManagement> </build> </project>
Role.java
package kr.or.connect.jdbcexam.dto; public class Role { //role 테이블을 Java 객체를 정의 private Integer roleId; //컬럼1 (primary key) private String description; //컬럼2 public Role() { } public Role(Integer roleId, String description) { //생성자 super(); this.roleId = roleId; this.description = description; } //아래의 get, set, toString 함수들은 이클립스의 edit-generate 기능으로 손쉽게 만들 수 있다. 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; } //편하게 출력할 목적으로 toString 오버라이딩. @Override public String toString() { return "Role [roleId=" + roleId + ", description=" + description + "]"; } }
RoleDao.java
package kr.or.connect.jdbcexam.dao; import com.mysql.jdbc.Connection; import com.mysql.jdbc.PreparedStatement; import java.sql.DriverManager; 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"; //DB연결에 필요한 정보를 상수화해서 사용 private static String dbUser = "root"; private static String dbpassword = "0000"; 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 = (Connection) DriverManager.getConnection(dburl, dbUser, dbpassword); //접속할 DB의 url, 유저, 비번 String sql = "SELECT description, role_id FROM role WHERE role_id = ?"; ps = (PreparedStatement) conn.prepareStatement(sql); ps.setInt(1, roleId); //sql의 첫번째 ?에 roleId를 넣어준다. rs = ps.executeQuery(); //실행한다. if(rs.next()) { //다음 데이터가 있다면, String description = rs.getString(1); //첫번째 속성(컬럼)의 값(select 기준, 위의 sql문에서 첫번째 컬럼이 description임 ) int id = rs.getInt("role_id"); //role_id 를 얻어온다. 속성명으로 얻어올 수 있다. role = new Role(id,description); //위 두 줄에서 얻어온 데이터로 Role 객체를 만든다. } }catch(Exception e){ e.printStackTrace(); }finally { //finally 구절은 어떤일이 있어도 반드시 실행된다. if(rs != null) {//rs, ps, conn 순서로 close를 해준다. 만약 위에서 conn까지만 할당되고 ps, rs 는 할당이 되지 않았을 수 있다. 그래서 rs가 null인지 체크한다.(ps, conn에도 똑같이 적용) try { rs.close(); //close라는 메소드도 예외를 발생시킬 수 있기에 예외처리를 한다. } catch (SQLException e) { e.printStackTrace(); } } if(ps != null) { try { ps.close(); //close라는 메소드도 예외를 발생시킬 수 있기에 예외처리를 한다. } catch (SQLException e) { e.printStackTrace(); } } if(conn != null) { try { conn.close(); //close라는 메소드도 예외를 발생시킬 수 있기에 예외처리를 한다. } catch (SQLException e) { e.printStackTrace(); } } } return role; } 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 = (Connection) DriverManager.getConnection(dburl, dbUser, dbpassword); PreparedStatement ps = (PreparedStatement) conn.prepareStatement(sql)){ //이렇게 작성하면, DB에서 할당받은 객체를 자동으로 close 한다. (보면 finally 문구가 없다.) try (ResultSet rs = ps.executeQuery()){ //여기서도 이렇게 쓰면 객체를 자동으로 close함 while(rs.next()) { //튜플을 하나씩 꺼내온다. 더 이상 꺼낼 튜플이 없으면 false를 반환하여 종료됨. int id = rs.getInt("role_id"); //db 튜플에서 id를 꺼냄 String description = rs.getString(1); // 튜플에서 description을 꺼냄 Role role = new Role(id, description); // 꺼낸 데이터로 Role 객체를 만듬 list.add(role); //리스트에 추가함 } }catch(Exception ex) { ex.printStackTrace(); } }catch(Exception ex) { ex.printStackTrace(); } return list; } public int addRole(Role role){ int insertCount = 0; Connection conn = null; PreparedStatement ps = null; try { //데이터베이스에 연결이 혹시 끊기는 등의 상황에 대해 예외를 처리해야한다. Class.forName("com.mysql.jdbc.Driver"); //데이터베이스 드라이버 로드 conn = (Connection) DriverManager.getConnection(dburl, dbUser, dbpassword); //접속할 DB의 url, 유저, 비번 String sql = "INSERT INTO role (role_id, description) VALUES (?,?)"; ps = (PreparedStatement) conn.prepareStatement(sql); ps.setInt(1, role.getRoleId()); // 1번째 ?에 얻어온 Role 객체의 ID를 넣어줌 ps.setString(2, role.getDescription()); //2번째 ?에 얻어온 Role 객체의 Description를 넣어줌 insertCount = ps.executeUpdate(); //insert, update를 실행할때 이렇게함 }catch(Exception e){ e.printStackTrace(); }finally { //finally 구절은 어떤일이 있어도 반드시 실행된다. if(ps != null) { try { ps.close(); } catch (SQLException e) {} } if(conn != null) { try { conn.close(); } catch (SQLException e) {} } } return insertCount; } public int deleteRole(Integer roleId){ int deleteCount = 0; try { Class.forName("com.mysql.jdbc.Driver"); //데이터베이스 드라이버 로드 }catch(ClassNotFoundException e) { e.printStackTrace(); } String sql = "DELETE FROM role WHERE role_id = ?"; try (Connection conn = (Connection) DriverManager.getConnection(dburl, dbUser, dbpassword); PreparedStatement ps = (PreparedStatement) conn.prepareStatement(sql)){ //이렇게 작성하면, 예외처리도 하고, DB에서 할당받은 객체를 자동으로 close 한다. (보면 finally 문구가 없다.) ps.setInt(1, roleId); //sql의 첫번째 ?에 roleId를 넣어준다. deleteCount = ps.executeUpdate(); //실행한다. }catch(Exception ex) { ex.printStackTrace(); } return deleteCount; } public int updateRole(Role role){ int updateCount = 0; try { Class.forName("com.mysql.jdbc.Driver"); //데이터베이스 드라이버 로드 }catch(ClassNotFoundException e) { e.printStackTrace(); } String sql = "UPDATE role SET description = ? where role_id = ?"; try (Connection conn = (Connection) DriverManager.getConnection(dburl, dbUser, dbpassword); PreparedStatement ps = (PreparedStatement) conn.prepareStatement(sql)){ //이렇게 작성하면, 예외처리도 하고, DB에서 할당받은 객체를 자동으로 close 한다. (보면 finally 문구가 없다.) ps.setString(1,role.getDescription()); ps.setInt(2, role.getRoleId()); //sql의 첫번째 ?에 roleId를 넣어준다. updateCount = ps.executeUpdate(); }catch(Exception ex) { ex.printStackTrace(); } return updateCount; } }
jdbcExam1.java (Select)
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 role = dao.getRole(100); //dao를 통해 100번 role 객체를 DB에서 받아옴.(select) System.out.println(role); //받아온 객체를 출력 } }
jdbcExam2.java (Insert)
package kr.or.connect.jdbcexam; import kr.or.connect.jdbcexam.dao.RoleDao; import kr.or.connect.jdbcexam.dto.Role; public class JDBCExam2 { public static void main(String[] args) { int roleId = 500; String description = "CTO"; Role role = new Role(roleId, description); RoleDao dao = new RoleDao(); int insertCount = dao.addRole(role); System.out.println(insertCount); } }
jdbcExam3.java (Select *)
package kr.or.connect.jdbcexam; import kr.or.connect.jdbcexam.dao.RoleDao; import kr.or.connect.jdbcexam.dto.Role; import java.util.List; public class JDBCExam3 { public static void main(String[] args) { RoleDao dao = new RoleDao(); List<Role> list = dao.getRoles(); for(Role role : list) { System.out.println(role); } } }
jdbcExam4.java (Delete)
package kr.or.connect.jdbcexam; import kr.or.connect.jdbcexam.dao.RoleDao; public class JDBCExam4 { public static void main(String[] args) { int roleId = 500; RoleDao dao = new RoleDao(); int deleteCount = dao.deleteRole(roleId); System.out.println(deleteCount); } }
jdbcExam5.java (Update)
package kr.or.connect.jdbcexam; import kr.or.connect.jdbcexam.dao.RoleDao; import kr.or.connect.jdbcexam.dto.Role; public class JDBCExam5 { public static void main(String[] args) { int roleId = 1; String description = "CEO"; Role role = new Role(roleId, description); RoleDao dao = new RoleDao(); int updateCount = dao.updateRole(role); System.out.println(updateCount); } }
'Web Development > 부스트코스 - Back-End(Java)' 카테고리의 다른 글
[Back End] Web API (0) 2020.03.14 [Back End] Rest API (0) 2020.03.14 [Back End] JDBC (0) 2020.03.14 [Back End] JSTL, EL, Maven (0) 2020.03.09 [Back End] Scope (0) 2020.03.07