<?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"/>
<typeAlias type="com.simple.command.BoardVO" alias="BoardVO"/>
</typeAliases>
</configuration>
DOCTYPE - config로 설정
Root-context.xml
<!-- 마이바티스 설정 sqlSessionFactory 빈으로 생성 -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 데이터베이스 정보 전달 -->
<property name="dataSource" ref="ds" /> <!-- bean객체 주입 -->
<property name="configLocation" value="classpath:/mybatis-config/mybatis-config.xml" />
</bean>
<mybatis-spring:scan base-package="com.simple.*"/>
Spring 연결
serviceImpl에서 Mapper 인터페이스를 불러서 사용
service인터페이스와 Mapper인터페이스는 동일한 구조
ScoreMapper 인터페이스
package com.simple.score.mapper;
import java.util.ArrayList;
import org.apache.ibatis.annotations.Mapper;
import com.simple.command.ScoreVO;
// ScoreDAO를 myBatis로 바꾸려고
@Mapper //mybatis-scan 하게 하려고 root-context.xml 변경
public interface ScoreMapper {
public void regist(ScoreVO vo); //서비스 영역에서 만든것과 거의 완전 동일하게 만듦
public ArrayList<ScoreVO> getList();
public void delete(int num);
}
@Mapper 어노테이션 붙이기
나머지는 ScoreDAO와 같음
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>
DOCTYPE - mapper로 설정
데이터베이스 테이블에 대한 SQL 쿼리와 Java 객체 간의 매핑을 정의
Mapper XML
Namespace - 인터페이스 경로와 동일하게 작성
Id - 인터페이스 추상메서드와 동일하게 작성
resultType - 추상메서드의 리턴타입과 동일하게 작성
Mapper XML 속성 [ 중요 ]
두개 이상 맵핑 처리
단일값은 그냥 전달 가능
@Param
VO클래스 자동 맵핑
HashMap 자동 맵핑 (변환하는데이터에 바로 적용이 힘들어 부득이한 경우 아니면 잘 사용X)
@Param 이름 지정을 사용해서 맵핑
동적쿼리 지원: 검색에서 사용 (나중)
1. if
2. choose(when, overwise)
3. foreach
테스트
1. JDBCTest.java
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">
<!-- 인터페이스의 풀경로를 적습니다. -->
<mapper namespace="com.simple.basic.mapper.TestMapper"> <!-- 내가 실행시킬 풀 경로 -->
<!-- id는 인터페이스의 메서드명 resultType=반환타입 -->
<select id="getTime" resultType="string">
select now()
</select>
<!-- ; 은 없습니다 -->
<!-- 한 행에 대한 처리를 할 데이터 타입 (풀경로) -->
<select id="getScore" resultType="ScoreVO">
select * from score
</select>
<!-- 매개변수 - 단일값 -->
<select id="getOne" resultType="ScoreVO">
select * from score where num = #{a}
</select>
<!-- insert -->
<!-- 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">
score * from score
</select>
<!-- alias 설정이 있다면 parameter, result타입에 단축명으로 사용 가능합니다. -->
<update id="updateOne" parameterType="ScoreVO">
update score
set name = #{name},
kor = #{kor},
eng = #{eng}
where num = #{num}
</update>
<insert id="insertFour">
insert into score(name, kor) values(#{변수명1}, #{변수명2})
</insert>
</mapper>
2. 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
// SqlSessionFactoryBean sqlSessionFactory;
//
// @Test
// public void testCode01() {
// //마이바티스 핵심 객체
// System.out.println(sqlSessionFactory);
// }
@Autowired
TestMapper testMapper;
// @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(7);
// 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, "테스트", "60", "50");
// 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", "100");
// map.put("eng", "10");
//
// int result = testMapper.insertThree(map);
// System.out.println("성공실패:" + result);
// }
//select - map타입의 반환
// @Test
// public void testCode08() {
// Map<String, Object> map = testMapper.selectMap(6);
// 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(6, "변경", "100", "100");
// boolean result = testMapper.updateOne(vo);
// System.out.println("성공실패:" + result);
// }
//insert구문 @Param - 매개변수
@Test
public void testCode11() {
testMapper.insertFour("파람테스트", 100);
}
}