| 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 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 | 
- java
- JDBC TEMPLATE
- Ubunt
- spring aop
- unix
- POJO
- spring
- Framework
- Dependency Injection
- STS
- 마이바티스
- XML
- spring framework
- 리눅스
- @test
- @AspectJ
- Linux
- Di
- SpringJDBC
- JdbcTemplate
- Spring JDBC
- @JUnit
- 컨테이너
- 프로퍼티
- AOP
- @Spring-Test
- Spring Boot
- myBatis
- java spring
- pointcut
- 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 |