JDBC - CRUD 구현하기
in Web Dev on Java Spring
- 전체적 구조는 이전 포스트 참고
- 에러가 발생될 경우가 많아서, try catch 문이 아주 많이 사용됐다.
- Retrieve는 Role객체를 반환해 주지만, Create,Update,Delete는 몇개가 수행되었는지 숫자정보가 반환된다.
- CRUD 공통으로 jdbcDriver => Connection => PreparedStatement 객체를 부르고, Retrieve는 결과 객체를 받아야하기 때문에 ResultSet 객체를 추가로 부른다.
- 전체코드는 아주 맨 아래에…
Create
RoleDao.java
jdbcDriver 불러서 dburl, dbuser, dbpwd 넣어 Connection 객체를 불러오고,
Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(dburl,dbuser,dbpasswd);
Connection 객체에서 preparedStatement 메소드 안에 sql명령어를 넣어서 PreparedStatement 객체를 가져오고
String sql="INSERT INTO role (role_id,description) VALUES(?,?)"; PreparedStatement ps= conn.prepareStatement(sql);
PreparedStatement 객체에서 setInt(), setString()를 해서 위 sql명령어의 ?,?의 값을 넣어준다.
ps.setInt(1, role.getRoleId()); ps.setString(2,role.getDescription());
executeUpdate하면, 쿼리문이 수행되고, 몇개가 처리됐는지 알려주는 숫자가 반환된다.
public int addRole(Role role) { int insertCount =0; //드라이버 로드 try{ Class.forName("com.mysql.jdbc.Driver"); }catch(ClassNotFoundException e){ e.printStackTrace(); } String sql="INSERT INTO role (role_id,description) VALUES(?,?)"; //여기 try catch문, dburl dbUser, dbpasswd는 클래스 변수로 선언됐다. 전체 코드는 맨아래에 try(Connection conn = DriverManager.getConnection(dburl, dbUser, dbpasswd); PreparedStatement ps = conn.prepareStatement(sql)) { ps.setInt(1, role.getRoleId()); ps.setString(2,role.getDescription()); insertCount = ps.executeUpdate(); }catch(Exception ex) { ex.printStackTrace(); } return insertCount; }
JDBCExam4.java
- RoleDao 객체를 불러서 addRole로 mysql 테이블에 정보를 추가한다.
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 = 501; String description = "CTO"; Role role = new Role(roleId, description); RoleDao dao = new RoleDao(); int insertCount = dao.addRole(role); System.out.println(insertCount); } }
Retrieve - One Item
RoleDao.java
DriverManager 객체에서 getConnection(dburl, dbuser, dbpwd)로 Connection 객체를 부른다.
Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(dburl,dbUser,dbpasswd);
Connection 객체의prepareStatement(쿼리문)으로 PreparedStatement 객체를 얻는다.
String sql = "SELECT role_id,description FROM role WHERE role_id=?"; PreparedStatement ps = Connection.prepareStatement(sql);
PreparedStatement 객체에서 setInt()로 위 sql명령어의 ?의 값을 넣어준다.
ps.setInt(1,roleId);
PreparedStatement 객체의 executeQuery로 ResultSet 객체를 얻는다.
- 쿼리문이 select일 때, executeQuery 하면 ResultSet이 리턴된다.
rs = ps.executeQuery();
ResultSet객체의 next()로 정보를 빼와 Role 객체에 넣어주고, Role객체를 리턴해준다.
if(rs.next()) { int id= rs.getInt(1);//rs.getInt("role_id"); 이렇게 해도 된다. String description = rs.getString(2); role = new Role(id,description); }
finally는 항상 실행된다. 객체가 있는지 확인하고 사용이 끝났으면 꼭 다 닫아준다.
public Role getRole(Integer roleId) { Role role = null; Connection conn =null; PreparedStatement ps =null; ResultSet rs = null; try { //load the driver to memory? Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(dburl,dbUser,dbpasswd); //? 에 다른게 들어갈 수 있다. set 으로 설정할 수 있음 String sql = "SELECT role_id,description FROM role WHERE role_id =?"; ps=conn.prepareStatement(sql); ps.setInt(1, roleId); rs = ps.executeQuery(); // 있으면, 객체 리턴. 없으면 false리턴 if(rs.next()) { int id= rs.getInt(1);//rs.getInt("role_id"); 이렇게 해도 된다. String description = rs.getString(2); role = new Role(id,description); } }catch(Exception e){ e.printStackTrace(); }finally{ if(conn!=null) { try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(ps!=null) { try { ps.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(rs!=null) { try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return role; }
JDBCExample1.java
- RoleDao 객체를 불러서 getRole로 Role객체를 받아온다.
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); } }
Retrieve - All Items
RoleDao.java
위 Retrieve - One이랑 거의 다 같고 , mysql 테이블에 저장된 모든 행을 List<Role>에 받는다.
모든 리스트를 가져온다. 쿼리문은 다음과 같다.
String sql = "SELECT description,role_id FROM role order by role_id desc";
리스트를 빼서 어레이리스트에 다음과 같이 넣어준다.
while(rs.next()) { String description = rs.getString(1); int id=rs.getInt("role_id"); Role role = new Role(id,description); list.add(role); }
getRoles() 전체 코드
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문 안에 또 try문이 있다. 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); } }catch(Exception e){ e.printStackTrace(); } }catch(Exception ex) { ex.printStackTrace(); } return list; }
JDBCExam3.java
- RoleDao 객체를 불러서 getRoles로 Role 객체들이 담긴 어레이리스트를 받는다.
package kr.or.connect.jdbcexam; import java.util.List; import kr.or.connect.jdbcexam.dao.RoleDao; import kr.or.connect.jdbcexam.dto.Role; 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); } } }
Update
RoleDao.java
jdbc DriverManager를 불러와 getConnection() 메소드로 Connection 객체를 불러온다. (db에 접속)
Class.forName("com.mysql.jdbc.Driver"); Connection conn=DriverManager.getConnection(dburl,ubuser,dbpwd);
Connection 객체에서 prepareStatement(쿼리문) 메소드로 PreparedStatement 객체를 얻는다.
String sql = "UPDATE ROLE SET DESCRIPTION = ? WHERE role_id =?"; PreparedStatement ps = conn.prepareStatement(sql);
PreparedStatement 객체의 setInt(),setString() 메소드로 위 sql명령어의 ?의 값을 넣어준다.
ps.setString(1,role.getDescription()); ps.setInt(2, role.getRoleId());
PreparedStatement 객체의 executeUpdate() 로 쿼리문을 수행한다.
public int updateRole(Role role) { int updateCount =0; Connection conn=null; PreparedStatement ps = null; try { Class.forName("com.mysql.jdbc.Driver"); conn=DriverManager.getConnection(dburl,dbUser,dbpasswd); String sql="UPDATE ROLE SET DESCRIPTION = ? WHERE role_id =?"; ps = conn.prepareStatement(sql); ps.setString(1,role.getDescription()); ps.setInt(2, role.getRoleId()); updateCount=ps.executeUpdate(); }catch(Exception ex) { ex.printStackTrace(); }finally { if(ps!=null) { try { ps.close(); }catch(Exception ex) { } } if(conn!=null) { try { conn.close(); }catch(Exception ex) {} } } return updateCount; }
JDBCExam5.java
- RoleDao 객체를 불러서 updateRole로 mysql role테이블에 저장된 정보를 수정한다.
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 = 501; String description ="ECO"; Role role = new Role(roleId,description); RoleDao dao=new RoleDao(); int updateCount = dao.updateRole(role); System.out.println(updateCount); } }
Delete
RoleDao.java
jdbcDriver를 로드하고, Connection 객체를 불러온다.
Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(dburl,dbuser,dbpwd);
Connection 객체의 prepareStatement(쿼리문)으로 PreparedStatement 객체를 받는다.
String sql= "DELETE FROM role WHERE role_id=?"; PreparedStatement ps = conn.prepareStatement(sql);
- PreparedStatement 객체의 setInt 메소드로, 쿼리문의 ?의 값을 넣는다.
- PrepareStatement객체의 executeUpdate 메소드로 쿼리문을 실행하고 결과를 받는다.
public int deleteRole(int roleId) { int deleteCount = 0; Connection conn=null; PreparedStatement ps = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(dburl,dbUser,dbpasswd); String sql = "DELETE FROM role WHERE role_id=?"; ps = conn.prepareStatement(sql); ps.setInt(1, roleId); deleteCount = ps.executeUpdate(); }catch(Exception ex){ ex.printStackTrace(); }finally { if(ps!=null) { try { ps.close(); }catch(Exception ex) { } } } return deleteCount; }
JDBCExam4.java
- RoleDao 객체를 불러서 deleteRole로 mysql role테이블에 저장된 정보를 삭제한다.
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); } }
전체 코드
Role.java
package kr.or.connect.jdbcexam.dto;
public class Role {
private Integer roleId;
private String description;
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 + "]";
}
}
RoleDao.java
package kr.or.connect.jdbcexam.dao;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.sql.Connection;
import java.sql.PreparedStatement;
import kr.or.connect.jdbcexam.dto.Role;
public class RoleDao {
private static String dburl = "jdbc:mysql://localhost:3306/cutePin?serverTimezone=Asia/Seoul&useSSL=false";
private static String dbUser = "callie";
private static String dbpasswd = "connect123!@#";
public Role getRole(Integer roleId) {
Role role = null;
Connection conn =null;
PreparedStatement ps =null;
ResultSet rs = null;
try {
//load the driver to memory?
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(dburl,dbUser,dbpasswd);
//? 에 다른게 들어갈 수 있다. set 으로 설정할 수 있음
String sql = "SELECT role_id,description FROM role WHERE role_id =?";
//
ps=conn.prepareStatement(sql);
ps.setInt(1, roleId);
rs = ps.executeQuery();
// 있으면, 객체 리턴. 없으면 false리턴
if(rs.next()) {
int id= rs.getInt(1);//rs.getInt("role_id"); 이렇게 해도 된다.
String description = rs.getString(2);
role = new Role(id,description);
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(ps!=null) {
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return role;
}
public int addRole(Role role) {
int insertCount =0;
//드라이버 로드
try {
Class.forName("com.mysql.jdbc.Driver");
}catch(ClassNotFoundException e){
e.printStackTrace();
}
String sql="INSERT INTO role (role_id,description) VALUES(?,?)";
//여기 try catch문 신기
try(Connection conn = DriverManager.getConnection(dburl, dbUser, dbpasswd);
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setInt(1, role.getRoleId());
ps.setString(2,role.getDescription());
insertCount = ps.executeUpdate();
}catch(Exception ex) {
ex.printStackTrace();
}
return insertCount;
}
public List<Role> getRoles(){
List<Role> list = new ArrayList<>();
//driver 다운로드
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";
//위에서 받은 driver manager에서 Connection 객체를 받고, Connection 객체에서 preparedStatement 객체를 받는다.
try(Connection conn = DriverManager.getConnection(dburl,dbUser,dbpasswd);
PreparedStatement ps = conn.prepareStatement(sql)){
//try문 안에 또 try문이 있다.
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);
}
}catch(Exception e){
e.printStackTrace();
}
}catch(Exception ex) {
ex.printStackTrace();
}
return list;
}
public int deleteRole(int roleId) {
int deleteCount = 0;
Connection conn=null;
PreparedStatement ps = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(dburl,dbUser,dbpasswd);
String sql = "DELETE FROM role WHERE role_id=?";
ps = conn.prepareStatement(sql);
ps.setInt(1, roleId);
deleteCount = ps.executeUpdate();
}catch(Exception ex){
ex.printStackTrace();
}finally {
if(ps!=null) {
try {
ps.close();
}catch(Exception ex) {
}
}
}
return deleteCount;
}
public int updateRole(Role role) {
int updateCount =0;
Connection conn=null;
PreparedStatement ps = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection(dburl,dbUser,dbpasswd);
String sql="UPDATE ROLE SET DESCRIPTION = ? WHERE role_id =?";
ps = conn.prepareStatement(sql);
ps.setString(1,role.getDescription());
ps.setInt(2, role.getRoleId());
updateCount=ps.executeUpdate();
}catch(Exception ex) {
ex.printStackTrace();
}finally {
if(ps!=null) {
try {
ps.close();
}catch(Exception ex) {
}
}
if(conn!=null) {
try {
conn.close();
}catch(Exception ex) {}
}
}
return updateCount;
}
}