투케이2K

15. (spring/스프링) mybatis 사용해 select 절 where like in 조건 조회 실시 - foreach 사용 본문

Spring

15. (spring/스프링) mybatis 사용해 select 절 where like in 조건 조회 실시 - foreach 사용

투케이2K 2021. 7. 23. 19:37

[ 개발 환경 설정 ]

개발 툴 : inteli j

개발 언어 : spring


[ 폴더 및 파일 추가 ]


[소스코드 : application.yml]

spring:
  devtools:
    livereload:
      enabled: true
  datasource:
    driver-class-name: oracle.jdbc.OracleDriver
    url: jdbc:oracle:thin:@115.68.176.215:1521:username
    username: userschema
    password: pw1234



server:
  port: 7000



mybatis:
  mapper-locations: classpath:mappers/*.xml
  type-aliases-package: com.project.solutionpackage.model

[소스코드 : mappers >> DBMapper.xml]

<?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 >> interface 매핑 : id 값 중요 (interface 메소드) -->
<mapper namespace="com.project.solutionpackage.mapper.DBMapper">


    <!-- select 조회 : like , in -->
    <select id="selectMultiWhere" parameterType="hashmap" resultType="map">
        select *
            from test_user
        where t_name like '%' || #{name} || '%'
            <![CDATA[
            and t_idx <= 30
            ]]>
            and t_dept in
            <foreach collection="deptList" item="dept" separator="," open="(" close=")">
                #{dept}
            </foreach>
    </select>


</mapper>

[소스코드 : mapper >> DBMapper]

package com.project.solutionpackage.mapper;

import com.project.solutionpackage.model.Insert_DB_Image_Model;
import com.project.solutionpackage.model.Insert_DB_UserInfo_Model;
import com.project.solutionpackage.model.Insert_Table_Model;
import org.apache.ibatis.annotations.Mapper;

import java.sql.Blob;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Mapper
public interface DBMapper {

    /**
     * [클래스 설명]
     * 1. DBMapper.xml 쿼리 조회 결과 >> DB 데이터를 담을 그릇
     * 2. service 에서 참조해서 사용한다
     * */


    // [DBMapper.xml 쿼리에서 선언한 변수 개수 및 타입에 맞게 파라미터 선언]
    List<Map<String, Object>> selectMultiWhere(Map map); // 리턴값으로 List 사용 [출력]

}

[소스코드 : service >> DBService]

package com.project.solutionpackage.service;

import com.project.solutionpackage.mapper.DBMapper;
import com.project.solutionpackage.model.Insert_DB_Image_Model;
import com.project.solutionpackage.model.Insert_DB_UserInfo_Model;
import com.project.solutionpackage.model.Insert_Table_Model;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.sql.Blob;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class DBService {

    /**
     * [클래스 설명]
     * 1. DBMapper 인터페이스 호출 및 controller 에 반환 할 리턴 값 정의
     * 2. controller 에서 사용한다
     * */

    // [DBMapper 인터페이스 설정 : db 데이터 참조 [DBMapper.xml]]
    @Autowired
    private DBMapper dbMapper;


    // [DBMapper 인터페이스 지정 >> DBApiController 리턴 값 지정]
    public List<Map<String, Object>> selectMultiWhere(Map map) {
        List<Map<String, Object>> result = dbMapper.selectMultiWhere(map);
        return result; //컨트롤러에 리턴 실시
    }

}

[소스코드 : controller >> DBApiController]

package com.project.solutionpackage.controller;

import com.project.solutionpackage.model.*;
import com.project.solutionpackage.service.DBService;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Base64Util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.configurationprocessor.json.JSONException;
import org.springframework.boot.configurationprocessor.json.JSONObject;
import org.springframework.util.Base64Utils;
import org.springframework.web.bind.annotation.*;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.sql.Blob;
import java.util.*;

// [rest 방식 컨트롤러 / Controller = view 연결]
@RestController
public class DBApiController {

    /**
     * [클래스 설명]
     * 1. api 호출 경로 및 리턴 데이터 반환 실시
     * 2. 실제로 api 호출 (req) 및 반환 (res) 이루어지는 클래스
     * */


    // [service 설정 : 로직 연결 위함]
    // [로직 : 사용자 API 호출 >> 컨트롤러에서 서비스 호출 >> 서비스에서 DB Mapper 호출]
    @Autowired
    private DBService dbService;


    // [post : Map 방식]
    // [경로 지정 : http://localhost:7000/selectMultiWhere?name=김&deptList=[고구려, 백제, 신라]]
    // [input : 서비스에서 설정한 파라미터 개수와 같아야합니다]
    // [output : 조회된 데이터를 json 형식 string값으로 반환합니다]
    @PostMapping("/selectMultiWhere")
    public String selectMultiWhere(@RequestParam Map<String, String> param) {
        System.out.println("\n");
        System.out.println("=======================================");
        System.out.println("[DBApiController] : [selectMultiWhere] : [start]");
        System.out.println("[request keySet] : " + String.valueOf(param.keySet()));
        System.out.println("[request name] : " + String.valueOf(param.get("name")));
        System.out.println("[request deptList] : " + String.valueOf(param.get("deptList")));
        System.out.println("=======================================");
        System.out.println("\n");

        // 리턴 값 데이터 정의
        String result = null;
        try {
            // 리스트 생성 및 파라미터로 받은 데이터 삽입 실시
            String data = param.get("deptList");
            data = data.replaceAll("\\[","");
            data = data.replaceAll("\\]","");
            data = data.replaceAll(" ", "");
            data = data.replaceAll("\\\"", "");
            //List<String> deptList = Arrays.asList(data.split(",")); //리스트 선언 및 배열 데이터 삽입
            List<String> deptList = new ArrayList<>(Arrays.asList(data.split(","))); //리스트 선언 및 배열 데이터 삽입

            // DBMapper.xml (DB조회) 부분에서 parameterType 을 hashmap으로 선언해서 해쉬맵 객체 생성
            Map <String, Object> map = new HashMap<>();
            map.put("name", param.get("name")); // DBMapper.xml (DB조회) 부분에서 받는 파라미터 타입명과 일치 필요
            map.put("deptList", deptList); // DBMapper.xml (DB조회) 부분에서 받는 파라미터 타입명과 일치 필요 (foreach collection)

            // 배열에 데이터가 포함된 경우만 db 조회 요청 실시
            if(deptList != null && deptList.size() >0){
                result = String.valueOf(dbService.selectMultiWhere(map));
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }

        // db 조회 결과 값 확인 실시
        result = result.replaceAll("[=]", ":"); //json 형식으로 변환
        System.out.println("\n");
        System.out.println("=======================================");
        System.out.println("[DBApiController] : [selectMultiWhere] : [response]");
        System.out.println("[data] : " + String.valueOf(result));
        System.out.println("=======================================");
        System.out.println("\n");
        return result;
    }

}

[결과 출력]


 

반응형
Comments