📌DTO클래스
- DTO(DATA Transfer Object)클래스
: DAO클래스의 메소드에서 행정보를 전달받거나 반환하기 위한 목적의 클래스 - 일종의 VO클래스 - 테이블의 컬럼과 1:1로 매칭되는 필드 선언 - getter & setter이용
- 필드명은 테이블의 컬럼명과 동일하게 작성하는 것을 권장
//DTO(DATA Transfer Object)클래스 : DAO클래스의 메소드에서 행정보를 전달받거나 반환하기 위한 목적의 클래스 (값을 전달해 준다)- 일종의 VO클래스
//student 테이블의 행정보(학생정보)를 저장하여 전달하기 위한 클래스
public class StudentDTO {
private int no;
private String name;
private String phone;
private String address;
private String birthday;
public StudentDTO() {
}
public StudentDTO(int no, String name, String phone, String address, String birthday) {
super();
this.no = no;
this.name = name;
this.phone = phone;
this.address = address;
this.birthday = birthday;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
}
📌DAO클래스
- 저장매체를 대상으로 행 정보의 저장, 변경, 삭제, 검색 기능을 제공하기 위한 목적의 클래스
- 즉, C(reate)R(ead)U(pdate)D(elete)기능을 제공
- 저장매체 : 데이터를 행단위로 저장하기 위한 하드웨어 또는 소프트웨어
- 인터페이스를 상속받아 작성하는 것을 권장
- 싱글톤 클래스(프로그램에 하나의 인스턴스를 제공하는 클래스)로 작성하는 것을 권장(메소드만 제공할것이기 때문)
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
//DAO(Data Access Object) 클래스 : 저장매체를 대상으로 행정보의 저장,변경
//,삭제,검색 기능을 제공하기 위한 목적의 클래스 - CRUD 기능 제공
//=> 저장매체 : 데이타를 행(레코드)단위로 저장하기 위한 하드웨어 또는 소프트웨어
//=> 인터페이스를 상속받아 작성하는 것을 권장
//=> 싱글톤 클래스(프로그램에 하나의 인스턴스만을 제공하는 클래스)로 작성하는 것을 권장
//STUDENT 테이블의 학생정보에 대한 저장,변경,삭제,검색 기능을 제공하기 위한 클래스
//=> Connection 인스턴스를 DBCP로부터 제공받기 위해 JDBC DAO클래스를 상속받아 작성
public class StudentDAO extends jdbcDAO {
//싱글톤 디자인 패턴이 적용된 클래스 작성 방법
//1.클래스의 인스턴스를 저장하기 위한 참조필드 선언
private static StudentDAO _dao;//시스템필드
//2.생성자의 은닉화 선언
private StudentDAO() {
}
//3.정적영역에서 클래스의 인스턴스를 생성하여 시스템필드에 저장
//클래스를 여러번 호출해도 한번만 실행될 수 있도록 한다.
static {
_dao = new StudentDAO();
}
//4.시스템 필드에 저장된 인스턴스를 반환하는 메소드를 작성
public static StudentDAO getDAO() {
if(_dao == null)//정적영역을 선언하지 않은경우(위의 static영역) 만들어 주기 위해서
_dao = new StudentDAO();
return _dao;
}
//학생정보를 전달받아 student테이블에 행을 저장하고 저장행의 갯수를 반환하는 메소드
public int insertStudent(StudentDTO student) {
Connection con = null;
PreparedStatement pstmt = null;
int rows = 0;
try {
con = getConnection();
String sql = "insert into student values(?,?,?,?,?)";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, student.getNo());
pstmt.setString(2, student.getName());
pstmt.setString(3, student.getPhone());
pstmt.setString(4, student.getAddress());
pstmt.setString(5, student.getBirthday());
rows = pstmt.executeUpdate();
}catch (SQLException e) {
System.out.println("insetStudent메소드의 sql오류" + e.getMessage());
}finally {
close(con, pstmt);
}
return rows;
}
//학생정보를 전달받아 student테이블에 저장행을 변경하고, 변경행의 갯수를 반환하는 메소드
public int updateStudent(StudentDTO student) {
Connection con = null;
PreparedStatement pstmt = null;
int rows = 0;
try {
con = getConnection();
String sql = "update student set name = ?, phone=?, address=?, birthday=? where no = ?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, student.getName());
pstmt.setString(2, student.getPhone());
pstmt.setString(2, student.getAddress());
pstmt.setString(2, student.getBirthday());
pstmt.setInt(5, student.getNo());
rows = pstmt.executeUpdate();
}catch(SQLException e) {
System.out.println("updateStudent메소드의 sql오류" + e.getMessage());
}finally {
close(con, pstmt);
}
return rows;
}
//학번을 전달받아 student테이블의 저장행의 갯수를 반환하는 메소드
public int deleteStudent(String no) {
Connection con = null;
PreparedStatement pstmt = null;
int rows = 0;
try {
con = getConnection();
String sql = "delete from student where no = ?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, no);
rows = pstmt.executeUpdate();
}catch(SQLException e) {
System.out.println("deleteStudent메소드의 sql오류" + e.getMessage());
}finally {
close(con, pstmt);
}
return rows;
}
//학번을 전달받아 student테이블의 저장행을 검색하고 반환하는 메소드
//=> 단일행 검색 : 검색행이 하나인 경우 값 또는 DTO를 반환하면 된다.
public StudentDTO selectNoStudent(int no) {
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
StudentDTO student = null;
try {
con = getConnection();
String sql = "select * from student where no = ?";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, no);
rs = pstmt.executeQuery();
//검색행이 있는 경우 dTO인스턴스를 생성하고 컬럼값을 반환
if(rs.next()) {
student = new StudentDTO();
student.setNo(rs.getInt("no"));
student.setName(rs.getString("name"));
student.setPhone(rs.getString("phone"));
student.setAddress(rs.getString("address"));
student.setBirthday(rs.getString("birthday").substring(0, 10));
}
}catch (Exception e) {
System.out.println("selectNoStudent메소드의 sql오류" + e.getMessage());
}finally {
close(con, pstmt, rs);
}
return student;
}
//이름을 전달받아 student테이블의 저자행을 이름으로 검색하여 학생목록으로 반환하는 메소드
//=> 다중행 검색
public List<StudentDTO> selectNameStudentList(String name){
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
List<StudentDTO> list = new ArrayList<StudentDTO>();
try {
con = getConnection();
String sql = "select * from student where name = ? order by no";
pstmt.setString(1, name);
while(rs.next()) {
StudentDTO dto = new StudentDTO();
dto.setNo(rs.getInt("no"));
dto.setName(rs.getString("name"));
dto.setPhone(rs.getString("phone"));
dto.setAddress(rs.getString("address"));
dto.setBirthday(rs.getString("birthday").substring(0, 10));
list.add(dto);
}
}catch (Exception e) {
System.out.println("selectNameStudentList메소드의 sql오류" + e.getMessage());
}finally {
close(con, pstmt, rs);
}
return list;
}
//student테이블의 저장행을 모두 검색하여 학생목록으로 반환하는 메소드
public List<StudentDTO> selectAllStudentList(String name){
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
List<StudentDTO> list = new ArrayList<StudentDTO>();
try {
con = getConnection();
String sql = "select * from student order by no";
pstmt.setString(1, name);
while(rs.next()) {
StudentDTO dto = new StudentDTO();
dto.setNo(rs.getInt("no"));
dto.setName(rs.getString("name"));
dto.setPhone(rs.getString("phone"));
dto.setAddress(rs.getString("address"));
dto.setBirthday(rs.getString("birthday").substring(0, 10));
list.add(dto);
}
}catch (Exception e) {
System.out.println("selectAllStudentList메소드의 sql오류" + e.getMessage());
}finally {
close(con, pstmt, rs);
}
return list;
}
}
📌DBCP(DataBase Connection Pool)
- 관련 인스턴스를 생성하여 Connection인스턴스를 반환하거나, 제거하는 기능을 제공하기 위한 클래스
- dbms 관련 dao클래스에서 상속받아 사용하는 클래스
- 상속만을 목적으로 하는 추상클래스로 선언하는 것을 권장.
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import oracle.ucp.jdbc.PoolDataSource;
import oracle.ucp.jdbc.PoolDataSourceFactory;
//DBCP(DataBase Connection Pool)관련 인스턴스를 생성하여 Connection인스턴스를
//반환하거나, 제거하는 기능을 제공하기 위한 클래스
//=> dbms 관련 dao클래스에서 상속받아 사용하는 클래스
//=> 상속만을 목적으로 하는 추상클래스로 선언하는 것을 권장.
public abstract class jdbcDAO {
private static PoolDataSource _pds;
static {
_pds = new PoolDataSourceFactory().getPoolDataSource();
try {
_pds.setConnectionFactoryClassName("oracle.jdbc.driver.OracleDriver");
_pds.setURL("jdbc:oracle:thin:@localhost:1521:xe");
_pds.setUser("scott");
_pds.setPassword("tiger");
_pds.setInitialPoolSize(3);
_pds.setMaxPoolSize(5);
_pds.getConnection().close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public Connection getConnection() {
Connection con = null;
try {
con = _pds.getConnection();
}catch (SQLException e) {
e.printStackTrace();
}
return con;
}
public void close(Connection con , PreparedStatement pstmt, ResultSet rs) {
try {
if(rs != null) rs.close();
if(pstmt != null) pstmt.close();
if(con != null) con.close();
}catch (SQLException e) {
e.printStackTrace();
}
}
public void close(Connection con , PreparedStatement pstmt) {
try {
//if(rs != null) rs.close();
if(pstmt != null) pstmt.close();
if(con != null) con.close();
}catch (SQLException e) {
e.printStackTrace();
}
}
}
📌정규표현식(Regular Expression) :
- 메타 문자 등을 이용하여 일정한 규칙의 문자열을 표현하는 방법
- ^문자열 : 문자열로 시작됨을 의미
- 문자열$ : 문자열로 종료됨을 의미
- . : 임의의 하나의 문자를 의미 (\)문자는 표현 불가능
- [문자1문자2문자3] : 나열된 문자들 중 하나를 의미
- [^문자1문자2문자3] : 나열된 문자들이 아닌 문자들 중 하나를 의미(일종의 not)
- [문자1 - 문자2] : 문자1부터 문자2범위의 문자 중 하나를 의미
- {문자열1|문자열2} : 나열된 문자열들 중 하나를 의미 (1아니면 2)
- 문자열+ : 문자열이 한번이상 반복됨을 의미
- 문자열* : 문자열이 0번이상 반복됨을 의미
- 문자열? : 문자열이 0번또는 1번 존재함을 의미
- 문자열{숫자} : 문자열이 숫자만큼의 반복됨을 의미
- 문자열{숫자1, 숫자2} : 문자열이 숫자1부터 숫자2 범위만큼의 반복됨을 의미
- \s : 공백이 존재하는 문자열을 의미
- \S : 공백이 존재하지 않는 문자열을 의미
- \w : 영문자, 숫자, 특수문자(_)의 문자로만 표현되는 문자열을 의미
- \W : 영문자, 숫자, 특수문자(_)의 문자를 제외한 문자로 표현되는 문자열ㅇ르
- \d : 숫자형태의 문자로만 표현되는 문자열을 의미
- \D : 숫자 형태의 문자를 제외한 문자로 표현되는 문자열을 의미
- \메타문자 : 메타문자를 문자로 표현
- (?!) 문자열 : 문자열에서 대소문자를 구분하지 않음을 의미
- (?=문자열) : 문자열을 포함하고 있음을 의미
- (?!문자열) : 문자열을 포함하고 있지 않음을 의미
- \\ : \ 문자를 표현
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/* 정규표현식(Regular Expression) : 메타 문자 등을 이용하여 일정한 규칙의 문자열을 표현하는 방법
*
^문자열 : 문자열로 시작됨을 의미
문자열$ : 문자열로 종료됨을 의미
. : 임의의 하나의 문자를 의미 (\)문자는 표현 불가능
[문자1문자2문자3] : 나열된 문자들 중 하나를 의미
[^문자1문자2문자3] : 나열된 문자들이 아닌 문자들 중 하나를 의미(일종의 not)
[문자1 - 문자2] : 문자1부터 문자2범위의 문자 중 하나를 의미
{문자열1|문자열2} : 나열된 문자열들 중 하나를 의미 (1아니면 2)
문자열+ : 문자열이 한번이상 반복됨을 의미
문자열* : 문자열이 0번이상 반복됨을 의미
문자열? : 문자열이 0번또는 1번 존재함을 의미
문자열{숫자} : 문자열이 숫자만큼의 반복됨을 의미
문자열{숫자1, 숫자2} : 문자열이 숫자1부터 숫자2 범위만큼의 반복됨을 의미
\s : 공백이 존재하는 문자열을 의미
\S : 공백이 존재하지 않는 문자열을 의미
\w : 영문자, 숫자, 특수문자(_)의 문자로만 표현되는 문자열을 의미
\W : 영문자, 숫자, 특수문자(_)의 문자를 제외한 문자로 표현되는 문자열을 의미
\d : 숫자형태의 문자로만 표현되는 문자열을 의미
\D : 숫자 형태의 문자를 제외한 문자로 표현되는 문자열을 의미
\메타문자 : 메타문자를 문자로 표현
(?!) 문자열 : 문자열에서 대소문자를 구분하지 않음을 의미
(?=문자열) : 문자열을 포함하고 있음을 의미
(?!문자열) : 문자열을 포함하고 있지 않음을 의미
\\: \ 문자를 표현
* */
//키보드로 입력받은 값에 대한 검증 프로그램
public class Validation {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("아이디 입력 >> ");
String id = br.readLine();
//기본 유효성검사
//입력값의 존재유무
if(id == null || id.equals("")) {
System.out.println("에러 : 아이디를 반드시 입력해 주세요");
System.exit(0);
}
//--------------------------------------------------------방법1-----------------------------------------------------------
//입력규칙에 의한 유효성 검사 >> 아이디는 영문자로 시작되며, 영문자 숫자, 특수문자_의 조합으로 6~20범위의 문자로 입력되도록 설정
//=>정규표현식을 이용하여 입력값에 유효성 검사를 하도록 한다
//Pattern.matches(regx - 정규표현식, charsequence - inpt) : 정규표현식과 입력값을 비교하여 boolean결과를 반환하는 메소드
//=> flase 반환 : 불일치, true : 일치
if(!Pattern.matches("^[a-zA-Z][a-zA-z0-9]{5,19}$", id)) {
System.out.println("에러 : 아이디가 형식에 맞지 않습니다.");
System.exit(0);
} else {
System.out.println("정상정인 아이디 입니다.");
}
//--------------------------------------------------------방법2-----------------------------------------------------------
//이방법이 좋은이유 : 내가 원하는 문자가 존재하는지의 유무나 기타 등등 많은 메소드를 사용할 수 있기 때문이다.
//Pattern : 정규표현식을 저장하기 위한 클래스
//문자열을 전달받아 정규표현식으로 저장한 pattern인스턴스를 반환하는 메소드
Pattern idPattern = Pattern.compile("^[a-zA-Z]\\w{5,19}$");
//정규표현식과 문자열을 비교 처리하는 기능을 제공하기 위한 클래스
//Matcher.matcher(CharSequence input) : Pattern인스턴스에 저장된 정규표현식과 비교하기 위한 문자열을 전달받아 처리하는 Matcher 인스턴스를 반환
Matcher idMatcher = idPattern.matcher(id);
//Matches() : 정규표현식과 입력값을 비교하여 결과값을 반환하는 메소드
if(!idMatcher.matches()) {
System.out.println("에러 : 아이디가 형식에 맞지 않습니다.");
System.exit(0);
}else {
System.out.println("정상정인 아이디 입니다.");
}
System.out.println("비밀번호 입력 >> ");
String pwd = br.readLine();
if(pwd == null || pwd.equals("")) {
System.out.println("에러 : 아이디를 반드시 입력해 주세요");
System.exit(0);
}
//영문자 숫자 특수문자(_포함)문자를 반드시 한개이상 포함하며, 8~30범위의 문자로 입력되도록 설정
String passwordReg = "^(?=.*[a-zA-z])(?=.*[0-9])(?=.*[~!@#$%^&*_+-]).{8,30}";
if(!Pattern.matches(passwordReg, pwd)) {
System.out.println("에러 : 비밀번호가 형식에 맞지 않습니다.");
System.exit(0);
}
System.out.println("이메일 입력 >> ");
String email = br.readLine();
if(email == null || email.equals("")) {
System.out.println("에러 : 이메일을 반드시 입력해 주세요");
System.exit(0);
}
//영문자 숫자 특수문자(_포함)문자를 반드시 한개이상 포함하며, 8~30범위의 문자로 입력되도록 설정
//String passwordReg = "^(?=.*[a-zA-z])(?=.*[0-9])(?=.*[~!@#$%^&*_+-]).{8,30}";
//이메일은 [사용자명@도메인]형식의 문자로 입력되도록 작성
String emailReg = "^([a-zA-Z0-9_-]+@[a-zA-Z0-9]+(\\.[a-zA-Z0-9]+)+)";
if(!Pattern.matches(emailReg, email)) {
System.out.println("에러 : 이메일이 형식에 맞지 않습니다.");
System.exit(0);
}else {
System.out.println("정상정인 이메일 입니다.");
}
}
}
'💻 수업정리 (2020) > 오라클' 카테고리의 다른 글
[7/1] PreparedStatement (0) | 2020.07.01 |
---|---|
[6/30]ConnectionFactory와 ResultSet커서 이용 (0) | 2020.06.30 |
[6/29]JDBC연동 ( + 리플랙션에 대해서 알아두기) (0) | 2020.06.29 |
[6/26] 객체권한, 저장프로시저, 트리거 (0) | 2020.06.26 |
[6/25] 인라인뷰와 시퀀스, 권한 부여 (0) | 2020.06.25 |