잡동사니에도 사랑을

[21.10.18] MyBatis활용 - 수정, 삭제, 검색 본문

JAVA_EE/MYBATIS

[21.10.18] MyBatis활용 - 수정, 삭제, 검색

luvforjunk 2021. 10. 18. 18:56
728x90
반응형

////////UserUpdateService.java

package user.service;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

import user.bean.UserDTO;
import user.dao.UserDAO;

public class UserUpdateService implements UserService {

	@Override
	public void execute() {
		Scanner scan = new Scanner(System.in);
		System.out.print("수정 할 아이디 입력 : ");
		String id = scan.next();
		UserDAO userDAO = UserDAO.getInstance();
		UserDTO userDTO = userDAO.getUser(id);
		
		if(userDTO == null) {
			System.out.println("찾고자 하는 아이디가 없습니다.");
		}else {
			System.out.println(userDTO.getName() + "\t" + userDTO.getId() + "\t" + userDTO.getPwd());
			
			System.out.print("수정 할 이름 입력 : ");
			String name = scan.next();
			System.out.print("수정 할 비밀번호 입력 : ");
			String pwd = scan.next();

			Map<String, String> map = new HashMap<String, String>();
			map.put("name", name);
			map.put("id", id);
			map.put("pwd", pwd);
			
			userDAO.update(map);
			
			System.out.println("데이터를 수정하였습니다");
		}
	}
}

 

////////UserUpdateService.java - UserDAO

	public UserDTO getUser(String id) {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		UserDTO userDTO = sqlSession.selectOne("userSQL.getUser", id);
		// selectOne : 딱 한줄만 가져오겠다. 
		// getUser라는 Mapper파일로 넘어와 id에 getUser라고 명시된 것을 찾아오고
		// parameter로 Mapper에 넘겨준 뒤 다시 DAO의 selectOne으로 넘어와 DTO에 넘긴다
		sqlSession.close();
		// Generic 타입이 자동적으로 바뀐다. 
			
		return userDTO;
	}

	public void update(Map<String, String> map) {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		sqlSession.update("userSQL.update", map);
		sqlSession.commit();
		sqlSession.close();
	}

 

 

[결과]

 

 

////////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() {
		Scanner scan = new Scanner(System.in);
		System.out.print("삭제 할 아이디 입력 : ");
		String id = scan.next();

		UserDAO userDAO = UserDAO.getInstance();
		UserDTO userDTO = userDAO.getUser(id);

		if (userDTO == null) {
			System.out.println("찾고자 하는 아이디가 없습니다.");
			return;

		}
		userDAO.delete(id);
		
		System.out.println("데이터를 삭제하였습니다");
	}
}

 

 

////////UserDeleteService.java - UserDAO

	public void delete(String id) {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		sqlSession.delete("userSQL.delete", id);
		sqlSession.commit();
		sqlSession.close();
	}

 

 

[결과]

 

 

////////UserSearchService.java

package user.service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

import user.bean.UserDTO;
import user.dao.UserDAO;

public class UserSearchService implements UserService {

	@Override
	public void execute() {
		Scanner scan = new Scanner(System.in);
		System.out.println("1. 이름 검색");
		System.out.println("2. 아이디 검색");
		System.out.print("번호 입력 : ");
		int num = scan.nextInt();

		String columnName = null;
		String value = null;

		if (num == 1) {
			System.out.print("이름 입력 : ");
			value = scan.next();
			columnName = "name";
			
		} else if (num == 2) {
			System.out.println("아이디 입력 : ");
			value = scan.next();
			columnName = "id";
		}
		// parameter로 넘길 수 있는 값은 하나밖에 넘길 수 없다.
		// 그래서 Map을 이용해주는 것이다.
		Map<String, String> map = new HashMap<String, String>();
		map.put("columnName", columnName);
		map.put("value", value);
		
		// DB
		UserDAO userDAO = UserDAO.getInstance();
		List<UserDTO> list = userDAO.search(map);
		
		for(UserDTO userDTO : list) {
			System.out.println(userDTO.getName()+"\t"+userDTO.getId()+"\t"+userDTO.getPwd());
		// 데이터를 실어줘야 한다는 점에서 select와는 다르다
		}
	}
}

 

////////UserSearchService.java - UserDAO

	public List<UserDTO> search(Map<String, String> map) {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		List<UserDTO> list = sqlSession.selectList("userSQL.search", map);
		sqlSession.close();
		return list;
	}
}

 

 

[결과]

 

 

////////userMapper.xml

<select id="getUser" parameterType="String" resultType="user">
		select * from usertable where id=#{id}
	</select>

	<update id="update" parameterType="java.util.Map">
		update usertable set name = #{name}, pwd=#{pwd} where id=#{id}
	</update>

	<delete id="delete" parameterType="String">
		delete usertable where id = #{id}
	</delete>

	<select id="search" parameterType="java.util.Map"
		resultType="user">
		<!-- XML -->
		<!--
		select * from usertable where 
		<if test="columnName=='name'">
			name like '%' || #{value} || '%'
		</if>

		<if test="columnName=='id'">
			id like '%' || #{value} || '%'
		</if>
		-->
	//--------------------------------------------------------------------------	
		<!--  
		select * from usertable where
		<choose>
			<when test="columnName=='name'">
				name like '%' || #{value} || '%'
			</when>
			<otherwise>
				id like '%' || #{value} || '%'
			</otherwise>
		</choose>
		-->
	//---------------------------------------------------------------------------	
		select * from usertable where ${columnName} like '%' || #{value} || '%'
	</select>
</mapper>

 

 

 

마지막으로 정보가 노출되지 않도록 mybatis-config.xml로 넘어와 환경설정을 해준다.

 

////////db.properties

jdbc.driver=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:xe
jdbc.username=c##java
jdbc.password=bit

properties의 name은 맘대로 설정해줘도 상관없다.

 

////////mybatis-config.xml

<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />

이렇게만 설정하면 에러가 뜬다.

왜? mybatis-config.xml에서는 db.properties가 어디있는지 모르니까.

db.properties의 존재를 mybatis-config.xml에게 알려줘야 한다.

<properties resource="db.properties"></properties>

 

728x90
반응형

'JAVA_EE > MYBATIS' 카테고리의 다른 글

[21.10.15] MyBatis활용 - 입력, 출력  (0) 2021.10.15