Mybatis에서 enum 활용하기

공부는 혼자하는 거·2021년 11월 3일
0

DB

목록 보기
6/7
post-thumbnail

주차장 관리 솔루션 RESTAPI 를 만들면서, Mybatis를 통해서도 ENUM 을 활용할 방안이 없을까 궁리했다. JPA를 쓸 경우, 어노테이션 처리만으로 간단하게 활용할 수 있었던 것처럼..

하나만 선언한 ENUM 경우

맴버권한을 나타내는 Enum을 만들었다.


public enum Role {
    USER, ADMIN
}

BaseTypeHandler 작성

public class MemberAuthorityTypeHandler extends BaseTypeHandler<Role> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Role parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, parameter.name());
    }

    @Override
    public Role getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return Role.valueOf(rs.getString(columnName));
    }

    @Override
    public Role getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return Role.valueOf(rs.getString(columnIndex));
    }

    @Override
    public Role getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return Role.valueOf(cs.getString(columnIndex));
    }
}

SqlSessionFactory에 등록


    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource, ApplicationContext applicationContext) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setConfigLocation(applicationContext.getResource("classpath:mybatis/mybatis-config.xml"));
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("mybatis/mapper/*.xml"));
        sqlSessionFactoryBean.setTypeHandlers(new MemberAuthorityTypeHandler()); //등록

        return sqlSessionFactoryBean.getObject();
    }

등록 Method

        String rawPassword = member.getMember_password();
        String encPassword = bCryptPasswordEncoder.encode(rawPassword);


            member.commonJoin(encPassword, Role.USER);
 
        //회원사 정보 입력
        Integer result = adminMapper.memberAdd(member);

mybatis xml 설정

    <insert id="memberAdd" parameterType="hashmap">
        insert into member
        (
            member_userId,
            member_password,
            member_name,
            member_manager,
            member_phone,
            member_role,
            parking_id,
            member_car_number,
            member_createdate

        ) values (
                     #{member_userId},
                     #{member_password},
                     #{member_name},
                     #{member_manager},
                     #{member_phone},
                     #{member_role},
                     #{parking_id},
                     #{member_car_number},
                     now()
                 )
    </insert>

인자를 여러개 가진 Enum의 경우

public interface CodeEnum {

    @JsonValue
    String getCode();
}
public enum Status implements CodeEnum {

    ACCEPT("승인"), REJECT("반려"), WAIT("신청중");

    private String code;

    Status(String code) {
        this.code = code;
    }



    @MappedTypes(Status.class)
    public static class TypeHandler extends CodeEnumTypeHandler<Status> {
        public TypeHandler() {
            super(Status.class);
        }
    }


    @Override
    @JsonValue
    public String getCode() {
        return code;
    }
}

        sqlSessionFactoryBean.setTypeHandlers(
                new MemberAuthorityTypeHandler(),
                new Status.TypeHandler()
        );
    <update id="updateVisitStatus" >
        update visiting_schedule as v
            INNER JOIN parking as p
        ON v.parking_id = p.id
        set
            visit_status = #{visit_status}
        where v.id = #{id} and p.id=#{parking_id}
    </update>

참고

https://www.holaxprogramming.com/2015/11/12/spring-boot-mybatis-typehandler/
https://minkwon4.tistory.com/169
https://camelsource.tistory.com/62

profile
시간대비효율

0개의 댓글