MyBatisPlus 기초 - 공통 Mapper 인터페이스

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는 비침투적으로, 도입해도 기존 문법에 영향을 주지 않습니다.

태그: MyBatisPlus BaseMapper CRUD Mapper 인터페이스 java

7월 6일 00:59에 게시됨