UserMain.java ---> UserService.java ---> UserDAO.java
1. 입력 ↑ DataSource( Connection Pool ) ----- X (이제 자바는 자바역할만
UserInsertService.java SQL과 분리작업하자)
1. 데이터 입력 ( id / pwd ) SqlSessionFactory를 만들어야
2. DB SqlSession 만들 수 있다. ----- MyBatis에 접근할 수 있는 객체
mybatis-config (환경설정) -- MySQL을 쓸지 Oracle 쓸지만 말해주면 된다.
환경설정은 UserDAO 생성자에서 한 번만 읽어드리고 설정을 해주고 시작하게 되는 것이다.
등록
UserInsertService.java
package user.service;
import java.util.Scanner;
import user.bean.UserDTO;
import user.dao.UserDAO;
public class UserInsertService implements UserService {
@Override
public void execute() {
System.out.println();
Scanner scan = new Scanner(System.in);
System.out.print("이름 입력 : ");
String name = scan.next();
System.out.print("아이디 입력 : ");
String id = scan.next();
System.out.print("비밀번호 입력 : ");
String pwd = scan.next();
UserDTO userDTO = new UserDTO();
userDTO.setName(name);
userDTO.setId(id);
userDTO.setPwd(pwd);
//DB
UserDAO userDAO = UserDAO.getInstance();
int su = userDAO.write(userDTO);
//응답
System.out.println(su + "개의 행이 삽입되었습니다.");
}
}
이제 DAO에서 sql문 쓰는 건 안한다 !!! -- userMapper.xml 에서 할 것 !!
sqlSession.insert는 int를 반환하는 것을 확인할 수 있다.
이런식으로 이름을 줘야 수행하고 다시 돌아오는 것이다.
id는 유일하게 잡아줘야한다. 똑같은 이름이 중복되면 안된다.
userMapper.xml
<insert id="22"
memberMapper.xml
<insert id="22"
~Mapper.xml 파일이 여러개일 때 저렇게 id가 같으면 error가 발생할까??
myBatis-config가 두 개의 xml 파일을 한 번에 읽는다. 둘 중 뭐를 수행할지를 모르므로 에러가 난다.
파일은 그냥 사용자가 나눠놓은 것이다.
두 개의 xml 파일을 전부 다 관리하는 것이다.
그래서 userMapper.xml에서처럼 namespace를 걸어놓는 것이다.
이런식으로 하면 절대 충돌이 나지 않는다.
insert로 데이터 보낼 때 한 번밖에 못 보내기 때문에 userDTO에 묶어서 보내야한다.
name, id, pwd 이런식으로 여러개를 못 보낸다는 것이다. --> userDTO로 보내야함.
UserDAO.java
public int write(UserDTO userDTO) {
int su = 0;
SqlSession sqlSession = sqlSessionFactory.openSession(); //생성
sqlSession.insert("userSQL.write", userDTO);
return su;
}
UserInsertService --- UserDAO --- userMapper.xml 전부 write라는 이름이 이어지는 것을 확인할 수 있다.
parameterType은 넘어오는 데이터의 자료형 타입이 뭔지 말하는 것
----> import를 할 수 없기 때문에 패키지명부터 적어야된다 ----> user.bean.UserDTO
userMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="userSQL">
<insert id="write" parameterType="user.bean.UserDTO">
insert into usertable values(#{name}, #{id}, #{pwd})
</insert>
</mapper>
여기서는 물음표를 적으면 안된다. #{name} 이런식으로 적으면 자동으로 ? 로 적용이된다.
Lock
=> 반드시 commit
=> insert / update / delete 이 3개는 반드시 commit 작업을 수행해줘야한다.
UserDAO.java
여기서는 commit 작업이 자동으로 안되므로
commit과 close를 직접해줘야한다.
자동 commit X / 실행하고 반환값 su로 받기 작업까지 추가 !
public int write(UserDTO userDTO) {
int su = 0;
SqlSession sqlSession = sqlSessionFactory.openSession(); //생성
su = sqlSession.insert("userSQL.write", userDTO);
sqlSession.commit();
sqlSession.close();
return su;
}
1개의 행이 삽입되었다고 잘 뜨는 것 확인가능 !
select *from usertable;
Oracle에서도 데이터값이 잘 삽입이 된 것을 확인할 수 있다.
출력
UserSelectService.java
package user.service;
import java.util.List;
import user.bean.UserDTO;
import user.dao.UserDAO;
public class UserSelectService implements UserService{
@Override
public void execute() {
System.out.println();
//DB
UserDAO userDAO = UserDAO.getInstance();
List<UserDTO> list = userDAO.getAllList();
//응답
for(UserDTO userDTO: list) {
System.out.println(userDTO.getName() + "\t"
+ userDTO.getId() + "\t"
+ userDTO.getPwd());
}
}
}
UserDAO.java
알아서 List로 꺼내온다. List에 담아라 안 해도된다.
new ArrayList<>() 안 해도된다.
selectList 함수가 알아서 해준다.
어떤 타입이 들어올지는 모르니까 Object가 담겨있다.
이런식으로 하면 알아서 UserDTO를 받아온다.
UserDAO.java
public List<UserDTO> getAllList() {
SqlSession sqlSession = sqlSessionFactory.openSession(); //생성
List<UserDTO> list = sqlSession.selectList("userSQL.getAllList");
sqlSession.close();
return list;
}
userMapper.xml
list까지는 생성해주지만 dto에 담아라는 우리가 해줘야한다.
<select id="getAllList" resultType="user.bean.UserDTO">
select * from usertable
</select>
parameterType="user.bean.UserDTO"
resultType="user.bean.UserDTO"
이렇게 하면 너무 기니까
typeAlias로 별명을 붙여주자.
mybatis-config.xml
<typeAliases>
<typeAlias type="user.bean.UserDTO" alias="user"/>
</typeAliases>
userMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="userSQL">
<insert id="write" parameterType="user">
insert into usertable values(#{name}, #{id}, #{pwd})
</insert>
<select id="getAllList" resultType="user">
select * from usertable
</select>
</mapper>
똑같이 잘 실행되는 것 확인할 수 있다.
만약에 테이블의 컬럼과 객체의 필드명이 다른 경우
지금은 같지만 다른경우 이런식으로 해줘야한다.
밑에도 이런식으로 맞춰주면 된다.
src
mybatis-config.xml
db.properties
나중에 mysql로 바꿀거면 db.properties만 바꾸면 된다.
시키지 않아도 읽는건 web.xml만 있다.
자기가 프로그램 시작할 때 알아서 읽는다. servlet을 등록해도 알아서 읽지만
그 외는 읽으라고 시켜야한다.
UserDAO에서 mybatis가 있다는 것을 한 번 실행해준 것처럼
mybatis-config.xml에 db.properties가 있다는 것을 알려줘야한다.
<properties resource="db.properties" />
이제 오류가 없는 것을 확인할 수 있다.
수정
UserUpdateService.java
package user.service;
import java.util.Scanner;
import user.bean.UserDTO;
import user.dao.UserDAO;
public class UserUpdateService implements UserService{
@Override
public void execute() {
System.out.println();
Scanner scan = new Scanner(System.in);
UserDAO userDAO = UserDAO.getInstance();
System.out.print("수정할 아이디 입력: ");
String id = scan.next();
UserDTO userDTO = userDAO.getUser(id);
UserDAO.java
public UserDTO getUser(String id) {
SqlSession sqlSession = sqlSessionFactory.openSession(); //생성
UserDTO userDTO = sqlSession.selectOne("userSQL.getUser", id);
sqlSession.close();
return userDTO;
}
userMapper.xml
<select id="getUser" parameterType="String" resultType="user">
select * from usertable where id = #{id}
</select>
UserUpdateService.java
if(userDTO != null) {
System.out.println(userDTO.getName() + "\t"
+ userDTO.getId() + "\t"
+ userDTO.getPwd());
System.out.println();
System.out.print("수정할 이름 입력: ");
String name = scan.next();
System.out.print("수정할 비밀번호 입력: ");
String pwd = scan.next();
userDTO.setName(name);
userDTO.setPwd(pwd);
int su = userDAO.update(userDTO);
//응답
System.out.println(su + "개의 행이 수정되었습니다.");
}else {
System.out.print("수정할 아이디가 없습니다.");
}
System.out.println();
}
}
UserDAO.java
public int update(UserDTO userDTO2) {
int su = 0;
SqlSession sqlSession = sqlSessionFactory.openSession(); //생성
su = sqlSession.update("userSQL.update", userDTO2);
sqlSession.commit();
sqlSession.close();
return su;
}
userMapper.xml
<update id="update" parameterType="user">
update usertable set name=#{name},pwd=#{pwd} where id=#{id}
</update>
삭제
UserDeleteService.java
package user.service;
import java.util.Scanner;
import user.bean.UserDTO;
import user.dao.UserDAO;
public class UserDeleteService implements UserService{
@Override
public void execute() {
System.out.println();
Scanner scan = new Scanner(System.in);
UserDAO userDAO = UserDAO.getInstance();
System.out.print("삭제할 아이디 입력: ");
String id = scan.next();
UserDTO userDTO = userDAO.getUser(id);
UserDAO.java
public UserDTO getUser(String id) {
SqlSession sqlSession = sqlSessionFactory.openSession(); //생성
UserDTO userDTO = sqlSession.selectOne("userSQL.getUser", id);
sqlSession.close();
return userDTO;
}
userMapper.xml
<select id="getUser" parameterType="String" resultType="user">
select * from usertable where id = #{id}
</select>
UserDeleteService.java
if(userDTO != null) {
System.out.println(userDTO.getName() + "\t"
+ userDTO.getId() + "\t"
+ userDTO.getPwd());
System.out.println();
System.out.print("삭제할 아이디 입력: ");
String id2 = scan.next();
int su = userDAO.delete(id2);
//응답
System.out.println(su + "개의 행이 삭제되었습니다.");
}else
System.out.print("삭제할 아이디가 없습니다.");
System.out.println();
}
}
UserDAO.java
public int delete(String id) {
int su = 0;
SqlSession sqlSession = sqlSessionFactory.openSession(); //생성
su = sqlSession.delete("userSQL.delete", id);
sqlSession.commit();
sqlSession.close();
return su;
}
userMapper.xml
<delete id="delete" parameterType="String">
delete usertable where id=#{id}
</delete>
검색 - HOMEWORK
1. Dynamic Web Project: projectMyBatis
=> projectJSP의 내용을 복사해서 MemberDAO.java 전부 MyBatis로 바꾸시오.
2. *.jar 복사
3. 환경설정 => mybatis-config.xml
4. Mapper.xml
db.properties
jdbc.driver=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:xe
jdbc.username=C##JAVA
jdbc.password=1234
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="db.properties" />
<typeAliases>
<typeAlias type="member.bean.MemberDTO" alias="member"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/userMapper.xml"/>
</mappers>
</configuration>
MemberDAO.java - 설정하기
package member.dao;
import java.io.IOException;
import java.io.Reader;
import java.util.Map;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import member.bean.MemberDTO;
public class MemberDAO {
private static MemberDAO memberDAO = new MemberDAO();
private SqlSessionFactory sqlSessionFactory;
public static MemberDAO getInstance() {
return memberDAO;
}
public MemberDAO() {
try {
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
//InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
아이디 중복체크
MemberDAO.java
public int isExistId(String id) {
SqlSession sqlSession = sqlSessionFactory.openSession(); //생성
int su = 0;
su = sqlSession.selectOne("userSQL.isExistId", id);
sqlSession.close();
return su;
}
userMapper.xml
<!-- 아이디 중복 체크 -->
<select id="isExistId" parameterType="String" resultType="int">
select count(*) from member where id = #{id}
</select>
회원가입
MemberDAO.java
public void memberWrite(MemberDTO memberDTO) {
SqlSession sqlSession = sqlSessionFactory.openSession(); //생성
sqlSession.insert("userSQL.memberWrite", memberDTO);
sqlSession.commit();
sqlSession.close();
}
userMapper.xml
<!-- 회원가입 -->
<insert id="memberWrite" parameterType="member">
insert into member values(#{name}, #{id}, #{pwd}, #{gender},
#{email1}, #{email2}, #{tel1}, #{tel2}, #{tel3},
#{zipcode}, #{addr1}, #{addr2}, sysdate)
</insert>
로그인 후 세션 관리 ( 약간 어렵게 한듯)
MemberDAO.java
public Map<String, String> memberLogin(String id, String pwd){
SqlSession sqlSession = sqlSessionFactory.openSession(); //생성
Map<String, String> userInfo = sqlSession.selectOne("userSQL.memberLogin", Map.of("id", id, "pwd", pwd));
sqlSession.close();
return userInfo;
}
userMapper.xml
<select id="memberLogin" resultType="map">
select name, email1, email2
from member
where id = #{id} and pwd = #{pwd}
</select>
memberLogin.jsp
String name = userInfo.get("NAME");
String email1 = userInfo.get("EMAIL1");
String email2 = userInfo.get("EMAIL2");
대문자로 안 해주면 null 값만 담긴다는 거,,,,
로그인 후 세션 관리2
강사님 답
MemberDAO.java
public MemberDTO memberLogin(String id, String pwd){
Map<String, String> map = new HashMap<String, String>();
map.put("id", id);
map.put("pwd", pwd);
SqlSession sqlSession = sqlSessionFactory.openSession(); //생성
MemberDTO memberDTO = sqlSession.selectOne("userSQL.memberLogin", map);
sqlSession.close();
return memberDTO;
}
userMapper.xml
<!-- 로그인 -->
<select id="memberLogin" parameterType="java.util.Map" resultType="member">
select name, email1, email2
from member
where id = #{id} and pwd = #{pwd}
</select>
memberLogin.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="java.net.URLEncoder"%>
<%@page import="member.bean.MemberDTO"%>
<%@page import="member.dao.MemberDAO"%>
<%@page import="java.util.Map"%>
<%
//데이터
request.setCharacterEncoding("UTF-8");
String id = request.getParameter("id");
String pwd = request.getParameter("pwd");
//DB
MemberDAO memberDAO = MemberDAO.getInstance();
MemberDTO memberDTO = memberDAO.memberLogin(id, pwd);
if (memberDTO == null) {
//페이지 이동
response.sendRedirect("loginFail.jsp");
} else {
//중요한 데이터를 주소표시줄에 실어서 보내지 말자
//response.sendRedirect("loginOk.jsp?name=" + URLEncoder.encode(name, "UTF-8") + "&id=" + id);
// 쿠키 설정
/*
Cookie cookie = new Cookie("memName", name);//쿠키 생성
cookie.setMaxAge(30 * 60); //초 단위 - 30분
response.addCookie(cookie);//클라이언트에 저장
Cookie cookie2 = new Cookie("memId", id);//쿠키 생성
cookie2.setMaxAge(30 * 60); //초 단위 - 30분
response.addCookie(cookie2);//클라이언트에 저장
*/
//세션
//HttpSession session = request.getSession(); //세션 생성
String name = memberDTO.getName();
String email1 = memberDTO.getEmail1();
String email2 = memberDTO.getEmail2();
System.out.println(name);
System.out.println(id);
// 세션에 저장
session.setAttribute("memName", name);
session.setAttribute("memId", id);
session.setAttribute("memEmail", email1 + "@" + email2);
response.sendRedirect("loginOk.jsp");
}
%>
회원정보 수정을위한 아이디에 해당하는 member 정보 얻기
MemberDAO.java
public MemberDTO getMember(String id) {
SqlSession sqlSession = sqlSessionFactory.openSession(); //생성
MemberDTO memberDTO = sqlSession.selectOne("userSQL.getMember", id);
sqlSession.close();
return memberDTO;
}
userMapper.xml
<!-- 아이디에 해당하는 정보 가져오기 -->
<select id="getMember" parameterType="String" resultType="member">
select * from member where id = #{id}
</select>
회원정보 수정
MemberDAO.java
public void memberUpdate(MemberDTO memberDTO) {
SqlSession sqlSession = sqlSessionFactory.openSession(); //생성
sqlSession.update("userSQL.memberUpdate", memberDTO);
sqlSession.commit();
sqlSession.close();
}
userMapper.xml
<!-- 회원정보 수정 -->
<update id="memberUpdate" parameterType="member">
update member set name=#{name}, pwd=#{pwd}, gender=#{gender},
email1=#{email1}, email2=#{email2},
tel1=#{tel1}, tel2=#{tel2}, tel3=#{tel3},
zipcode=#{zipcode}, addr1=#{addr1}, addr2=#{addr2}, logtime=sysdate where id=#{id}
</update>
'JSP & Servlet' 카테고리의 다른 글
DAY 51 - MVC ( 2024.09.12 ) (2) | 2024.09.12 |
---|---|
DAY 50 - EL_JSTL ( 2024.09.11 ) (4) | 2024.09.11 |
DAY 48 - MyBatis ( 2024.09.09) (0) | 2024.09.09 |
DAY 46 JSP - Connection Pool / 로그인 / 쿠키(2024.09.05) (1) | 2024.09.06 |
DAY 47 - 미니프로젝트(member) - 세션 / 회원정보 수정 / 글 작성 (2024.09.06) (2) | 2024.09.06 |