투케이2K

3. (spring/스프링) 오라클 DB 접속 및 select , insert , delete , procedure 프로시저 호출 수행 실시 본문

Spring

3. (spring/스프링) 오라클 DB 접속 및 select , insert , delete , procedure 프로시저 호출 수행 실시

투케이2K 2021. 7. 7. 13:35

/* =========================== */

[ 개발 환경 설정 ]

개발 툴 : inteli j

개발 언어 : spring

/* =========================== */

/* =========================== */

[폴더 및 파일 추가]

/* =========================== */

/* =========================== */

[소스 코드 : controller >> DBApiController]

package com.project.solutionpackage.controller;

import com.project.solutionpackage.model.Insert_DB_UserInfo_Model;
import com.project.solutionpackage.model.Return_DB_Json_Model;
import com.project.solutionpackage.service.DBService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

@RestController
public class DBApiController {

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


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


    // [root 경로 지정]
    /*@GetMapping("/")
    public JsonModel root() {
        return new JsonModel(0, "루트페이지 입니다.");
    }*/


    // [get : Map 방식]
    // [경로 지정 : http://localhost:7000/date]
    // [input : 서비스에서 설정한 파라미터 개수와 같아야합니다]
    // [output : 모델에서 설정한 return 타입으로 결과를 반환합니다]
    @GetMapping("/date")
    public Return_DB_Json_Model date() {
        System.out.println("");
        System.out.println("[DBApiController] : [date]");
        System.out.println("");

        System.out.println("");
        System.out.println("[DBApiController] : [date]");
        System.out.println("[response] : " + new Return_DB_Json_Model("T", dbService.date()));
        System.out.println("");
        return new Return_DB_Json_Model("T", dbService.date());
    }


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

        // 리턴 값 데이터 정의
        String idx = param.get("idx");
        String result = String.valueOf(dbService.userInfo(idx));
        result = result.replaceAll("[=]", ":"); //json 형식으로 변환

        System.out.println("");
        System.out.println("[DBApiController] : [userInfo]");
        System.out.println("[response] : " + String.valueOf(result));
        System.out.println("");
        return result;
    }


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

        // 리턴 값 데이터 정의
        String dept = param.get("dept");
        int idx = Integer.parseInt(param.get("idx"));
        String result = String.valueOf(dbService.userInfoList(dept, idx));
        result = result.replaceAll("[=]", ":"); //json 형식으로 변환

        System.out.println("");
        System.out.println("[DBApiController] : [userInfoList]");
        System.out.println("[response] : " + String.valueOf(result));
        System.out.println("");
        return result;
    }


    // [post : Map 방식]
    // [경로 지정 : http://localhost:7000/insertUser?idx=61&name=towk&sex=m&age=28&dept=개발부&phone=01012345678&addr=서울&rank=연구원&marri=x&familly=5&hobby=코딩]
    // [input : 서비스에서 설정한 파라미터 개수와 같아야합니다]
    // [output : 모델에서 설정한 return 타입으로 결과를 반환합니다]
    @PostMapping("/insertUser")
    public Return_DB_Json_Model insertUser(Insert_DB_UserInfo_Model user) {
        System.out.println("");
        System.out.println("[DBApiController] : [insertUser]");
        System.out.println("[request idx] : " + String.valueOf(user.getIdx()));
        System.out.println("[request name] : " + String.valueOf(user.getName()));
        System.out.println("[request sex] : " + String.valueOf(user.getSex()));
        System.out.println("[request age] : " + String.valueOf(user.getAge()));
        System.out.println("[request dept] : " + String.valueOf(user.getDept()));
        System.out.println("[request phone] : " + String.valueOf(user.getPhone()));
        System.out.println("[request addr] : " + String.valueOf(user.getAddr()));
        System.out.println("[request rank] : " + String.valueOf(user.getRank()));
        System.out.println("[request marri] : " + String.valueOf(user.getMarri()));
        System.out.println("[request familly] : " + String.valueOf(user.getFamilly()));
        System.out.println("[request hobby] : " + String.valueOf(user.getHobby()));
        System.out.println("");

        if (dbService.insertUser(user) > 0) {
            System.out.println("");
            System.out.println("[DBApiController] : [insertUser]");
            System.out.println("[response] : " + new Return_DB_Json_Model("T", "Success"));
            System.out.println("");
            return new Return_DB_Json_Model("T", "Success"); //정상 삽입 완료 시 상태값 반환
        } else {
            System.out.println("");
            System.out.println("[DBApiController] : [insertUser]");
            System.out.println("[response] : " + new Return_DB_Json_Model("F", "Failed"));
            System.out.println("");
            return new Return_DB_Json_Model("F", "Failed"); //삽입 실패 시 상태값 반환
        }
    }


    // [post : Map 방식]
    // [경로 지정 : http://localhost:7000/updateUser?idx=100&name=towk]
    // [input : 서비스에서 설정한 파라미터 개수와 같아야합니다]
    // [output : 모델에서 설정한 return 타입으로 결과를 반환합니다]
    @PostMapping("/updateUser")
    public Return_DB_Json_Model updateUser(@RequestParam Map<String, String> param) {
        System.out.println("");
        System.out.println("[DBApiController] : [updateUser]");
        System.out.println("[request keySet] : " + String.valueOf(param.keySet()));
        System.out.println("[request idx] : " + String.valueOf(param.get("idx")));
        System.out.println("[request name] : " + String.valueOf(param.get("name")));
        System.out.println("");

        if (dbService.updateUser(Integer.parseInt(param.get("idx")), param.get("name")) > 0) {
            System.out.println("");
            System.out.println("[DBApiController] : [updateUser]");
            System.out.println("[response] : " + new Return_DB_Json_Model("T", "Success"));
            System.out.println("");
            return new Return_DB_Json_Model("T", "Success"); //정상 수정 완료 시 상태값 반환
        } else {
            System.out.println("");
            System.out.println("[DBApiController] : [updateUser]");
            System.out.println("[response] : " + new Return_DB_Json_Model("F", "Failed"));
            System.out.println("");
            return new Return_DB_Json_Model("F", "Failed"); //수정 실패 시 상태값 반환
        }
    }


    // [post : Map 방식]
    // [경로 지정 : http://localhost:7000/deleteUser?name=twok]
    // [input : 서비스에서 설정한 파라미터 개수와 같아야합니다]
    // [output : 모델에서 설정한 return 타입으로 결과를 반환합니다]
    @PostMapping("/deleteUser")
    public Return_DB_Json_Model deleteUser(@RequestParam Map<String, String> param) {
        System.out.println("");
        System.out.println("[DBApiController] : [deleteUser]");
        System.out.println("[request keySet] : " + String.valueOf(param.keySet()));
        System.out.println("[request name] : " + String.valueOf(param.get("name")));
        System.out.println("");

        if (dbService.deleteUser(param.get("name")) > 0) {
            System.out.println("");
            System.out.println("[DBApiController] : [deleteUser]");
            System.out.println("[response] : " + new Return_DB_Json_Model("T", "Success"));
            System.out.println("");
            return new Return_DB_Json_Model("T", "Success"); //정상 수정 완료 시 상태값 반환
        } else {
            System.out.println("");
            System.out.println("[DBApiController] : [deleteUser]");
            System.out.println("[response] : " + new Return_DB_Json_Model("F", "Failed"));
            System.out.println("");
            return new Return_DB_Json_Model("F", "Failed"); //수정 실패 시 상태값 반환
        }
    }


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

        // 리턴 값 데이터 정의
        String dept = param.get("dept");
        Map map = dbService.userProcedure(dept);

        System.out.println("");
        System.out.println("[DBApiController] : [userProcedure]");
        System.out.println("[Map keySet] : " + String.valueOf(map.keySet()));
        System.out.println("[Map msg] : " + String.valueOf(map.get("msg")));
        System.out.println("[Map cur] : " + String.valueOf(map.get("cur")));
        System.out.println("");
        String O_MSG = String.valueOf(map.get("msg"));
        String O_CURSOR = String.valueOf(map.get("cur"));

        String result = String.valueOf(O_CURSOR);
        result = result.replaceAll("[=]", ":"); //json 형식으로 변환
        System.out.println("");
        System.out.println("[DBApiController] : [userProcedure]");
        System.out.println("[response] : " + String.valueOf(result));
        System.out.println("");
        return result;
    }

}

[소스 코드 : mapper >> DBMapper]

package com.project.solutionpackage.mapper;

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

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

@Mapper
public interface DBMapper {

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


    // [DBMapper.xml 쿼리에서 선언한 변수 개수 및 타입에 맞게 파라미터 선언]
    String date(); // 리턴값으로 string 사용 [출력]


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


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


    // [DBMapper.xml 쿼리에서 선언한 변수 개수 및 타입에 맞게 파라미터 선언]
    int insertUser(Insert_DB_UserInfo_Model user); // 리턴값으로 int 사용 [상태값 확인 성공, 실패 여부]


    // [DBMapper.xml 쿼리에서 선언한 변수 개수 및 타입에 맞게 파라미터 선언]
    int updateUser(int idx, String name); // 리턴값으로 int 사용 [상태값 확인 성공, 실패 여부]


    // [DBMapper.xml 쿼리에서 선언한 변수 개수 및 타입에 맞게 파라미터 선언]
    int deleteUser(String name); // 리턴값으로 int 사용 [상태값 확인 성공, 실패 여부]


    // [DBMapper.xml 쿼리에서 선언한 변수 개수 및 타입에 맞게 파라미터 선언]
    void userProcedure(Map map); // void 설정

}

[소스 코드 : model >> Insert_DB_UserInfo_Model]

package com.project.solutionpackage.model;

import lombok.Data;

@Data
public class Insert_DB_UserInfo_Model {

    /**
     * [클래스 설명]
     * 1. insert 포맷 형태 정의 클래스
     * 2. controller 에서 사용한다
     * */

    private String idx;
    private String name;
    private String sex;
    private String age;
    private String dept;
    private String phone;
    private String addr;
    private String rank;
    private String marri;
    private String familly;
    private String hobby;

}

[소스 코드 : model >> Return_DB_Json_Model]

package com.project.solutionpackage.model;

import lombok.Data;

@Data
public class Return_DB_Json_Model {

    /**
     * [클래스 설명]
     * 1. 최종적으로 반환할 데이터 포맷 형태 정의 클래스
     * 2. controller 에서 사용한다
     * */

    // [현재 date 확인]
    private String state;
    private String message;

    public Return_DB_Json_Model(String state, String message) {
        this.state = state;
        this.message = message;
    }

}

[소스 코드 : service >> DBService]

package com.project.solutionpackage.service;

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

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 String date() {
        return dbMapper.date(); //컨트롤러에 리턴 실시
    }


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


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


    // [DBMapper 인터페이스 지정 >> DBApiController 리턴 값 지정]
    public int insertUser(Insert_DB_UserInfo_Model user) {
        return dbMapper.insertUser(user); //컨트롤러에 리턴 실시
    }


    // [DBMapper 인터페이스 지정 >> DBApiController 리턴 값 지정]
    public int updateUser(int idx, String name) {
        return dbMapper.updateUser(idx, name); //컨트롤러에 리턴 실시
    }


    // [DBMapper 인터페이스 지정 >> DBApiController 리턴 값 지정]
    public int deleteUser(String name) {
        return dbMapper.deleteUser(name); //컨트롤러에 리턴 실시
    }


    // [DBMapper 인터페이스 지정 >> DBApiController 리턴 값 지정]
    public Map userProcedure(String dept) {
        Map map = new HashMap<>();
        map.put("dept", dept);
        dbMapper.userProcedure(map);
        return map; //컨트롤러에 리턴 실시
    }

}

[소스 코드 : 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 조건 절 조회 : db 시간 조회 -->
    <select id="date" resultType="string">
        <![CDATA[
        select TO_CHAR(SYSDATE, 'YYYY-MM-DD')
            from dual
        ]]>
    </select>


    <!-- select 조건 절 조회 : 한개 값 : 동등 서브 쿼리 -->
    <select id="userInfo" resultType="map">
        <![CDATA[
        select *
            from test_user
        where t_idx = #{idx}
        ]]>
    </select>


    <!-- select 조건 절 조회 : like and 비교 연산 -->
    <select id="userInfoList" resultType="map">
        <![CDATA[
        select *
            from test_user
        where t_dept like '%' || #{dept} || '%'
            and t_idx >= #{idx}
        order by to_number(t_idx) asc
        ]]>
    </select>


    <!-- update 특정 조건 수정 -->
    <update id="updateUser">
        <![CDATA[
        update test_user
        set
            t_idx = #{idx}
        where t_name = #{name}
        ]]>
    </update>


    <!-- insert 데이터 삽입 실시 -->
    <insert id="insertUser">
        <![CDATA[
        insert into TEST_USER (T_IDX, T_NAME, T_SEX, T_AGE, T_DEPT, T_PHONE, T_ADDR, T_RANK, T_MARRI, T_FAMILLY, T_HOBBY)
        values (#{idx}, #{name}, #{sex}, #{age}, #{dept}, #{phone}, #{addr}, #{rank}, #{marri}, #{familly}, #{hobby})
        ]]>
    </insert>


    <!-- delete 특정 데이터 삭제 실시 -->
    <delete id="deleteUser">
        <![CDATA[
        delete
            from TEST_USER
        where t_name = #{name}
        ]]>
    </delete>


    <!-- 프로시저 호출 : input / output [msg : cursor] -->
    <resultMap id="boardMap" type="hashmap" />
    <select id="userProcedure" parameterType="hashmap" statementType="CALLABLE">
        <![CDATA[
        { call TEST_USER_PROCEDURE (
            #{dept},
            #{msg, mode=OUT, jdbcType=VARCHAR, javaType=string},
            #{cur, mode=OUT, jdbcType=CURSOR, javaType=ResultSet, resultMap=boardMap}
        )}
        ]]>
    </select>


</mapper>

[application.yml]

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


server:
  port: 7000


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

/* =========================== */

/* =========================== */

[결과 출력]

/* =========================== */

/* =========================== */

[오라클 프로시저 참고]

https://kkh0977.tistory.com/945?category=990101 

 

133. (Oracle/오라클) 프로시저 (procedure) 특정 부서 인원 출력 - input, output, cursor

/* =========================== */ [ 개발 환경 설정 ] ​ 개발 툴 : Toad 개발 언어 : Oracle /* =========================== */ ​ /* =========================== */ [소스 코드] CREATE OR REPLACE PROCED..

kkh0977.tistory.com

/* =========================== */

 

반응형
Comments