Java/Spring

MyBatis 설정(ORM)

amungstudy 2023. 7. 27. 14:52

MyBatis ORM framework
ORM Object Relational Mapping
객체 관계형 맵핑
데이터베이스에서 검색된 내용을 객체로 전달

 

select 시 파라미터 1개밖에 사용 못함. 그래서 여러개 파라미터 넣는 경우 MAP으로 자주 사용함.

 

1. MAVEN REPOSITORY -> 'MyBatis' ,'mybatis-spring' 2가지 -> pom.xml에 추가

 

2. root-context.xml에 mybatis bean 추가

 

<!-- Mybatis 연동 객체 생성 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="ds"/> <!-- ref : 등록시켜놓은 bean 사용하겠다. -->
<property name="configLocation" value="classpath:/MyBatisConfig.xml"/> <!-- configLocation : 설정 정의 -->
</bean>

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>


SqlSessionFactory 제대로 되어있는지 test해봄

 

package com.bitc.db_test;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

//junit 4.12버전 이상이어야 spring container와 함께 테스트 가능.
@RunWith(SpringJUnit4ClassRunner.class) // spring test lib로 테스트
@ContextConfiguration( // load할 파일 위치 지정
locations = {
"file:src/main/webapp/WEB-INF/spring/root-context.xml"
//"classpath:test-context.xml" // classpath: src/test/resources폴더경로.
}
)
public class DataSourceTest {

@Autowired
DataSource ds;

@Autowired
SqlSessionFactory sqlSessionFactory;

@Test
public void testFactory() {
SqlSession session = sqlSessionFactory.openSession();
System.out.println(session); 
}

@Test
public void testConn() {
Connection conn = null;

try {
conn = ds.getConnection();
System.out.println(conn);
} catch (SQLException e) {
System.out.println("dataBase 연결 실패");
e.printStackTrace();
}finally {
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {}
}
}
}

}


<?xml version="1.0" encoding="UTF-8"?>

<!-- 
src/main/resources/MyBatisConfig.xml
mybatis 환경 설정 파일 
-->

<!DOCTYPE configuration 
PUBLIC "-//mybatis.org//DTD config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases> <!-- 별칭 지정(파라미터타입,result타입) -->
<typeAlias type="com.bitc.db_test.vo.MemberVO" alias="member"/>
</typeAliases>
<mappers>
<!-- 쿼리작업이 정의되어 있는 위치 -->
<mapper resource="sql/memberMapper.xml"/> 
</mappers>
</configuration>

 


<?xml version="1.0" encoding="UTF-8"?>
<!-- 
src/main/resources/sql/memberMapper.xml
수행할 쿼리 작업을 등록하는 파일 
-->
<!DOCTYPE mapper 
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="MemberMapper"> <!-- namespace로 mapper에 접근 -->
<!-- 검색 select, 삽입 insert, 수정 update, 삭제 delete -->
<!-- id로 태그에 접근 -->
<insert id="insertMember" 
statementType="PREPARED" 
parameterType="com.bitc.db_test.vo.MemberVO"> 
<!-- 기본값이 PREPARED -->
INSERT INTO tbl_member
VALUES(null,#{userid},#{userpw},#{username},now(),now())
</insert> <!-- mybatis문법: 파라미터 타입이 자바 기본타입이면 그냥 예약어 사용(ex. int)
꺼내온 값 쓸때는 변수 이름 작성(get메소드로 가져옴)
map인경우에는 key값 작성 -->
<!-- java.lang.String -->
<select id="read" parameterType="String" resultType="member">
SELECT * FROM tbl_member WHERE userid = #{userid}
</select>
<!-- java.util.Map -->
<select id="readWithPass" parameterType="Map" resultType="member">
SELECT * FROM tbl_member WHERE userid = #{id} AND userpw = #{pw}
</select>
<!-- selectList일 경우 List의 제네릭 타입을 resultType에 지정 -->
<select id="memberList" resultType="member">
SELECT * FROM tbl_member ORDER BY regdate DESC
</select>
<select id="max" resultType="int">
SELECT max(uno) FROM tbl_member;
</select>
</mapper>


package com.bitc.db_test.dao;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;

import com.bitc.db_test.vo.MemberVO;

import lombok.RequiredArgsConstructor;

@Repository("md")
@RequiredArgsConstructor
public class MemberMyBatisDAOImpl implements MemberDAO {

private final SqlSession session;

// MemberMapper == memberMapper.xml

@Override
public int insertMember(MemberVO member) {
// namespace.id 문자열로 전달
int result = session.insert("MemberMapper.insertMember", member);
System.out.println("dao : " + result);
return result;
}

@Override
public MemberVO readMember(String userid) {
MemberVO member = session.selectOne("MemberMapper.read", userid);
System.out.println(member);
return member;
}

@Override
public MemberVO readMemberWithPass(String userid, String userpw) {
Map<String,String> map = new HashMap<>(); // 만약에 2개 파라미터 타입이 다르면 <string,object>사용
map.put("id", userid);
map.put("pw", userpw);
MemberVO vo = session.selectOne("MemberMapper.readWithPass", map);
return vo;
}

@Override
public List<MemberVO> readMemberList() {
return session.selectList("MemberMapper.memberList");//parameter없으니까 문자열로만 작성
}

@Override
public Integer readMax() {
int result = session.selectOne("MemberMapper.max");
return result;
}

}


실제 test 해보는 클래스

 

package com.bitc.db_test;

import java.util.List;

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

import com.bitc.db_test.dao.MemberDAO;
import com.bitc.db_test.vo.MemberVO;

@RunWith(SpringJUnit4ClassRunner.class)

( 테스트용 스프링 컨테이너 생성)
@ContextConfiguration(locations= {"file:src/main/webapp/WEB-INF/spring/root-context.xml"})


public class MemberDAOTest {

@Autowired
MemberDAO md;

@Before // org.junit.before
public void init() {
System.out.println("memberDAO : " + md);
}

//@Test
public void testInsertMember() {
MemberVO member = new MemberVO();
member.setUserid("id002");
member.setUserpw("pw002");
member.setUsername("최기근");
int result = md.insertMember(member);
System.out.println("insertMember result = " + result);
}


@Test
public void testReadMember() {
MemberVO member = md.readMember("id001");
System.out.println(member);

MemberVO memberWithPass = md.readMemberWithPass("id002", "pw002");
System.out.println("with pass : "+memberWithPass);
System.out.println("=============================");

List<MemberVO> list = md.readMemberList();
for(MemberVO vo : list) {
System.out.println(vo);
}

int maxNumber = md.readMax();
System.out.println("maxNumber : " + maxNumber);
}
}