JDBC2
JDBC
view
- 사용자의 입력값을 받는 역할
private MemberController memberController = new MemberController();
int result = memberController.insertMember(inputMember());
private Member inputMember() {
System.out.println("새로운 회원정보 입력");
System.out.println("--------------");
System.out.println("아이디 : ");
String memberId = sc.next();
System.out.println("비밀번호 : ");
String password = sc.next();
System.out.println("이름 : ");
String memberName = sc.next();
System.out.println("나이 : ");
int age = sc.nextInt();
System.out.println("성별 : ");
String gender = sc.next().toUpperCase();
System.out.println("이메일 : ");
String email = sc.next();
System.out.println("전화번호 : ");
String phone = sc.next();
sc.nextLine();
System.out.println("주소 : ");
String address = sc.nextLine();
System.out.println("취미 : ");
String hobby = sc.nextLine();
return new Member(memberId, password, memberName, gender, age, email, phone, address, hobby, null);
}
Controller
- 프론트에서 넘어온 인자를 service 를 거쳐 dao 로 보낸 뒤 다시 값을 받아오는 역할
private MemberService memberService = new MemberService();
public int insertMember(Member inputMember) {
return memberService.insertMember(inputMember);
}
service
- 코드의 중복을 제거하기위해 반복되어 사용되는 코드들은 service 클래스에 묶어 사용
public int insertMember(Member member) {
//1. Connection 생성
Connection con = getConnection();
//2. dao 요청
int result = memberDAO.insertMember(con, member);
//3. 트랜잭션 처리
if(result > 0) {
commit(con);
} else {
rollback(con);
}
//4. 자원반납
close(con);
return result;
}
DAO
import static 패키지.클래스.*
static 키워드 사용해 클래스명을 작성하지 않아도 손쉽게 접근 가능
public int insertMember(Connection con, Member member) {
PreparedStatement pt = null;
int result = 0;
String sql = "INSERT INTO MEMBER VALUES(?,?,?,?,?,?,?,?,?,default)";
try {
pt = con.prepareStatement(sql);
pt.setString(1, member.getMemberId());
pt.setString(2, member.getPassword());
pt.setString(3, member.getMemberName());
pt.setString(4, member.getGender());
pt.setInt(5, member.getAge());
pt.setString(6, member.getEmail());
pt.setString(7, member.getPhone());
pt.setString(8, member.getAddress());
pt.setString(9, member.getHobby());
result = pt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 객체를 만들고 사용하지않았으나 import static 으로 인해 에러 발생하지않음.
close(pt);
}
return result;
}
JDBCTemplate
- try/catch 문의 경우 코드의 가독성을 위해 따로 빼놓고 작성하는것이 좋음.
- 하나의 클래스로 묶어 메소드 호출 시 사용할 수 있도록 빼놓음.
public class JDBCTemplate {
public static Connection getConnection() {
String className = "oracle.jdbc.OracleDriver";
Connection con = null;
String url = "jdbc:oracle:thin:@localhost:1521/xe";
String user = "student";
String password = "student";
try {
Class.forName(className);
con = DriverManager.getConnection(url, user, password);
con.setAutoCommit(false);
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
public static void commit(Connection con) {
try {
//널이 아니고 자원반납이 이뤄지지 않았으면 commit
if(con != null && !con.isClosed()) {
con.commit();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void rollback(Connection con) {
try {
if(con != null && !con.isClosed()) {
con.rollback();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(Connection con) {
try {
if(con != null && !con.isClosed()) {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(PreparedStatement pt) {
try {
if(pt !=null && !pt.isClosed()) {
pt.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(ResultSet rt) {
try {
if(rt !=null && !rt.isClosed()) {
rt.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}