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>
* 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. 게시판 구현하기
'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 |