41기 개발자과정

20211208 Mybatis

segment 2021. 12. 8. 16:39

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 | 시작하기

 

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 후 네트워크 

- 값을 받아와진다.