JAVA๋ฅผ ์ก์๋ผ!...
Spring Framework_DAO_MyBatis ๋ณธ๋ฌธ
๐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๋์ ์ํ ๊ธฐ์ 3๊ฐ์ง
์ค๊ฐ ํ๋ก์ ํธ_Servlet + JSP (DBMS : Oracle)
- [ver1] JDBCUtil ํด๋์ค๋ฅผ ๊ฐ๋ฐ์๊ฐ ์ง์ ์์ฑํด JDBC ์ฐ๊ฒฐ ๋ฐ ๊ด๋ จ ์์ ์ ์บก์ํํด ์์ง๋๋ฅผ ๋์
์ต์ข ํ๋ก์ ํธ_+ Spring Framework + MyBatis Framework (DBMS : MySQL)
- [ver2] JdbcTemplate ํจํด ์ฌ์ฉ. ๋ณต์กํ๊ฑฐ๋ ๋ฐ๋ณต๋๋ ์์ (JDBC์ฐ๊ฒฐ๋ก์ง)์ ํ ํ๋ฆฟํํด ๊ฐ์ฒด๋ก ๋ง๋ค์ด ์ฌ์ฌ์ฉ
- [ver3] MyBatis๋ JDBC ์ฝ๋๋ฅผ ๋์ ํด SQL๊ณผ JAVA ๊ฐ์ฒด๊ฐ์ ๋งคํ์ ์ฝ๊ฒ ํด์ฃผ๋ ํ๋ ์์ํฌ
RowMapper์ ๊ฐ์ ์ญํ ์ ์ํํด SQL ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ์๋ฐ ๊ฐ์ฒด๋ก ๋งคํํด์ค
RowMapper ์ธํฐํ์ด์ค_mapRow(ResultSet rs, int rowNum) ๋ฉ์๋
ResultSet(SQL ์ฟผ๋ฆฌ์ ์ํ ๊ฒฐ๊ณผ)์์ ๊ฐ ์ปฌ๋ผ์ ๊ฐ์ ๊ฐ์ ธ์์ ์๋ฐ ๊ฐ์ฒด(DTO, ์ํฐํฐ, ์ปค๋งจ๋ ๊ฐ์ฒด, POJO)์ ๊ฐ ํ๋์ ์ค์
[ver2] ↓
Spring Framework_DAO_JdbcTemplate
[ JdbcTemplate์ ํ์ฉํ DAO version upgrade ] ๊ธฐ์กด DAO์ ํ ํ๋ฆฟ ํจํด์ ํ์ฉํ ํด๋์ค๋ฅผ ๊ตฌํํด์ ์ฝ๋ ๊ฐ๋ ์ฑ ์ฆ๊ฐ JdbcTemplate : ํ ํ๋ฆฟ ํจํด์ ํ์ฉํ ํด๋์ค ๋ฐ๋ณต๋๋ JDBC์ ๋ก์ง(DB์ฐ๊ฒฐ → SQL ์์ฑ →
onivv.tistory.com
ํ์ฌ SQL๋ฌธ์ด JAVA ์ฝ๋์ ์์ฑ๋์ด์์
๋ฌธ์
- SQL๋ฌธ์ ๋ณ๊ฒฝ์ด ๋ฐ์(A์ ๋ํ ๋ณํ์ธ๋ฐ)๋์์๋, ํ์ผ์ ์ฌ์ปดํ์ผํด์ผ๋งํจ(B๋ ์ํฅ์๋ฐ์)
→ ๊ฒฐํฉ๋๊ฐ ๋๋ค. ์์ง๋๊ฐ ๋ฎ๋ค.
ํด๊ฒฐ
- ์์ง๋๋ฅผ ๋์ฌ์ผํจ == ํ์ผ์ ๋ถ๋ฆฌํ๊ธฐ
→ SQL๋ฌธ์ .javaํ์ผ ์ธ๋ถ์ ์์ฑํ๊ธฐ - ํ์ํ ์๊ฐ์ ํด๋น ์ฟผ๋ฆฌ๋ฅผ ๋ฐ๋ ค์์ผํ๋ ํ๋ ์์ํฌ์ ์ค์ ํ์ผ .xml์ ์์ฑํ์!
MyBatis ํ๋ ์์ํฌ์ ์ค์ ํ์ผ == SQL์ ์ ์ฅํ๋ ํ์ผ == mapper.xml
[ MyBatis ํ๋ ์์ํฌ - ์ฅ์ ]
- ์์ง๋๋ฅผ ๋์ผ ์ ์์ : SQL์ .xml์, JAVA๋ .java์ ์์ฑํ ์ ์์
- ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ ์ ์์ : SQL์ ๋ณ๊ฒฝํด๋, JAVA ์ฌ์ปดํ์ผ์ด ํ์ ์์
- id๊ฐ๋ ์ด ์๊ฒจ์ searchCondition์ด ํ์์์
โ๏ธ MyBatis ์์กด์ฑ ์ถ๊ฐ
โ๏ธ MyBatis๊ฐ XML ๋งคํผ ํ์ผ์ ์ฝ์ด์ผํ๋ฏ๋ก, 'application.properties'์ mapper ํ์ผ ์์น ์ง์
- classpath(src/main/resources) > mapperํด๋ > ๋ชจ๋ .xmlํ์ผ
- mapper๋ผ๋ ์ ๋ ๋ชจ๋ xml์ ์๋ฏธํ๋๊ตฌ๋๋ฅผ ์ ์ ์์
โ๏ธ SQL๋ฌธ์ ์์ฑํ xml ํ์ผ ์์ฑ
- MyBatisํ๋ ์์ํฌ์ ์ค์ ํ์ผ == SQL์ ์ ์ฅํ๋ ํ์ผ == mapper.xml
โ๏ธ MyBatis ๋งคํผ๋ Interface ์ฌ์ฉ!
- ibatis๊ฐ ์ง๊ธ์ mybatis์์ด..
ibatis == mybatis
์๋ ์ ๋ง๋ค์ด์ง ํจํค์ง๊ตฌ๋..! - ์ธํฐํ์ด์ค์๋ DAO๊ฐ @Mapper๋ฅผ ํตํด ๊ฐ์ฒดํ๋๊ธฐ๋๋ฌธ์,
Service์์ InterfaceSerialDAO๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ๋จ
- ๊ธฐ์กด์๋ JdbcTemplate์ ์ฌ์ฉํ๋ DAO๋ฅผ ์์กด์ฃผ์ ํด์ Service๋ฅผ ์ฌ์ฉํ์
- namespace ์์ฑ = ๋๊ตฌ์ mapper๋ฅผ ์งํํ ๊ฒ์ธ์ง ์์ฑํ๋ ๊ณต๊ฐ
- id ์์ฑ = ์ด๋ค ๋ฉ์๋ ์ฌ์ฉํ ๊ฒ์ธ์ง ๋ฉ์๋๋ช ์ ํํ ๊ธฐ์
- resultType ์์ฑ = ๋๊ตฌ๋ฅผ ๋ฐํํ๋์ง ์์ฑ
- parameterType ์์ฑ = ํ๋ผ๋ฏธํฐ ํ์
++ parameterType
Map<String, Object>
SQL๋ฌธ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ํ๋ผ๋ฏธํฐ ๊ฐ์๊ฐ ๋ฌ๋ผ์ง๋ ๋ฑ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ธฐ ์ํด Map ์ฌ์ฉ
SerialDAO.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 namespace="com.webWeavers.weaveGlow.biz.serial.ISerialDAO">
<select id="selectAllOrderList" resultType="com.webWeavers.weaveGlow.biz.serial.SerialDTO">
WITH BS AS (
SELECT
SERIAL_PK,
COUNT(BUYPRODUCT_PK) - 1 AS CNT
FROM BUYPRODUCT
GROUP BY SERIAL_PK
)
SELECT
S.SERIAL_PK, S.SERIAL_REGDATE, S.SERIAL_STATUS, S.SERIAL_DELIVERYADDRESS, S.MEMBER_ID, M.MEMBER_NAME,
BS.CNT, MAX(P.PRODUCT_NAME) AS PRODUCT_NAME,
SUM(P.PRODUCT_PRICE * B.BUYPRODUCT_CNT) AS TOTALPRICE
FROM SERIAL S
LEFT JOIN BUYPRODUCT B ON S.SERIAL_PK = B.SERIAL_PK
LEFT JOIN BS ON S.SERIAL_PK = BS.SERIAL_PK
LEFT JOIN PRODUCT P ON B.PRODUCT_PK = P.PRODUCT_PK
LEFT JOIN MEMBER M ON S.MEMBER_ID = M.MEMBER_ID
GROUP BY S.SERIAL_PK, S.SERIAL_REGDATE, S.SERIAL_STATUS, S.SERIAL_DELIVERYADDRESS, S.MEMBER_ID, M.MEMBER_NAME, BS.CNT
ORDER BY S.SERIAL_PK DESC
</select>
<select id="selectAllOrderProduct" resultType="com.webWeavers.weaveGlow.biz.serial.SerialDTO">
SELECT
S.SERIAL_PK, S.SERIAL_REGDATE, M.MEMBER_NAME,
P.PRODUCT_NAME, B.BUYPRODUCT_CNT,
(P.PRODUCT_PRICE * B.BUYPRODUCT_CNT) AS TOTALPRICE
FROM SERIAL S
LEFT JOIN BUYPRODUCT B ON S.SERIAL_PK = B.SERIAL_PK
LEFT JOIN PRODUCT P ON B.PRODUCT_PK = P.PRODUCT_PK
LEFT JOIN MEMBER M ON S.MEMBER_ID = M.MEMBER_ID
WHERE S.SERIAL_PK = #{serialPK}
ORDER BY B.BUYPRODUCT_PK DESC
</select>
<select id="selectAllOrderSearch" resultType="com.webWeavers.weaveGlow.biz.serial.SerialDTO">
WITH BS AS (
SELECT
SERIAL_PK,
COUNT(BUYPRODUCT_PK) - 1 AS CNT
FROM BUYPRODUCT
GROUP BY SERIAL_PK
)
SELECT
S.SERIAL_PK, S.SERIAL_REGDATE, S.SERIAL_STATUS, S.SERIAL_DELIVERYADDRESS,
S.MEMBER_ID, M.MEMBER_NAME,
BS.CNT, MAX(P.PRODUCT_NAME) AS PRODUCT_NAME,
SUM(P.PRODUCT_PRICE * B.BUYPRODUCT_CNT) AS TOTALPRICE
FROM SERIAL S
LEFT JOIN BUYPRODUCT B ON S.SERIAL_PK = B.SERIAL_PK
LEFT JOIN BS ON S.SERIAL_PK = BS.SERIAL_PK
LEFT JOIN PRODUCT P ON B.PRODUCT_PK = P.PRODUCT_PK
LEFT JOIN MEMBER M ON S.MEMBER_ID = M.MEMBER_ID
WHERE
S.SERIAL_STATUS LIKE CONCAT('%',#{serialStatus},'%')
AND M.MEMBER_NAME LIKE CONCAT('%',#{memberName},'%')
AND DATE(S.SERIAL_REGDATE) LIKE CONCAT('%',#{serialRegdate},'%')
GROUP BY S.SERIAL_PK, S.SERIAL_REGDATE, S.SERIAL_STATUS, S.SERIAL_DELIVERYADDRESS, S.MEMBER_ID, M.MEMBER_NAME, BS.CNT
ORDER BY S.SERIAL_PK DESC
</select>
<insert id="insert">
INSERT INTO SERIAL (MEMBER_ID, SERIAL_DELIVERYADDRESS) VALUES (#{param1}, #{param2})
</insert>
<update id="update">
UPDATE SERIAL SET SERIAL_STATUS = #{serialStatus} WHERE SERIAL_PK = #{serialPK}
</update>
</mapper>
ISerialDAO.java (๋งคํํ DAO)
package com.webWeavers.weaveGlow.biz.serial;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface ISerialDAO {
// ์ ์ฒด ์ฃผ๋ฌธํํฉ_(๊ด๋ฆฌ์)์ฃผ๋ฌธ๊ด๋ฆฌํ์ด์ง
public List<SerialDTO> selectAllOrderList();
// ์ฃผ๋ฌธ๋ฒํธ๋ณ ์ํํํฉ_(๊ด๋ฆฌ์)์ฃผ๋ฌธ๊ด๋ฆฌํ์ด์ง
public List<SerialDTO> selectAllOrderProduct(Map<String, Object> map);
// ์ฃผ๋ฌธ๊ฒ์_(๊ด๋ฆฌ์)์ฃผ๋ฌธ๊ด๋ฆฌํ์ด์ง
public List<SerialDTO> selectAllOrderSearch(Map<String, Object> map);
// ์ฃผ๋ฌธ์ถ๊ฐ_(๊ด๋ฆฌ์)์ฃผ๋ฌธ๊ด๋ฆฌํ์ด์ง
// ์ ์
public int insert(String memberID, String serialDeliveryAddress);
// ์ฃผ๋ฌธ์ํ๋ณ๊ฒฝ_(๊ด๋ฆฌ์)์ฃผ๋ฌธ๊ด๋ฆฌํ์ด์ง
// ํ๋ผ๋ฏธํฐ๋ SQL๋ฌธ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ํ๋ผ๋ฏธํฐ๋ ๋ฌ์ง ์ ์์ > ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ Map์ ์ธ์๋ก ์ฃผ๋ ๊ฒฝ์ฐ
public int update(Map<String, Object> map);
}
SerialService.java (Interface)
package com.webWeavers.weaveGlow.biz.serial;
import java.util.List;
public interface SerialService {
List<SerialDTO> selectAll(SerialDTO serialDTO);
// SerialDTO selectOne(SerialDTO serialDTO);
boolean insert(SerialDTO serialDTO);
boolean update(SerialDTO serialDTO);
// boolean delete(SerialDTO serialDTO);
}
SerialServiceImpl.java (Interface ๊ตฌํ)
package com.webWeavers.weaveGlow.biz.serial;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service("serialService")
public class SerialServiceImpl implements SerialService {
@Autowired
private ISerialDAO serialDAO;
@Override
public List<SerialDTO> selectAll(SerialDTO serialDTO) {
// ์ ์ฒด ์ฃผ๋ฌธํํฉ_(๊ด๋ฆฌ์)์ฃผ๋ฌธ๊ด๋ฆฌํ์ด์ง
if (serialDTO.getSearchCondition().equals("orderList")) {
return serialDAO.selectAllOrderList();
}
// ์ฃผ๋ฌธ๋ฒํธ๋ณ ์ํํํฉ_(๊ด๋ฆฌ์)์ฃผ๋ฌธ๊ด๋ฆฌํ์ด์ง
else if (serialDTO.getSearchCondition().equals("orderProduct")) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("serialPK", serialDTO.getSerialPK());
return serialDAO.selectAllOrderProduct(map);
}
// ์ฃผ๋ฌธ๊ฒ์_(๊ด๋ฆฌ์)์ฃผ๋ฌธ๊ด๋ฆฌํ์ด์ง
else if (serialDTO.getSearchCondition().equals("orderSearch")) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("serialStatus", serialDTO.getSerialStatus());
map.put("memberName", serialDTO.getMemberName());
map.put("serialRegdate", serialDTO.getSerialRegdate());
return serialDAO.selectAllOrderSearch(map);
}
return null;
}
// @Override
// public SerialDTO selectOne(SerialDTO serialDTO) {
// return serialDAO.selectOne(serialDTO);
// }
// ์ ์
@Override
public boolean insert(SerialDTO serialDTO) {
int result = serialDAO.insert(serialDTO.getMemberID(), serialDTO.getSerialDeliveryAddress());
if (result <= 0) {
return false;
}
return true;
}
// ํ๋ผ๋ฏธํฐ๋ SQL๋ฌธ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ํ๋ผ๋ฏธํฐ๋ ๋ฌ์ง ์ ์์ > ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ Map์ ์ธ์๋ก ์ฃผ๋ ๊ฒฝ์ฐ
@Override
public boolean update(SerialDTO serialDTO) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("serialStatus", serialDTO.getSerialStatus());
map.put("serialPK", serialDTO.getSerialPK());
if (serialDAO.update(map) <= 0) {
return false;
}
return true;
}
// @Override
// public boolean delete(SerialDTO serialDTO) {
// return false;
// }
}
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring Boot_Validation (0) | 2024.03.13 |
---|---|
Spring Boot_Lombok_@Data (0) | 2024.03.12 |
Spring Boot_MVC data ์ ๋ฌ, +@PathVariable (0) | 2024.03.11 |
Spring Boot_Gradle Project (0) | 2024.03.07 |
Spring Framework_์ปค๋งจ๋ ๊ฐ์ฒด(Command Object) (0) | 2024.03.07 |