반응형
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>
반응형
'framework > mybatis' 카테고리의 다른 글
[mybatis] 9. XML+INTERFACE 매퍼(매퍼바인딩) 3 (MYHEWON) (0) | 2024.07.22 |
---|---|
[mybatis] 8. XML+INTERFACE 매퍼(매퍼바인딩) 2 (MYUSER, MYCOMMENT, MYREPLY) (0) | 2024.07.21 |
[mybatis] 6. XML + 인터페이스 기반의 매퍼파일 (MyMember 출력 프로그램) (1) | 2024.07.21 |
[mybatis] 5. 인터페이스 기반의 매퍼파일 (MyMember 출력 프로그램) (1) | 2024.07.20 |
[mybatis] 4. XML기반의 매퍼파일 (MyMember 출력 프로그램) (0) | 2024.07.20 |