본문 바로가기
Java Web Programming/6. Spring | MyBatis

[MyBatis] 마이바티스 적용 연습 2 ! (SELECT, INSERT, UPDATE + include & List, Map 타입 활용)

by 파프리카_ 2020. 10. 30.
728x90
반응형

[ 구현 순서 ]

  1.  java 프로젝트 생성
  2. configure > maven project 설정
  3. pom.xml에 MyBatis Framework 추가 ( ⇒ mybatis 환경설정 완료)
  4. src에 mybatis.config directory 생성
  5. SqlSessionConfig에 
      1) 사용할 클래스 정의 및 별칭 부여
      2) JDBC 환경설정 (driver, url, userid, password)
      3) <mapper> 태그에 SQL 정의한 Mapper xml 파일 경로 지정
  6.  SQL Mapper xml 파일 생성 (member.xml)
  7. factory directory에 SqlSessionFactoryManager 생성 (메모리 로딩의 역할을 하는 factory class)
  8. MemberVO 생성 
  9. MemberDAO 생성
  10. member.xml에 SQL문 정의
  11. TestMemberDAO 생성하여 실행

[ MyBatis 사용 환경 설정 ]

 > pom.xml에 MyBatis framework 추가

  <dependencies>
	 <!-- MyBatis Framework -->
	<dependency>
	    <groupId>org.mybatis</groupId>
	    <artifactId>mybatis</artifactId>
	    <version>3.4.0</version>
	</dependency>
  </dependencies>

 

> src에 MyBatis-Config 디렉토리 추가

 

/SqlSessionConfig.xml

1. MyBatis  DataSource에 대한 설정 및  SQL 정의 xml 에 대한 매핑

2. Spring 연동 시, spring과 연동시에는 spring 설정에서 DataSource(dbcp) 를 정의한다. 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">

<!-- MyBatis  DataSource에 대한 설정 및  SQL 정의 xml 에 대한 매핑
	 spring과 연동시에는 spring 설정에서 DataSource(dbcp) 를 정의한다. 
-->
<configuration>	
	<!-- 사용할 클래스에 대한 별칭을 명시한다.  -->
	<typeAliases>
		<typeAlias type="org.kosta.model.MemberVO" alias="mvo"/>		
	</typeAliases>
	<!-- JDBC의 환경설정 -->
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC"/>
			<dataSource type="POOLED">
				<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>	
				<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:XE"/>	
				<property name="username" value="scott"/>	
				<property name="password" value="tiger"/>			
			</dataSource>
		</environment>		
	</environments>
	<!-- SQL 정의한 Mapper(xml) 파일 -->
	<mappers>
		<mapper resource="mybatis/config/member.xml"/>	
	</mappers>
</configuration>

[ 적용 ]

1. SQL SELECT (List 반환, map으로 반환, map으로 찾기, string으로 찾기)

2. SQL INSERT - vo형태로 insert 해보기, map형태로 insert 해보기

3. include를 통해 있던 sql문에 조건 추가하기

4. SQL UPDATE

 

> resultType="" : 한 행에 대한 데이터타입 

> parameterType="" : 매개변수 타입 
    - 매개변수가 하나일 때는 ${value} 로 표현
    - 다수 정보일 경우 ${instance 변수명}으로 표현
    - map일 경우에는 ${[map의 key]}로 표현

 

/member.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- Sql Mapper -->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- name space : 필수! -->
<mapper namespace="member">
	<!-- resultType="" : 한 행에 대한 데이터타입 
	     parameterType="" : 매개변수 타입 
		 매개변수가 하나일 때는 ${value} 로 표현
		 다수 정보일 경우 ${instance 변수명}으로 표현
		 * map일 때는 map의 key를 넣어준다.
	-->
	
	<!-- 재사용을 위한 SQL 문 -->
	<sql id="selectMember">
 		<!-- SQL 정의 -->
 		SELECT id, password, name, address
 		FROM   spring_member
	</sql>
	
 	<select id="getAllMemberList" resultType="mvo">
 		<!-- 위에있는 sql문 include 하기 -->
 		<include refid="selectMember"></include>
 	</select>
 	
 	<insert id="insertMember" parameterType="mvo">
 		INSERT INTO  spring_member(id, password, name, address)
 		VALUES       (#{id}, #{password}, #{name}, #{address})
 	</insert>
 	
 	<select id="findMemberById" parameterType="string" resultType="mvo">
 		<include refid="selectMember"></include>
 		<!-- selectMember에 where 조건을 추가하여 주면 된다 -->
 		WHERE id=#{value}
 	</select>
 	
 	<select id="getTotalCount" resultType="int">
 		SELECT COUNT(*)
 		FROM   spring_member
 	</select>
 	
 	<insert id="insertMemberByMap" parameterType="map">
 		INSERT INTO spring_member(id, password, name, address)
 		VALUES      (#{ID}, #{PASS}, #{NAME}, #{ADDR})
 	</insert>
 	
 	<!-- param은 하나일 경우 명시해주지 않아도 된다 -->
 	<select id="findMemberMapById" resultType="map">
 		<include refid="selectMember"></include>
 		WHERE id=#{value}
 	</select>
 	
 	<!-- list로 반환받지만, 한 행의 data type이 조건이므로, string으로 지정한다 -->
 	<select id="getAddressKind" resultType="string">
 		SELECT  DISTINCT address
 		FROM    spring_member
 	</select>
 	
 	<select id="findMemberListByAddress" parameterType="string" resultType="mvo">
 		<include refid="selectMember"></include>
 		WHERE address=#{value}
 	</select>
 	
 	<select id="findMemberListByNameAndAddress" parameterType="mvo" resultType="mvo">
 		<include refid="selectMember"></include>
 		WHERE name=#{name} AND address=#{address}
 	</select>
 	
 	<update id="updateMember" parameterType="mvo">
 		UPDATE spring_member 
 		SET password=#{password}, name=#{name}, address=#{address}
 		WHERE id=#{id}
 	</update>
 	
</mapper>

SQL

CREATE TABLE spring_member(
    id        VARCHAR2(100)  PRIMARY KEY,
    password  VARCHAR2(100)  NOT NULL,
    name      VARCHAR2(100)  NOT NULL,
    address   VARCHAR2(100)
)


/model

 

/MemberVO.java

package org.kosta.model;

public class MemberVO {
	private String id;
	private String password;
	private String name;
	private String address;
	
	//기본 생성자가 반드시 있어야 한다!
	public MemberVO() {
		super();
	}

	public MemberVO(String id, String password, String name, String address) {
		super();
		this.id = id;
		this.password = password;
		this.name = name;
		this.address = address;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	@Override
	public String toString() {
		return "MemberVO [id=" + id + ", password=" + password + ", name=" + name + ", address=" + address + "]";
	}
	
}

 

*  INSERT 시, 다수 정보 (id, password, name, address)가 전달되어야 할 때는,

VO(DTO)와 같은 MAP 형태로 전달해준다.

/MemberDAO.java

package org.kosta.model;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import factory.SqlSessionFactoryManager;

/*싱글톤 패턴 : 시스템 상에서 단 하나의 객체를 만들어서 사용하는 패턴
  - 객체 생성 없이, 클래스 로딩만으로도 사용 가능하다
  - 외부에서 객체 직접 생성 불가능 : public static으로 공유 
  */
public class MemberDAO {
	private static MemberDAO instance = new MemberDAO();
	private SqlSessionFactory factory;
	
	private MemberDAO () {
		//factory : 설정파일에서 가져온다.
		factory = SqlSessionFactoryManager.getInstance().getFactory();
	}
	public static MemberDAO getInstance() {
		return instance;
	}
	
	/**
	 * getAllMemberList : 모든 멤버 리스트 반환
	 * @return List<MemberVO>
	 */
	public List<MemberVO> getAllMemberList(){
		List<MemberVO> list = null;
		SqlSession session = null;
		try {
			session = factory.openSession();
			//session.selectList("[namespace.id]"); 
			list = session.selectList("member.getAllMemberList");
		} finally {
			session.close();
		}
		
		return list;
	}
	
	/**
	 * insertMember : Member 추가하기
	 * @param MemberVO
	 */
	public void insertMember(MemberVO vo) {
		SqlSession session = null;
		try {
			session = factory.openSession();
			//session.isert("[namespace.id]", [parameter]); 
			session.insert("member.insertMember", vo);
			//MyBatis는 기본 커밋모드가 수동이므로, 
			//commit()을 실행할때만 실제 DB에 반영된다.
			// - commit()을 해주는 이유는, DB에 영향을 주기 때문에!
			session.commit(); 
		} finally {
			session.close();
		}
	}
	
	/**
	 * findMemberById : id로 멤버 정보 찾기
	 * @param id
	 * @return MemberVO
	 */
	public MemberVO findMemberById(String id) {
		MemberVO vo = null;
		SqlSession session = null;
		try {
			session = factory.openSession();
			vo = session.selectOne("member.findMemberById", id);
		} finally {
			session.close();
		}
		
		return vo;
	}
	
	/**
	 * getTotalCount : 전체 멤버 수 반환
	 * @return int count
	 */
	public int getTotalCount() {
		int count = 0;
		SqlSession session = null;
		try {
			session = factory.openSession();
			count = session.selectOne("member.getTotalCount");
		} finally {
			session.close();
		}
		return count;
	}
	
	/**
	 * insertMemberByMap : map 형태로 회원 추가하기
	 * @param map
	 */
	public void insertMemberByMap(Map<String, String> map) {
		SqlSession session = null;
		try {
			session = factory.openSession(true); //auto commit ! 
			session.insert("member.insertMemberByMap", map);
			//session.commit(); //session 할당 시, auto commit으로하여, 커밋처리 별도로 필요 X
		} finally {
			session.close();
		}
	}
	
	/**
	 * findMemberMapById : id로 회원정보 찾기(map형태로 반환)
	 * @param id
	 * @return Map<String, String>
	 */
	public Map<String, String> findMemberMapById(String id) {
		Map<String, String> map = null;
		SqlSession session = null;
		try {
			session = factory.openSession();
			map = session.selectOne("member.findMemberMapById", id);
		} finally {
			session.close();
		}		
		return map;
	}
	
	/**
	 * getAddressKind : 테이블의 회원 주소목록을 반환
	 * @return List<String>
	 */
	public List<String> getAddressKind() {
		List<String> list = null;
		SqlSession session = null;
		try {
			session = factory.openSession();
			list = session.selectList("member.getAddressKind");
		} finally {
			session.close();
		}
		return list;
	}
	
	/**
	 * findMemberListByAddress : 주소로 회원 정보 검색
	 * @param address
	 * @return List<MemberVO>
	 */
	public List<MemberVO> findMemberListByAddress(String address) {
		List<MemberVO> list = null;
		SqlSession session = null;
		try {
			session = factory.openSession();
			list = session.selectList("member.findMemberListByAddress", address);
		} finally {
			session.close();
		}
		return list;
	}
	
	/**
	 * findMemberListByNameAndAddress : 이름과 주소로 회원 정보 검색
	 * @param mvo
	 * @return List<MemberVO>
	 */
	public List<MemberVO> findMemberListByNameAndAddress(MemberVO mvo) {
		List<MemberVO> list = null;
		SqlSession session = null;
		try {
			session = factory.openSession();
			list = session.selectList("member.findMemberListByNameAndAddress", mvo);
		} finally {
			session.close();
		}
		return list;
	}
	
	
	public void updateMember(MemberVO paramVO) {
		SqlSession session = null;
		
		try {
			session = factory.openSession();
			session.update("member.updateMember", paramVO);
			session.commit();
		} finally {
			session.close();
		}
		
	}
	
}

/test

 

/TestMyBatis.java

package test;

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

import org.kosta.model.MemberDAO;
import org.kosta.model.MemberVO;

public class TestMemberDAO {
	public static void main(String[] args) {
		MemberDAO dao = MemberDAO.getInstance();
		MemberVO paramVO = new MemberVO("치카치카", "d", "베네딕트", "런던");
		
		// 1. INSERT 시, 
		// 다수 정보 (id, password, name, address)가 전달되어야 할 때는,
		// VO(DTO) 또는 MAP 형태로 전달해준다.
		//insertMember(MemberVO) 실행
		dao.insertMember(paramVO);
		
		//2. 전체 회원 명단 반환받기 
		System.out.println("** 전체 회원 명단 **");
		List<MemberVO> list = dao.getAllMemberList();
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}
		
		//3. id로 회원 검색 (MemberVO 반환)
		// : 없으면 null, 있으면 MemberVO 반환
		System.out.println("** id로 회원 정보 검색 **");
		System.out.println(dao.findMemberById("cat"));

		//4. 총 멤버 수 반환(int 형으로 반환)
		System.out.println("** 총 멤버 수 반환 **");
		System.out.println("회원 수: " + dao.getTotalCount());
		
		//5. 회원정보 INSERT 시에 Map으로 전달
		System.out.println("** 멤버 추가 후 확인 **"); Map<String, String> map = new
		HashMap<String, String>(); 
		map.put("ID", "cutedonguk"); 
		map.put("PASS", "aa");
		map.put("NAME", "이동욱");
		map.put("ADDR", "경기도 광주");
		dao.insertMemberByMap(map); System.out.println(dao.findMemberById("Enola"));
		 
		
		//6. 회원 정보 조회 시, map으로 반환
		System.out.println("** id로 회원 정보 검색 (map으로 반환)**");
		System.out.println(dao.findMemberMapById("Enola"));

		//7. 회원 테이블의 주소 종류를 반환
		System.out.println("** 회원 테이블의 주소 종류를 반환 **");
		List<String> list2 = dao.getAddressKind();
		for(String addr:list2)
			System.out.println(addr);
		
		//8. 주소로 회원 검색 (반환형 : List<MemberVO>)
		String address="런던";
		List<MemberVO> list3 = dao.findMemberListByAddress(address);
		for(MemberVO vo:list3)
			System.out.println(vo);

		//9. 이름과 주소로 회원리스트 검색
		String name="배두나";
		String address2 = "서울";
		MemberVO memberVO = new MemberVO();
		memberVO.setName(name);
		memberVO.setAddress(address2);
		//MemberVO 객체를 전달해서 검색
		List<MemberVO> list4 = dao.findMemberListByNameAndAddress(memberVO);
		for(MemberVO vo:list4)
			System.out.println(vo);
		
		//10. 회원정보 수정
		MemberVO paramVO2 = new MemberVO("json", "c", "초록이", "프라하");
		dao.updateMember(paramVO2);
		System.out.println(dao.findMemberById("json"));
	}
}

[ 결과 ]  

728x90
반응형