2022. 2. 15. 00:19ㆍJAVA/MyBatis
1. 설치
https://github.com/mybatis/mybatis-3/releases
Releases · mybatis/mybatis-3
MyBatis SQL mapper framework for Java. Contribute to mybatis/mybatis-3 development by creating an account on GitHub.
github.com
- mybatis-3.5.9.zip 다운로드
- mybatis-3.5.9.jar 파일을 프로젝트 lib 폴더에 저장
- Project Libraries에 mybatis-3.5.9.jar 추가
- Project 오른쪽 버튼 클릭->Build Path->Configure Build Path
- Libraries -> Add JARs.. -> WEB-INF/lib/mybatis-3.5.9.jar 선택
- mybatis 라이브러리 추가 확인
2. XML에서 SqlSessionFactory 빌드하기
1. mybatis 설정 파일 생성 및 작성 ( mybatis-config-test.xml )
<?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">
<configuration>
<typeAliases>
<typeAlias alias="MemberLoginVO" type="com.yh.libraryapp.member.model.vo.MemberLoginVO"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521/ORCLPDB"/>
<property name="username" value="LIBRARY"/>
<property name="password" value="LIBRARY"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/yh/libraryapp/config/MemberMapper.xml"/>
</mappers>
</configuration>
2. SqlSessionFactory 객체 생성 (myBatisTest.java)
class myBatisTest {
private static SqlSessionFactory sqlSessionFactory;
@BeforeAll
public static void setup() throws IOException {
String resource = "com/yh/libraryapp/config/mybatis-config-test.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
}
위 코드에서 setup() 메서드가 SqlSessionFactory 객체를 생성하는 메서드입니다. 위 myBatisTest 클래스는 JUNIT5를 기준으로 테스트를 수행하였습니다.
3. SqlSessionFactory에서 SqlSession 생성하기
SqlSession 객체를 생성하여 SQL 쿼리 구문 실행 (myBatisTest.java)
@Test
public void gettingStarted(){
String mem_email = "user1@gmail.com";
try(SqlSession session = sqlSessionFactory.openSession()){
MemberLoginVO member = session.selectOne("MemberMapper.login",mem_email);
System.out.println(member);
}
}
- SqlSession session = sqlSessionFactory.openSession() : sqlSessionFactory 객체를 통하여 SqlSession 객체 생성
- session.selectOne("MemberMapper.login",mem_email) : session 객체의 selectOne 메서드를 통하여 MemberMapper 파일의 login이라는 이름의 SQL구문을 실행하라는 의미
실행결과
MemberLoginVO [mem_email=user1@gmail.com, pwd=tmvlzj]
4. 매핑된 SQL 구문 작성
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="MemberMapper">
<select id="login" parameterType="String" resultType="MemberLoginVO">
select * from member where mem_email = #{mem_email}
</select>
</mapper>
5. Mapper Interface 방식
Mapper xml 파일에 쿼리구문을 작성하는 방식대신 인터페이스를 생성하여 매핑할 수 있습니다.
MemberMapper interface 생성
public interface MemberMapper {
@Select("SELECT * FROM member WHERE mem_email = #{mem_email}")
MemberLoginVO login(String mem_email);
}
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="com.yh.libraryapp.config.MemberMapper">
</mapper>
namespace에 MemberMapper interface가 저장되어 있는 경로를 설정합니다.
myBatisTest.java
@Test
public void gettingStartedWithoutXML(){
String mem_email = "user1@gmail.com";
try(SqlSession session = sqlSessionFactory.openSession()){
MemberMapper mapper = session.getMapper(MemberMapper.class);
MemberLoginVO member = mapper.login(mem_email);
System.out.println(member);
}
}
실행결과
MemberLoginVO [mem_email=user1@gmail.com, pwd=tmvlzj]
6. 스코프(Scope)와 생명주기(Lifecycle)
1. SqlSessionFactoryBuilder
- SqlSessionFactory 객체를 생성한후 유지할 필요가 없습니다. 가장 좋은 스코프는 메서드의 지역변수입니다.
2. SqlSessionFactory
- 한번 생성한 뒤 SqlSessionFactory는 애플리케이션을 실행하는 동안 존재해야 합니다. 그래서 삭제하거나 재생성할 필요가 없습니다.
- SqlSessionFactory의 가장 좋은 스코프는 애플리케이션 스코프입니다. 싱글턴 패턴이나 static 싱글턴 패턴을 사용하는 것이 좋습니다.
3. SqlSession
- 각각의 쓰레드는 자체적으로 SqlSession 인스턴스를 가져야 합니다.
- sqlSession 인스턴스는 공유되지 않고 쓰레드에 안전하지도 않습니다.
- 가장 좋은 스코프는 메서드의 지역변수입니다.
4. Mapper 인스턴스
- Mapper는 매핑된 구문을 바인딩하기 위해 만들어야할 인터페이스입니다.
- mapper 인터페이스의 인스턴스는 SqlSession에서 생성합니다.
- mapper 인스턴스의 가장 좋은 스코프는 SqlSession과 동일합니다. (메서드의 지역 변수)
- 명시적으로 닫을 필요는 없습니다.
References
Source Code : https://github.com/yonghwankim-dev/mybatis_study
MyBatis : https://mybatis.org/mybatis-3/ko/getting-started.html
'JAVA > MyBatis' 카테고리의 다른 글
[Servlet][MyBatis] Mapper 설정 #2 typeHandlers, Handling Enums, objectFactory, plugins, mappers (0) | 2022.02.23 |
---|---|
[Servlet][MyBatis] Mapper 설정 #1 properties, settings, typeAliases (0) | 2022.02.23 |