1. BaseMapper 인터페이스
1.1. 인터페이스 개요
- 작성한 Mapper 인터페이스는 BaseMapper 인터페이스를 상속받으며, BaseMapper는 단일 테이블에 대한 다양한 CRUD(생성, 조회, 수정, 삭제) 메서드를 제공합니다.
- 아래에서는 Mapper 인터페이스의 간단한 메서드들을 주로 소개하며, Mapper 인터페이스는 단일 테이블의 모든 CRUD 작업을 포함합니다.
1.2. 인터페이스 소스 코드
- MyBatis-Plus에서는
기본 CRUD가 내장된 BaseMapper에서 이미 구현되어있어바로 사용 가능합니다. 인터페이스는 다음과 같습니다:
package com.baomidou.mybatisplus.core.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.annotations.Param;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* Mapper가 이 인터페이스를 상속하면 mapper.xml 파일을 작성하지 않고도 CRUD 기능을 획득할 수 있습니다.
* <p>이 Mapper는 id 제네릭을 지원합니다.</p>
*
* @author hubin
* @since 2016-01-23
*/
public interface BaseMapper<T> extends Mapper<T> {
int insert(T entity);
int deleteById(Serializable id);
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
int delete(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
int updateById(@Param(Constants.ENTITY) T entity);
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
T selectById(Serializable id);
List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
<E extends IPage<T>> E selectPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
<E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
}
2. BaseMapper 인터페이스 기능 테스트
테스트 1: 데이터 추가
a. 단일 데이터 추가
@Test
void insert(){
User user = new User();
user.setId(6L);
user.setName("Mike");
user.setAge(33);
user.setEmail("test6@powernode.com");
userMapper.insert(user);
}
테스트 2: 데이터 삭제
a. ID로 단일 데이터 삭제
@Test
void deleteSingle(){
userMapper.deleteById(6L);
}
b. Map 조건으로 데이터 삭제
@Test
void testDeleteByMap(){
Map<String,Object> condition = new HashMap<>();
condition.put("name","Mike");
condition.put("age",33);
int rowsAffected = userMapper.deleteByMap(condition);
System.out.println("Map 조건 삭제 결과: " + rowsAffected);
}
c. ID 리스트로 일괄 삭제
@Test
void testBatchDelete(){
List<Long> ids = Arrays.asList(1L, 2L, 3L);
int deletedCount = userMapper.deleteBatchIds(ids);
System.out.println("일괄 삭제 결과: " + deletedCount);
}
테스트 3: 데이터 수정
a. ID로 단일 데이터 수정
@Test
void updateSingle(){
User user = new User();
user.setId(6L);
user.setName("Mike");
user.setAge(35);
user.setEmail("mike35@powernode.com");
userMapper.updateById(user);
}
테스트 4: 데이터 조회
a. 전체 데이터 조회
@Test
void selectAll(){
List<User> userList = userMapper.selectList(null);
System.out.println(userList);
}
b. ID로 단일 데이터 조회
@Test
void selectSingle(){
User user = userMapper.selectById(6L);
System.out.println(user.toString());
}
c. ID 리스트로 여러 데이터 조회
@Test
void selectBatch(){
List<Long> ids = Arrays.asList(1L, 2L);
List<User> users = userMapper.selectBatchIds(ids);
users.forEach(System.out::println);
}
d. Map 조건으로 데이터 조회
@Test
void selectByCondition(){
Map<String,Object> conditions = new HashMap<>();
conditions.put("name","Mike");
conditions.put("age",33);
List<User> results = userMapper.selectByMap(conditions);
results.forEach(System.out::println);
}
요약
- 공통 인터페이스를 통해 CRUD 작업을 테스트했습니다.
- 단일 테이블에 대한 CRUD 작업 시, Mapper 인터페이스의 프록시 객체가 자동으로 적절한 SQL을 생성하여 실행합니다.
- 복잡한 CRUD 요구사항이 있을 경우, Mapper 인터페이스에 사용자 정의 메서드를 추가하여 기능을 확장할 수 있습니다.
3. 사용자 정의 Mapper 인터페이스 메서드
3.1. 구현 단계
1단계: UserMapper에 추상 메서드 정의
@Mapper
public interface UserMapper extends BaseMapper<User> {
User findByName(String name);
}
2단계: 매핑 설정 파일에 해당 SQL 제공
<?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.powernode.mapper.UserMapper">
<select id="findByName" resultType="com.powernode.domain.User">
select * from user where name = #{value}
</select>
</mapper>
3.2. 인터페이스 테스트
- 사용자 정의 Mapper 인터페이스 메서드 테스트
@Test
void customMethodTest(){
User user = userMapper.findByName("Mike");
System.out.println(user);
}
정리
- 이 장을 통해 MyBatis-Plus에는 바로 사용할 수 있는 많은 인터페이스가 있다는 것을 배웠습니다. 또한 인터페이스 메서드를 직접 정의할 수 있으며, 그 문법은 기존 MyBatis와 동일합니다. 따라서 MyBatis-Plus는 비침투적으로, 도입해도 기존 문법에 영향을 주지 않습니다.