스레드처럼 connection 연결하고 다 사용하면 close도 해줌
데이터소스로부터 커넥션 얻어와서 넣는 작
statement 한번만 쓰는거
prestatement 재사용하는
테이블을 만든다는것은 몇개의 데이터를 고친다는건지 머넞 확인해보기
executequery는 셀렉트문 그외는 execute update
디ㅏ비의 모든 내용은 커넥션으로 부터 나온
create table은 아무런 영향도 주지 않음
근데 statement 잘 안씀 여기 단계에서
resultset 결과값을 set형태로 담아 온
beans라고도 하지만 dto라고도 \
java.sql.SQLException: Cannot load JDBC driver class 'org.mariadb.jdbc.Driver'
이거 뜨는거면 라이브러리가 없다는 뜻 -> lib에 라이브러리 넣어줘
상세보기, 삭제 모두 하나 콕 찝어서 한니까 ? 필요하고
상세보기는 select지만 삭제는 delete라 상세보기는 executequery 삭제는 executeupdate
crud : create read update delete
로그인 select prestatement
회원가입 insert statement
순서
db접속부터 먼저해야함
try {
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/MariaDB");
conn = ds.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
해줘야해
membercontroller로 코드리뷰
- controller
@WebServlet(urlPatterns = {"/login","/join"})
public class MemberController extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String uri = req.getRequestURI();
String ctx = req.getContextPath(); // 프로젝트 명
String addr = uri.substring(ctx.length()); //ctx길이부터 끝까지 가져온다
req.setCharacterEncoding("UTF-8");
MemberModel model = new MemberModel();
String msg = "";
if(addr.equals("/join")) {
HashMap<String, String> param = new HashMap<String, String>();
param.put("id", req.getParameter("id"));
param.put("pw", req.getParameter("pw"));
param.put("name", req.getParameter("name"));
param.put("age", req.getParameter("age"));
param.put("gender", req.getParameter("gender"));
param.put("email", req.getParameter("email"));
System.out.println(param);
msg = model.join(param);
}
if(addr.equals("/login")) {
String id = req.getParameter("id");
String pw = req.getParameter("pw");
System.out.println(id+"/"+pw);
boolean success = model.login(id, pw);
if(success) {
msg = "로그인에 성공했습니다.";
HttpSession session = req.getSession();
session.setAttribute("loginId", id);
}else {
msg = "로그인에 실패했습니다.";
}
}
req.setAttribute("msg", msg);
RequestDispatcher dis = req.getRequestDispatcher("index.jsp");
dis.forward(req, resp);
}
join과 같다면 getParameter을 통해서 값을 가져오는데 이렇게 가져온 값은 param.put을 통해param에 담아줍니다
hashmap을 객체화해서 거기에 담아준다. id라는 이름으로 id값을 가져온 것. 이후 syso를 통해 확인하고 model클래스의 join메서드에 param값을 담아서 실행한다. 그리고 반환값을 msg에 담아주고 이후 setattribute 등을 통해 index.jsp로 보낸다.
- model
public class MemberModel {
// 회원 정보를 회원아이디.dat 형태로 저장한다.
public String join(HashMap<String, String> params) {
MemberDAO dao = new MemberDAO(); //db에서 해야할 일이므로 DAO를 객체화해줌
String msg = "이미 존재하는 아이디입니다.";
//1.해당 아이디를 가지고 있는 사용자가 있는지 db에 물어본다
boolean overlay = dao.overlay(params.get("id"));
System.out.println ("중복 아이디 여부 : " + overlay);
if(!overlay) {
//2. 중복아이디가 아니라면 가져온 파라메터를 이용해 db에 insert한다
if(dao.join(params) == 1) { //pk가 설정되어있어서 어차피 1까지 밖에 못넣음
msg = "회원가입이 완료되었습니다.";
}else {
msg = "회원가입에 실패했습니다.";
}
}
return msg;
}
public boolean login(String id, String pw) {
MemberDAO dao = new MemberDAO();
return dao.login(id,pw);
}
}
param값을 인자값으로 받는 join메서드를 보면
db에서 해야할일이니까 DAO 클래스 객체화해주고 msg 초기값 설정해주고
먼저 중복되는 id있는지 db에 확인하기 위해 overlay라는 메서드 하나 생성해줌 인자값으로는 사용자가 입력한 값인 params.get("id")를 넣어줬음, 중복된 값이 있으면 true 없으면 false로 반환하기 위해 boolean 타입으로 선언해줌
만약 true가 아니라면 즉 중복된 값이 없다면 dao의 join객체에서 반환된 값이 1이라면 회원가입이 완료되었다는 msg 반환함
- DAO
public class MemberDAO {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
public MemberDAO() {
try {
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/MariaDB");
conn = ds.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
}
public boolean overlay(String id) {
// 1. 쿼리문
String sql = "SELECT id FROM member_table WHERE id = ?";
boolean overlay = true;
try {
ps = conn.prepareStatement(sql); // sql 작성
ps.setString(1, id); // 3.?
rs = ps.executeQuery(); // 4. executeQuery
overlay = rs.next(); //5. 테이블 읽고 값 반환
//5. close
rs.close();
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
return overlay;
}
db에 접속하기 위해서 context.xml을 객체화해줌 (자바에서 사용하기 위해) 근데 context는 인터페이스여서(인터페이스는 객체화 못함) InitialContext 를 사용해줌. 이 ctx에서 lookup을 사용해서 자바 컴파일러의 jdbc/MariaDB를 찾음 Datasource라는 데이터 타입을 사용해서 ds에 넣어주고 여기서 getconnection을 해줌
아이디 중복 확인을 위해 overlay를 실행하면 인자값으로는 id를 가져오고
쿼리문 준비, prepareStatement 작성, setString을 사용해 id값을 첫번째 물음표에 넣어주고\
쿼리문 실행하기 위해 executeQuery사용해줌 (select 문이기때문에 이거 사용함) 해서 반환값 resultset의 변수인 rs에 넣어주고
next()를 확인해서 다음값을 확인해주고 자원 반납해줌
리턴값으로는 true or false를 반환
- 다시 model로 돌아가서
if(!overlay) {
//2. 중복아이디가 아니라면 가져온 파라메터를 이용해 db에 insert한다
if(dao.join(params) == 1) { //pk가 설정되어있어서 어차피 1까지 밖에 못넣음
msg = "회원가입이 완료되었습니다.";
}else {
msg = "회원가입에 실패했습니다.";
}
}
return msg;
}
만약 overlay가 false라면 밑에 if문 실행
public int join(HashMap<String, String> params) {
int row = 0; //초기값
//1. 쿼리문 준비
String sql = "INSERT INTO member_table(id,pw,name,age,gender,email)VALUES(?,?,?,?,?,?)";
try {
//2. 재사용할거니까 (회원가입은 계속하니까) prepareStatement 로 미리 작성
ps = conn.prepareStatement(sql);
ps.setString(1, params.get("id"));
ps.setString(2, params.get("pw"));
ps.setString(3, params.get("name"));
ps.setInt(4, Integer.parseInt(params.get("age")));
ps.setString(5, params.get("gender"));
ps.setString(6, params.get("email"));
row = ps.executeUpdate(); //값이 반환되기 때문에 update 사용 ->그리고 몇개 반환되느지 알려줌
//close()
ps.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
return row;
}
join메서드를 보면 row의 초기값 설정, 쿼리문 준비 insert문 통해서 회원가입 정보 넣어주기
'Spring' 카테고리의 다른 글
[SPRING] spring 특징, framework란?, 프로젝트 처음 만들었을 때 설정값 (0) | 2023.03.29 |
---|---|
[SPRING] web.xml / servlet-context.xml / spring에서 model이란 (0) | 2023.03.28 |
국비코딩 [Maria DB] (0) | 2023.03.24 |
국비코딩 [Maria DB] (0) | 2023.03.23 |
날짜 표시 함수, 숫자형 함수 , 문자형 함수 (0) | 2023.03.23 |