-
1탄
https://ehhooni.tistory.com/32
mybatis로 jpa 흉내내기
mybatis의 경우 jdbc를 통해 코드와 db를 혼합하여 작성하는 방식에서 둘을 분리하게 구현함으로써 유지 보수 및 개발을 함에 있어 간편하고 쉽게 만들었다 그 이후 JPA가 도입됨에 따라 DB table에
ehhooni.tistory.com
1탄 select 버젼에 이어 insert도 가능합니다.
mybatis는 insert의 경우 new SQL().INSERT_INFO를 이용하여 동적으로 생성이 가능하다
NEW SQL().INSERT_INFO(테이블명) .INTO_COLUMNS(컬럼명들..) .INTO_VALUES(컬럼값들 ..)
앞서 예시에서 나온 클래스인 OrderInfo를 토대로 한번 작성을 해보자
class MyBatisProvider implements ProviderMethodResolver { public static String findById(String id) { -- 위 링크 참조 } public String insertById(ProviderContext context , T t){ Map<String , Object> map = new ObjectMapper().getMapper().convertValue(T,Map.class); Map<String ,String> insertMap = new HashMap<>(); map.forEach((key,value) ->{ /*cf) class 내 annotation을 통해 컬럼명을 지정해놓았다면 이와 같은 방식으로 쓸 수 있다. Field field = FieldUtils.getField(OrderInfo.class, key, true); if(Objects.nonNull(value) && field.isAnnotationPresent(RdbColumn.class)){ insertMap.put(field.getAnnotation(RdbColumn.class).name(),value); } */ if(Objects.nonNull(value)){ insertMap.put(key,"#{".concat(key)+"}"); } }) String sql = new SQL().INSERT_INFO(this.tableName(context)) .INTO_COLUMNS(insertMap.keySet().stream().toArray(String[]::new)) .INTO_VALUES(insertMap.values().stream().toArray(String[]::new)); return sql; } }
이제 이를 사용하고자 하는 Mapper에 연결만 하면 insert는 동적으로 생성이 가능하다
@Dao public interface OrderInfoMapper extends MybatisMapper<OrderInfo, RequestModel> { } public interface MybatisMapper<T, ID extends Serializable> { @SelectProvider(type = MyBatisSqlProvider.class) List<T> findById(ID id); //method이름이 동일하다면 별도 이름을 작성할 필요가 없다 @InsertProvider(type = MyBatisSqlProvider.class , method = "insertById") void insertById(T model); }
이제 사용하고자하는 곳에서 주입받아서 method를 불러만 온다면 요청하는 테이블에 데이터들이 삽입이 될 것이다.
@Autowired OrderInfoMapper orderInfoMapper; void test(){ OrderInfo orderInfo = new OrderInfo(); orderInfoMapper.insertById(orderInfo);/ }
'개발 > java' 카테고리의 다른 글
DB 인터페이스 분리 (1) 2024.10.28 enum 활용기 (2) 2024.09.11 CompletableFuture (6) 2024.09.05 java stream Util 만들기 (2) 2024.09.04 mybatis로 jpa 흉내내기 (3) 2024.09.03