일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- spring
- Di
- unix
- 컨테이너
- @Spring-Test
- @JUnit
- Ubunt
- @AspectJ
- java
- Spring Boot
- AOP
- Spring JDBC
- myBatis
- STS
- Framework
- JdbcTemplate
- XML
- Dependency Injection
- spring framework
- Linux
- spring aop
- @test
- SpringJDBC
- java spring
- POJO
- 프로퍼티
- 리눅스
- pointcut
- JDBC TEMPLATE
- 마이바티스
- Today
- Total
개키우는개발자 : )
MyBatis(마이바티스) 애플리케이션 작성(2) 본문
Spring Framework MyBatis(마이바티스)
애플리케이션 작성(2)
학습 목표
- Mapper 인터페이스 개념
- Mapper 인터페이스 작성 및 설정
- 여러 개의 Mapper 인터페이스 설정
1.Mapper 인터페이스 개념
1-1 MyBatis3.0의 Mapper 인터페이스
Mapper 인터페이스는 Mapping 파일에 기재된 SQL을 호출하기 위한 인터페이스
- Mapper 인터페이스는 SQL을 호출하는 프로그램을 Type Safe 하게 기술하기 위해 MyBatis3.x 부터 등장
- Mapping 파일에 있는 SQL을 자바 인터페이스를 통해 호출할 수 있도록 해줌.
1-2 Mapper 인터페이스를 사용하지 않았을 때
- Mapper 인터페이스를 사용하지 않으면, SQL을 호출하는 프로그램은 SqlSession의 메서드의 아규먼트에 문자열로
네임스페이스 + "." + SQL ID 로 지정해야 함.
- 문자열로 지정하기 때문에 오타에 의해 버그가 숨어있거나, IDE에서 제공하는 code assist 를 사용할 수 없음.
1-3 Mapper 인터페이스를 사용하였을 때
- UserMapper 인터페이스는 개발자가 작성
- 패키지 이름+ "." +인터페이스 이름+"."+메서드 이름 이 네임스페이스+"."+SQL ID가 되도록 네임스페이스와 SQL의 ID를 설정해야 함.
- 네임스페이스 속성에는 패키지를 포함한 Mapper 인터페이스 이름
- SQL ID에는 매핑하는 메서드 이름을 지정하는 것
2.Mapper 인터페이스 작성 및 설정
2-1 Mapping 파일 수정
namespace 를 myspring.user.dao.UserMapper 로 변경한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?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="myspring.user.dao.UserMapper"> <select id="selectUserById" parameterType="String" resultType="User"> select * from users where userid=#{userid} </select> <select id="selectUserList" resultType="User"> select * from users order by userid </select> <insert id="insertUser" parameterType="User" > insert into users values (#{userid},#{name},#{gender},#{city}) </insert> <update id="updateUser" parameterType="User"> update users set name=#{name},gender=#{gender},city=#{city} where userid=#{userid} </update> <delete id="deleteUser" parameterType="String" > delete from users where userid =#{userid} </delete> </mapper> | cs |
2-2 DAO 클래스 수정
SqlSession 을 주석처리 한후 UserMapper 타입선언 후 자동주입
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | package myspring.user.dao; import java.util.List; import org.apache.ibatis.session.SqlSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import myspring.user.vo.UserVO; @Repository("userDao") public class UserDaoImplMapper implements UserDao{ @Autowired private UserMapper userMapper; /*@Autowired private SqlSession session;*/ public int insert(UserVO user) { int result = 0; result = userMapper.insertUser(user); System.out.println("등록된 Mapper UserId = " + user.getUserid() + " Mapper Name = " + user.getName()); return result; } public List<UserVO> readAll() { List<UserVO> userList = userMapper.selectUserList(); // SqlSession 방법 //List<UserVO> userList = session.selectList("userNs.selectUserList"); return userList; } public int delete(String id) { int result = 0; result = userMapper.deleteUser(id); return result; } public int update(UserVO user) { int result = 0; result = userMapper.updateUser(user); return result; } public UserVO read(String id) { UserVO user = userMapper.selectUserById(id); return user; } } | cs |
2-3 mybatisBeans.xml 에 mapperFactoryBean의 설정
1 2 3 4 | <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="myspring.user.dao.UserMapper" /> <property name="sqlSessionTemplate" ref="sqlSession" /> </bean> | cs |
3.여러 개의 Mapper 인터페이스 설정
3-1 MapperScannerConfigurer의 사용
- MapperFactoryBean을 이용해 Mapper 인터페이스를 등록할 때 Mapper 인터페이스의 개수가 많아지게 되면 일일이 정의하는데 시간이 많이 걸림.
- Mapper 인터페이스의 수가 많아지면 MapperScannerConfigurer를 이용하여 Mapper 인터페이스의 객체를 한 번에 등록하는 것이 편리함.
- MapperScannerConfigurer를 이용하면 지정한 패키지 아래 모든 인터페이스가 Mapper 인터페이스로 간주되어 Mapper 인터페이스의 객체가 DI 컨테이너에 등록되는 것.
3-2 MapperScannerConfigurer의 설정
1 2 3 4 5 | <!-- 여러 개의 Mapper 인터페이스 설정 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="myspring.user.dao" /> </bean> | cs |
- basePackage 속성에서 지정하는 것은 Mapper 인터페이스를 검색할 대상이 되는 Package
- myspring.user.dao 아래의 인터페이스들은 모두 Mapper 인터페이스에 대응하여 Mapper 객체가 생성된다는 점
- 예상하지 않은 다른객체가 등록되어 오류가 발생할 수 있음.
3-3 MapperScannerConfigurer의 설정 테스트
위의 설정을 테스트하면 myspirng.user.dao 패키지 하위의 모든 인터페이스를 찾기때문에 충돌이 일어난다.
오류를 해결하기 위해 다음과 같이 설정한다.
3-4 Marker 인터페이스와 Marker 어노테이션의 사용
- 검색의 대상이 되는 Package 아래의 인터페이스들 중에서 Mapper로서 작성한 인터페이스로만 범위를 좁히려면 Marker 인터페이스와 Marker 어노테이션을 작성하여 MapperScannerConfigurer에 설정하면 됨
myspring.user.dao 패키지 하위 -> New -> annotaion -> MyMapper 생성
1 2 3 | package myspring.user.dao; public @interface MyMapper {} | cs |
UserMapper 인터페이스에 @MyMapper 어노테이션 선언
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | package myspring.user.dao; import java.util.List; import javax.sql.DataSource; import myspring.user.vo.UserVO; @MyMapper public interface UserMapper { UserVO selectUserById(String id); List<UserVO> selectUserList(); int insertUser(UserVO userVO); int updateUser(UserVO userVO); int deleteUser(String id); } | cs |
3-5 MapperScannerConfigurer에 Marker 어노테이션 지정
1 2 3 4 5 | <!-- 여러 개의 Mapper 인터페이스 설정 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="myspring.user.dao" /> <property name="annotationClass" value="myspring.user.dao.MyMapper" /> </bean> | cs |
3-6 MapperScannerConfigurer에 Marker의 설정테스트
1 2 3 4 5 6 | @Test public void getUserTest() { UserVO user = service.getUser("user1"); System.out.println(user); assertEquals("name1",user.getName()); } | cs |
테스트 완료
1 | {"userid":"user1","name":"name1","gender":"여","city":"city1"} | cs |
완성된 프로젝트 코드를 다운받으실수 있습니다.
'JAVA > Spring Framework' 카테고리의 다른 글
스프링 부트 강좌 소개 (0) | 2019.05.16 |
---|---|
애플리케이션 프로젝트 완료 (0) | 2019.02.09 |
MyBatis(마이바티스) 애플리케이션 작성(1) (0) | 2019.02.09 |
MyBatis(마이바티스) 개요 (2) | 2019.02.08 |
AOP애플리케이션 작성(2) (0) | 2019.02.08 |