framework/mybatis

[mybatis] 7. XML+INTERFACE 매퍼(매퍼바인딩) 1 (MYUSER)

jeri 2024. 7. 21. 00:33
반응형

01. DTO

1) MyUser.java

package xyz.itwill.dto;

/*
MYUSER테이블 : 회원정보를 저장하기 위한 테이블
=> SQL 명령은 대소문자를 구분하지 않아 식별자를 선언할 때 스네이크 표기법 사용
=> 스네이크 표기법(SnakeCase) : 단어와 단어를 구분하기 위해 _ 기호를 사용하여 식별자를 선언하는 방법
>
//create table myuser(user_id varchar2(50) primary key, user_name  varchar2(50));
이름        널?       유형
--------- -------- ------------
USER_ID   NOT NULL VARCHAR2(50) - 아이디
USER_NAME          VARCHAR2(50) - 이름
*/
//package 엘리먼트에 의해 MyUser 가 자동으로 별칭으로 사용 가능해짐

//자바 자료형(Class, Interface, Enum)을 선언할 경우 파스칼 표기법 사용
// => 파스칼 표기법(PascalCase) : 모든 단어의 첫문자를 대문자로 표현하여 식별자를 선언하는 방법
public class MyUser {
	//Java 자료형을 제외한 식별자를 선언할 경우에는 카멜 표기법 사용
	// => 카멜 표기법(CamelCase) : 첫단어를 제외한 나머지 단어의 첫문자를 대문자로 표현하여 식별자를 선언하는 방법
	private String userId;  //자바에서는 카멜 표기법으로 만들어주는 것이 정석
	private String userName;
	public MyUser() {}
	public MyUser(String userId, String userName) {
		super();
		this.userId = userId;
		this.userName = userName;
	}
    public String getUserId() { return userId;}
	public void setUserId(String userId) { this.userId = userId;}
	public String getUserName() { return userName;}
	public void setUserName(String userName) { this.userName = userName;}
}

 

02. Mapper바인딩

1) MyUserMapper.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="xyz.itwill.mapper.MyUserMapper">
	<insert id="insertUser" parameterType="MyUser">
		insert into myuser values(#{userId},#{userName})
	</insert>
    
    
	<!-- 🖤자동매핑 : resultType -->
	<!-- resultType속성을 사용하면 resultType 속성값으로 설정된 클래스로 객체를 생성하여 검색행의 컬럼값을 객체의 필드값으로 자동 저장하여 제공 - 자동매핑 -->
	<!-- 문제점: 검색행의 [컬럼명:user_id,user_name]과 resultType 속성값으로 설정된 클래스의 [필드명:userId,userName]이 모두 다른 경우 resultType 속성값으로 설정된 클래스의 객체 대신 NULL 제공 -->
	<!--
	<select id="selectUserList" resultType="MyUser">
		select * from myuser order by user_id
	</select>
	 -->


	<!-- 해결방법1-1-->
	<!-- 검색행의 컬럼명을 resultType 속성값으로 설정된 클래스의 필드명과 같도록 검색 -->
	<!-- => select 명령에서 Column Alias 기능을 이용하여 검색대상의 별칭을 필드명과 같도록 사용하여 검색 -->
	<!--
	<select id="selectUserList" resultType="MyUser">
		select user_id userId, user_name userName from myuser order by user_id
	</select>
	-->

	<!-- 해결방법1-2 -->
	<!-- 검색행의 컬럼명을 resultType 속성값으로 설정된 클래스의 필드명과 같도록 검색 -->
	<!-- sql : SQL 명령을 구성하는 일부분의 문장을 등록하기 위한 엘리먼트 -->
	<!--
	<sql id="MyUserColumnAlias">
		user_id userId, user_name userName
	</sql>
	-->
	<!-- include : SQL 엘리먼트로 등록된 문장을 제공받아 SQL 명령에 포함하는 엘리먼트 -->
	<!-- refid속성 : SQL 엘리먼트의 식별자를 속성값으로 설정 - referenceid -->
	<!--
	<select id="selectUserList" resultType="MyUser">
		select <include refid="MyUserColumnAlias"/> from myuser order by user_id
	</select>
	-->



	<!-- 해결방법2 -->
	<!-- mybatis 환경설정 파일(mybatis-confing.xml)의 setting 엘리먼트를 사용하여 스네이크 표기법의 표현된 식별자를 자동으로 카멜 표기법으로 변환되도록 환경설정 변경 -->
	<!-- 주의) 컬럼명(ex. user_id)과 필드명(ex. id)이 같지 않으면 자동으로 카멜표기법으로 바껴도 사용할 수 없음-->
	<!--
	<select id="selectUserList" resultType="MyUser">
		select * from myuser order by user_id
	</select>
	-->



	<!-- 해결방법3 : 🖤수동매핑 : resultMap🔥-->
	<!-- resultMap 엘리먼트를 사용하여 검색행의 컬럼값이 클래스의 필드에 저장되도록 매핑 처리 - 수동 매핑 -->
	<!-- resultMap : 검색행을 Java 객체로 생성하여 제공하기 위한 엘리먼트 -->
	<!-- => 검색행의 컬럼값을 필드에 저장하기 위해 하위 엘리먼트를 사용 -->
	<!-- => 하위엘리먼트 : constructor, id, result, association, collection, discriminator -->
	<!-- type속성 : resultMap 엘리먼트로 제공될 Java 객체의 자료형(클래스)을 속성값으로 설정 -->
	<!-- => Java 자료형 대신 typeAlias 엘리먼트의 별칭 사용 가능 -->
	<!-- id속성 : resultMap 엘리먼트의 식별자를 속성값으로 설정 -->

	<resultMap type="MyUser" id="myUserResultMap">
		<!-- id : 검색행의 컬럼값을 필드에 저장하기 위한 엘리먼트 - Setter 메소드 호출 -->
		<!-- => PK 제약조건이 설정된 컬럼값을 제공받아 필드에 저장하기 위해 사용 -->
		<!-- column속성 : 검색행의 컬럼명을 속성값으로 설정 -->
		<!-- property속성 : 클래스의 필드명을 속성값으로 설정 -->
		<id column="user_id" property="userId"/>
      
		<!-- result : 검색행의 컬럼값을 필드에 저장하기 위한 엘리먼트 - Setter 메소드 호출 -->
		<result column="user_name" property="userName"/>
	</resultMap>

	<!-- resultMap속성 : resultMap 엘리먼트의 식별자를 속성값으로 설정 - 수동매핑 -->
	<select id="selectUserList" resultMap="myUserResultMap">
		select * from myuser order by user_id
	</select>
</mapper>

2) MyUserMapper.java

package xyz.itwill.mapper;

import java.util.List;

import xyz.itwill.dto.MyUser;

public interface MyUserMapper {
	int insertUser(MyUser user);
	List<MyUser> selectUserList();
}

03. DAO

1) MyUserDAO.java

package xyz.itwill.dao;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import xyz.itwill.dto.MyUser;
import xyz.itwill.mapper.MyUserMapper;

public class MyUserDAO extends AbstractSession{
	private static MyUserDAO _dao;

	private MyUserDAO() {
		// TODO Auto-generated constructor stub
	}

	static {
		_dao = new MyUserDAO();
	}
	public static MyUserDAO getDAO() {
		return _dao;
	}
	public int insertUser(MyUser user) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyUserMapper.class).insertUser(user);
		} finally {
			sqlSession.close();
		}
	}
	public List<MyUser> selectUserList() {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyUserMapper.class).selectUserList();
		} finally {
			sqlSession.close();
		}
	}
}

04. JSP

1) userInsert.jsp

<%@page import="xyz.itwill.dto.MyUser"%>
<%@page import="xyz.itwill.dao.MyUserDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	MyUserDAO.getDAO().insertUser(new MyUser("aaa","홍길동"));
	MyUserDAO.getDAO().insertUser(new MyUser("xyz","임꺽정"));
	MyUserDAO.getDAO().insertUser(new MyUser("opq","전우치"));
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MYBATIS</title>
</head>
<body>
	<h1>회원등록</h1>
	<hr />
	<h3>회원정보가 성공적으로 삽입되었습니다.</h3>
</body>
</html>

2) userListSelect.jsp

<%@page import="xyz.itwill.dao.MyUserDAO"%>
<%@page import="xyz.itwill.dto.MyUser"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	List<MyUser> userList = MyUserDAO.getDAO().selectUserList();
	//System.out.println("userList.size() = "+userList.size());
	//System.out.println("userList.get(0) = "+userList.get(0));
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MYBATIS</title>
</head>
<body>
	<h1>회원목록</h1>
	<hr />
	<ul>
		<%for(MyUser user:userList){ %>
		<li>아이디 = <%=user.getUserId() %>, 이름 =<%=user.getUserName() %></li>
		<%} %>
	</ul>
</body>
</html>
반응형