mjeongriver
article thumbnail
Published 2023. 2. 6. 14:06
day78-spring TIL/Spring

1.MyBatis Mapper XML의 주요 속성(중요)

 

 

- select 속성

1) select: parameterType은 sql 구문이 데이터를 전달 받는 파라미터 타입, 생략이 가능

2) resultType: 결과 반환 타입(패키지 경로 포함, 전체 클래스명)

2) resultMap: join할 때 사용

 

- insert, update, delete 속성 = 반환이 없음, parameterType 생략 가능

 

- 마이바티스의 두개 이상 데이터 맵핑 처리(암기)

1) 단일값이면 언제든지 전달할 수 있다.

2) VO를 통해서 한번에 전달 할 수 있다. (매개변수에 VO가 들어갈 때!)

3) map을 통해서도 전달 할 수 있다. (맵을 선언하고 key=값) 부득이한 경우를 제외하고는 사용 빈도가 적다. (지양-map 데변화되는 데이터에 대한 대처를 하기 힘들기 때문에)

4) @Param 이름 지정을 사용해서 맵핑(2~4개와 같은 여러 값을 전달해야 할 때)

 

- 동적쿼리 지원: 조건에 따라 변화됨.

 

* TestMapper.java, TestMapper.xml, JDBCMybatis, root-context, mybatis-config

 

더보기

- TestMapper.java

package com.simple.basic.mapper;

import java.util.ArrayList;
import java.util.Map;

import org.apache.ibatis.annotations.Mapper;

import com.simple.command.ScoreVO;

@Mapper 
//마이 바티스 매퍼를 지칭하는 하나의 어노테이션(지칭하지 않더라도 정상적으로 빈을 등록할 수 있음)
//스프링에서는 생략이 가능합니다.
public interface TestMapper {
	
	public String getTime(); //1
	
	//매개변수는 없고 반환은 있는 유형
	public ArrayList<ScoreVO> getScore();
	//단일값
	public ScoreVO getOne(int a);
	
	public int insertOne(String name); //단일값
	public int insertTwo(ScoreVO vo); //다중값
	public int insertThree(Map<String, String> map); //다중값

	public Map<String, Object> selectMap(int num); //3번 키값 조회
	public ArrayList<Map<String, Object>> selectTwo(); //맵을 통한 다중행 조회

	//3번 업데이트
	public boolean updateOne(ScoreVO vo);
	
	

}

 

- TestMapper.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">

<!-- namespace에 인터페이스의 패키지명을 포함한 풀 경로를 적습니다. -->
<mapper namespace="com.simple.basic.mapper.TestMapper">

	<!-- id는 인터페이스의 메서드 명이 들어갑니다. resultType은 반환 타입 -->
	<select id="getTime" resultType="string">
		select now()
	</select>

	<!-- 세미콜론 ; 적지 않습니다. -->
	<!-- 인터페이스에 맞춰서 select 태그 생성 id는 메서드명과 동일하게! -->
	<!-- 한 행에 대한 처리를 할 데이터 타입 -->
	<!-- resultType에는 풀 경로 적어줘야함! -->
	<select id="getScore" resultType="com.simple.command.ScoreVO">
		select * from score
	</select>

	<!-- 매개변수: 단일값(매개변수 명을 그대로) -->
	<select id="getOne" resultType="com.simple.command.ScoreVO">
		select * from score where num =
		#{a}
	</select>

	<!-- parameterType: 매개변수의 타입(생략 가능) -->
	<insert id="insertOne" parameterType="string">
		insert into score(name)
		values(#{name})
	</insert>

	<insert id="insertTwo"
		parameterType="com.simple.command.ScoreVO">
		insert into score(name, kor, eng)
		values(#{name}, #{kor}, #{eng})
	</insert>

	<insert id="insertThree">
		insert into score(name, kor, eng)
		values(#{name}, #{kor}, #{eng})
	</insert>
	
	<select id="selectMap" resultType="map" parameterType="int">
		select * from score where num = #{num} 
	</select>
	
	<select id="selectTwo" resultType="map">
		select * from score
	</select>
	
	<!-- alias 설정이 있다면 parameter, result 타입에 단축명으로 사용 가능합니다. -->
	<update id="updateOne" parameterType="ScoreVO">
		update score set name = #{name}, 
						 kor = #{kor}, 
						 eng = #{eng}
		where num = #{num}
	</update>


</mapper>

 

- JDBCMybatis.java

package com.simple.basic;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.simple.basic.mapper.TestMapper;
import com.simple.command.ScoreVO;

@RunWith(SpringJUnit4ClassRunner.class) //junit으로 테스트 환경을 구성
@ContextConfiguration("file:src/main/webapp/WEB-INF/config/root-context.xml") //동작시킬 스프링 설정 파일
public class JDBCMybatis {
	
	//인터페이스 주입
	@Autowired
	TestMapper testMapper;
	
//	@Autowired
//	SqlSessionFactoryBean sqlSessionFactory;
//
//	@Test
//	public void testCode01() {
//		//마이 바티스 핵심 객체
//		System.out.println(sqlSessionFactory);
//		
//	}
	
//	@Test
//	public void testCode02() {
//		String time = testMapper.getTime();
//		System.out.println(time);
//	}
	
	//select 태그의 resultType
//	@Test
//	public void testCode03() {
//		ArrayList<ScoreVO> list = testMapper.getScore();
//		System.out.println(list.toString());
//	}
	
	//매개변수 - 단일값
//	@Test
//	public void testCode04() {
//		ScoreVO vo = testMapper.getOne(1);
//		System.out.println(vo.toString());
//	}
	
	//insert - 단일값
//	@Test
//	public void testCode05() {
//		int result = testMapper.insertOne("이순신");
//		System.out.println("성공실패: " + result);
//	}
	
	//insert - 다중값(vo): setter가 파라미터가 됩니다.
//	@Test
//	public void testCode06() {
//		ScoreVO vo = new ScoreVO(0, "테스트", "34", "100");
//		int result = testMapper.insertTwo(vo);
//		System.out.println("성공 실패: " + result);
//	}
	
	//insert - 다중값(Map): key값이 파라미터가 됩니다.
//	@Test
//	public void testCode07() {
//		
//		Map<String, String> map = new HashMap<>();
//		map.put("name", "홍길자");
//		map.put("kor", "30");
//		map.put("eng", "40");
//		
//		int result = testMapper.insertThree(map);
//		System.out.println("성공 실패: " + result);
//	}
	
	//select - map 타입의 반환
//	@Test
//	public void testCode08() {
//		Map<String, Object> map = testMapper.selectMap(3);
//		System.out.println(map.toString());
//	}
	
	//select - map 타입의 반환: 맵 타입을 사용하는 것은 부득이한 경우만 사용합니다.
//	@Test
//	public void testCode09() {
//		ArrayList<Map<String, Object>> list = testMapper.selectTwo();
//		System.out.println(list.toString());
//		
//	}
	
	//update구문
	@Test
	public void testCode10() {
		ScoreVO vo = new ScoreVO(4, "변경", "100", "100");
		
		boolean result = testMapper.updateOne(vo);
		System.out.println("성공 실패" + result);
	}
	
	
}

 

- root-context

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:jdbc="http://www.springframework.org/schema/jdbc"
	xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
	xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd
		http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">

	<!-- 데이터 베이스 정보는 외부 파일로 관리 -->
	<!-- classpath:/ 자바/리소스 경로를 가르킵니다 -->
	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<!-- 위에 src/main/resources를 가르킴 -->
		<property name="location" value="classpath:/DB-config/hikari.properties"></property>
	</bean>
	
	
	<!-- 데이터 베이스 연결 작업, 설정 -->
	<bean id="hikari" class = "com.zaxxer.hikari.HikariConfig">
		<property name="driverClassName" value="${ds.dirverClassName}"/>
		<property name="jdbcUrl" 		 value="${ds.jdbcUrl}"/>
		<property name="username" 		 value="${ds.username}"/>
		<property name="password" 		 value="${ds.password}"/>
	</bean>
	
	<!--  
	<bean id="hikari" class = "com.zaxxer.hikari.HikariConfig">
		<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
		<property name="jdbcUrl" 		 value="jdbc:oracle:thin:@localhost:1521:xe"/>
		<property name="username" 		 value="jsp"/>
		<property name="password" 		 value="jsp"/>
	</bean>
	-->
	
	
	<!-- 데이터 베이스 정보를 주입 -->
	<bean id="ds" class="com.zaxxer.hikari.HikariDataSource">
		<constructor-arg ref="hikari"></constructor-arg>
	</bean>
	
	<!-- 마이 바티스 설정 sqlSessionFactory 생성 -->
	<!-- classpath:/ 자바/리소스 경로를 가르킵니다 -->
	<bean class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 데이터 베이스 정보 전달 -->
		<property name="dataSource" ref="ds"/>
		<property name="configLocation" value="classpath:/mybatis-config/mybatis-config.xml"></property>
	</bean>
	
	<!-- 마이 바티스 mxl의 위치 지정, 마이 바티스 관련 어노테이션을 찾아서 설정으로 등록(모든 인터페이스를 등록)-->
	<mybatis-spring:scan base-package="com.simple.*"/>

</beans>

 

- mybatis-config

<?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">


<!-- 마이바티스 부연 설정: ScoreVO를 단축명으로 설정 -->
<configuration>
	<typeAliases>
		<typeAlias type="com.simple.command.ScoreVO" alias="ScoreVO"/>
	</typeAliases>
</configuration>

 

mybatis-config를 쓰면 길게 주소 안 쓰고 ScoreVO라고 쓸 수 있음! (선택 사항: 안넣더라도 문제는 없음) 똑같이 하고 업데이트를 하더라도 문제가 없어야 합니다.

 

 

* ScoreServiceImpl, scroreMapper, scoreMapper.xml, root-context

- serviceimpl을 mapper로 연결

더보기

- ScoreServiceImpl

package com.simple.score.service;

import java.util.ArrayList;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

import com.simple.command.ScoreVO;
import com.simple.score.dao.ScoreDAO;
import com.simple.score.mapper.ScoreMapper;

//4개는 같은 의미지만 service영역에서는 service를 사용해주자
//@Service //@Repository //@Component //@Controller
@Service("이름") //bean의 이름 명시(붙이기)
public class ScoreServiceImpl implements ScoreService{

	//마이바티스의 매퍼
	@Autowired
	private ScoreMapper scoreMapper;
	
	
	@Override
	public void regist(ScoreVO vo) {
		scoreMapper.regist(vo);
	}

	@Override
	public ArrayList<ScoreVO> getList() {
		return scoreMapper.getList();
	}

	@Override
	public void delete(int num) {
		scoreMapper.delete(num);
	}

	/*
	@Autowired
	@Qualifier("yyy")
	private ScoreDAO scoreDAO;
	
	public void regist(ScoreVO vo) {
		
		System.out.println(vo.toString());
		scoreDAO.regist(vo);
	}

	@Override
	public ArrayList<ScoreVO> getList() {
		
//		ArrayList<ScoreVO> list= scoreDAO.getList();
		
		return scoreDAO.getList();
	}

	@Override
	public void delete(int num) {
		scoreDAO.delete(num);
		
	}
	*/
	
}

 

- scroreMapper.java

package com.simple.score.mapper;

import java.util.ArrayList;

import org.apache.ibatis.annotations.Mapper;

import com.simple.command.ScoreVO;

@Mapper //mybatis-scan: 이 패키지를 읽게끔 만들어줘야함.
public interface ScoreMapper {
	public void regist(ScoreVO vo);
	public ArrayList<ScoreVO> getList();
	public void delete(int num);
}

 

- scoreMapper.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="com.simple.score.mapper.ScoreMapper">
 
 	<insert id="regist">
 		insert into score(name, kor, eng)
 		values(#{name}, #{kor}, #{eng})
 	</insert>
 	
 	<select id="getList" resultType="ScoreVO">
 		select * from score order by num desc
 	</select>
 	
 	<delete id="delete">
 		delete from score where num = #{num}
 	</delete>
 
 </mapper>

 

- root-context

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:jdbc="http://www.springframework.org/schema/jdbc"
	xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
	xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd
		http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">

	<!-- 데이터 베이스 정보는 외부 파일로 관리 -->
	<!-- classpath:/ 자바/리소스 경로를 가르킵니다 -->
	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<!-- 위에 src/main/resources를 가르킴 -->
		<property name="location" value="classpath:/DB-config/hikari.properties"></property>
	</bean>
	
	
	<!-- 데이터 베이스 연결 작업, 설정 -->
	<bean id="hikari" class = "com.zaxxer.hikari.HikariConfig">
		<property name="driverClassName" value="${ds.dirverClassName}"/>
		<property name="jdbcUrl" 		 value="${ds.jdbcUrl}"/>
		<property name="username" 		 value="${ds.username}"/>
		<property name="password" 		 value="${ds.password}"/>
	</bean>
	
	<!--  
	<bean id="hikari" class = "com.zaxxer.hikari.HikariConfig">
		<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
		<property name="jdbcUrl" 		 value="jdbc:oracle:thin:@localhost:1521:xe"/>
		<property name="username" 		 value="jsp"/>
		<property name="password" 		 value="jsp"/>
	</bean>
	-->
	
	
	<!-- 데이터 베이스 정보를 주입 -->
	<bean id="ds" class="com.zaxxer.hikari.HikariDataSource">
		<constructor-arg ref="hikari"></constructor-arg>
	</bean>
	
	<!-- 마이 바티스 설정 sqlSessionFactory 생성 -->
	<!-- classpath:/ 자바/리소스 경로를 가르킵니다 -->
	<bean class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 데이터 베이스 정보 전달 -->
		<property name="dataSource" ref="ds"/>
		<property name="configLocation" value="classpath:/mybatis-config/mybatis-config.xml"></property>
	</bean>
	
	<!-- 마이 바티스 mxl의 위치 지정, 마이 바티스 관련 어노테이션을 찾아서 설정으로 등록(모든 인터페이스를 등록)-->
	<mybatis-spring:scan base-package="com.simple.*"/>

</beans>

 

* 이 방식대로 DAO가 아닌 mapper로 boardregister 예제 연습 할 것!

 

2. 게시판 구현하기

 

4번째 사진: 베이스 패키지

 

pom.xml, web.xml 전에꺼 복사해서 붙여 넣고 spring 폴더 config로 변경하고 servlet-context도 config 폴더 안에 넣을 것! 그리고 servlet-context 수정하고 서버 킬 것!

 

순서대로 진행한 후 마지막 폴더 정렬 참고해서 선생님 공유 폴더에 여행에 있는 파일들 view와 resources 아래에 넣어둘 것!

 

 

'TIL > Spring' 카테고리의 다른 글

day80-spring  (0) 2023.02.08
day79-spring  (0) 2023.02.07
day77-spring  (0) 2023.02.03
day76-spring  (0) 2023.02.02
day75-spring  (1) 2023.02.01
profile

mjeongriver

@mjeongriver

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그