20211208 Mybatis
ORM vs SQL MAPPER
Mybatis : 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크
공식 사이트 : http://www.mybatis.org/mybatis-3/ko/index.html
MyBatis – 마이바티스 3 | 소개
Copyright © 2009–2021MyBatis.org. .
mybatis.org
웹 프로젝트 3 layer
view : 타임리프
service : 데이터 로직. 데이터를 가공.
mybatis + spring boot
들어오는 사람마다 세션이 생성이된다. 사람마다 생성을 해줘야한다. 이걸 관리해주는 것이 DBCP 라고한다.
(DataBase Connection Pool )
List<Member>를 명시해주면 resultType 은 저절로 변환된다.
1. 프로젝트 생성
2. 타임리프 라이브러리 추가
pom.xml
<!-- https://mvnrepository.com/artifact/nz.net.ultraq.thymeleaf/thymeleaf-layout-dialect -->
<dependency>
<groupId>nz.net.ultraq.thymeleaf</groupId>
<artifactId>thymeleaf-layout-dialect</artifactId>
</dependency>
3. 타임리프 때 배웠던 파일 복사해주기
4. 프로퍼티 > 애플리케이션 서버 설정
5. MainController.java
package ksmart41.mybatis.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class MainController {
/**
* @Controller 를 정의한 클래스들의 메소드의 반환형이 String 인 경우 프로젝트 화면의 논리적 경로가 된다.
* @return String -> 논리 이름만 쓴다.(ex: src/main/resources/templates/ +"논리이름)
*/
@GetMapping("/")
public String main() {
return "main";
}
}
6. 실패한다. 왜? jdbc 에 대한 연결정보가 없다.
*************************** APPLICATION FAILED TO START *************************** Description: Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver class Action: Consider the following: If you want an embedded database (H2, HSQL or Derby), please put it on the classpath. If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active). |
7. db연결정보를 설정해준다.
#db 연결정보 설정
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/ksmart41db?serverTimezone=UTC&characterEncoding=UTF8
spring.datasource.username=ksmart41id
spring.datasource.password=ksmart41pw
만약에 id 를 잘못입력했다면?
Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: Access denied for user 'ksmart41i'@'localhost' (using password: YES) |
ip나 id 가 잘못설정되었을 때.
8.아스키아트 설정 application.properties
#spring banner 설정
spring.banner.location=classpath:templates/banner.txt
9. Member.java
private String memberLevel; 은 1,2,3 만 받아온다 . 멤버 레벨의 이름도 받아올 수있게 해주자.
Member.java 에 아래 코드와 toString 을 추가로 넣어준다.
private String memberLevelName;
public String getMemberLevel() {
return memberLevel;
}
public void setMemberLevel(String memberLevel) {
this.memberLevel = memberLevel;
}
10. MemberService.java
memberList 가 null 이 아닐 경우 (true) -->
List를 반복문으로 풀어서 1일 경우 MemberLevelName 에 "관리자"를 셋팅해준다.
package ksmart41.mybatis.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import ksmart41.mybatis.dto.Member;
import ksmart41.mybatis.mapper.MemberMapper;
@Service
public class MemberService {
/**
* DI (의존성 주입) -> @autowired
* 1. 프로퍼티
* 2. 세터 메서드
* 3. 생성자 메서드
*/
/*
//프로퍼티 주입방식
@Autowired private MemberMapper memberMapper; //1개의 프로퍼티만 가능하다. 2개를 활용하고 싶다면 다시 @autowired 를 선언해준다.
//세터 DI 주입방식
private MemberMapper memberMapper;
@Autowired
public void setMemberMapper(MemberMapper memberMapper) {
this.memberMapper = memberMapper;
}
*/
//생성자 메서드 주입방식
private MemberMapper memberMapper;
//@Autowired <- 생성자 메서드 주입방식에서는 명시안해도 인식해준다! 위의 2개는 순환참조되어서 잘 안쓴다.
public MemberService(MemberMapper memberMapper) {
this.memberMapper = memberMapper;
}
public List<Member> getMemberList(){
List<Member> memberList = memberMapper.getMemberList();
return memberList;
// 위의 2줄= return memberMapper.getMemberList();
}
}
11. mysql 관련 설정 추가. application.properties
#mybatis 설정 ( classpath: src/main/resources/)
# mapper sml 파일 위치 설정
mybatis.mapper-locations=classpath:mapper/**/*.xml
# mapper xml 안에 domain do vo 클래스의 주소 축약 (ex: ksmart41.mybatis.dto.Member -> Member )
mybatis.type-aliases-package=ksmart41.mybatis.dto
12. MemberList.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorate="@{layout/default}">
<th:block layout:fragment="customContents">
<title th:title="${title}"></title>
</th:block>
<th:block layout:fragment="customContents">
<table border="1">
<thead>
<tr>
<td>회원 아이디</td>
<td>회원 비밀번호</td>
<td>회원 권한</td>
<td>회원 이름</td>
<td>회원 이메일</td>
<td>회원 주소</td>
<td>회원 등록날짜</td>
<td>수정</td>
<td>삭제</td>
</tr>
</thead>
<tbody>
<tr th:if="${not #lists.isEmpty(memberList)}" th:each="l : ${memberList}">
<td th:text="${l.memberId}"></td>
<td th:text="${l.memberPw}"></td>
<td th:text="${l.memberLevelName}"></td>
<td th:text="${l.memberName}"></td>
<td th:text="${l.memberEmail}"></td>
<td th:text="${l.memberAddr}"></td>
<td th:text="${l.memberRegDate}"></td>
<td>
<a th:href="@{#}">수정</a>
</td>
<td>
<a th:href="@{#}">삭제</a>
</td>
</tr>
<tr th:unless="${not #lists.isEmpty(memberList)}">
<td colspan="9">등록된 회원이 없습니다.</td>
</tr>
</tbody>
</table>
</th:block>
</html>
13.header 링크 변경
15. scroll 추가
1)
2)
16.
MyBatis – 마이바티스 3 | 시작하기
Copyright © 2009–2021MyBatis.org. .
mybatis.org
MemberMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="ksmart41.mybatis.mapper.MemberMapper">
</mapper>
--> mapper 안에 select 구문 추가
<select id="getMemberList" resultType="Member">
SELECT
m.m_id AS memberId
,m.m_pw AS memberPw
,m.m_name AS memberName
,m.m_level AS memberLevel
,m.m_email AS memberEmail
,m.m_addr AS memberAddr
,m.m_reg_date AS memberRegDate
FROM
tb_member AS m;
</select>
insert 후 네트워크
- 값을 받아와진다.