728x90
생성해야하는 파일
- myBatis-config.xml 수정
- DTO 생성
파일명 : ~~~.Dto - DAO 생성
파일명 : ~~~Dao || DaoImpl - Mapper 생성
파일명 : ~~~~Mapper.xml
1. myBatis-config.xml
자주하는 실수 : 별명을 무조건 올린다. mapper에서 returntype으로 그냥 쓸 때 에러 발생 / 별명(alias)가 중복되면 안된다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias alias="BoardDto" type="com.teamProject.ezmeal.domain.BoardDto"/>
<typeAlias alias="SearchCondition" type="com.teamProject.ezmeal.domain.SearchCondition" />
<typeAlias alias="CommentDto" type="com.teamProject.ezmeal.domain.CommentDto"/>
<typeAlias alias="CartDto" type="com.teamProject.ezmeal.domain.CartDto"/>
<typeAlias alias="CartProductDto" type="com.teamProject.ezmeal.domain.CartProductDto"/>
<typeAlias alias="DeliveryAddressDto" type="com.teamProject.ezmeal.domain.DeliveryAddressDto"/>
<typeAlias alias="MemberDto" type="com.teamProject.ezmeal.domain.MemberDto"/>
</typeAliases>
</configuration>
2. DTO 생성
package com.teamProject.ezmeal.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CartDto {
private Long cart_seq;
private Long mbr_id;
}
3. DAO 생성
자주 실수하는 부분
- SqlSession을 받아야한다.
- namespace끝에 점이 붙는다. -> Mapper.xml의 namespace와 동일
- session method : selectOne, selectList , insert, delete, update
- selectOne : 1개만 받는다. 행 or 값 1개
- seleList : 행 여러개를 list로 받는다. [행, 행, 행] -> mapper에서 returntype을 list안에 들어갈 객체 명으로 한다.
- selectMap : 거의 사용X
- insert, update, delete는 returntype을 따로 정하지 않고 변경된 행의 개수가 자동으로 반환 된다. int
- mapper에 넘겨야하는 값이 여러개인 경우 (mapper.xml 작성되어있음)
- map으로 감싸서 넘긴다.
- 사용할 때 #{map.CartSeq}가 아니라 #{CartSeq}로 바로 사용
- 아래 map으로 감싼것이 array형태일 경우 foreach로 생성하고 #{} 없이 " " string으로 바로 넘긴다.
package com.teamProject.ezmeal.dao;
import lombok.RequiredArgsConstructor;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
@Repository
@RequiredArgsConstructor
public class PointTransactionHistoryDao {
private final SqlSession session;
private static final String namespace = "tb_pointTransactionHistory.";
public int pointCanUse(Long mbrId){
return session.selectOne(namespace + "point_can_use", mbrId);
}
// map으로 값 전달하는 경우
public List<CartProductDto> cartProducts(Long mbrId, String prodCodeString) throws Exception {
Long cartSeq = cartSeq(mbrId);// cart_seq
// 하나로 되어있는 string 배열로 쪼개기
String[] parts = prodCodeString.split("p"); // TODO 구독상품은 p -> g
ArrayList<String> prodCdList = new ArrayList<>();
for (String part : parts) {
if (!part.isEmpty()) {
String prodCd = "p" + part; // TODO 구독상품은 p -> g
prodCdList.add(prodCd);
}
}
// map으로 다른 것들 담기
Map map = new HashMap<>();
map.put("cartSeq", cartSeq);
map.put("prodCdList", prodCdList);
return session.selectList(namespace + "select_prod", map);
}
}
4. Mapper 생성
자주하는 실수
- 파일명은 무조건 Mapper.xml로 마무리 지어야한다.
- id는 dao의 namespace 다음의 string이다. cf) dao의 method명과 상관 없음
<?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="tb_member">
<select id="lgin_pw" parameterType="String" resultType="String">
SELECT lgin_pw
FROM tb_member
WHERE lgin_id = #{loginId}
</select>
<select id="mbr_id" parameterType="String" resultType="long">
SELECT mbr_id
FROM tb_member
WHERE lgin_id = #{loginId}
</select>
<select id="mbr_Info" parameterType="Long" resultType="MemberDto">
select *
from tb_member
where mbr_id = ${memberId}
</select>
<!--동적쿼리, 상품 여러개 받아오기-->
<select id="select_prod" resultType="CartProductDto">
SELECT *
from tb_cart_product cp,
tb_product p
WHERE cp.cart_seq = #{cartSeq}
and cp.prod_cd = p.prod_cd
AND cp.prod_cd IN
<foreach item="item" collection="prodCdList" open="(" separator="," close=")">
#{item}
</foreach>
</select>
</mapper>
5. 참고 - 설정파일
root-context
- 여기 설정에 의해서 mapper.xml의 위치와 파일명 규칙이 생성이 된다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:mvc="http://www.springframework.org/schema/mvc"
...
<!-- Root Context: defines shared resources visible to all other web components -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql:mysql schema url 경로"/>
<property name="username" value="xxxxxxxxx"></property>
<property name="password" value="xxxxxxxxx"></property>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/> <!-- mybatis 설정파일 -->
<property name="mapperLocations" value="classpath:mapper/*Mapper.xml"/>
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactory"/>
</bean>
...
</beans>