mybatisAlias.xml (마이바티스설정파일)
typeAliases 에 package 의 name속성에 매퍼파일에서 반복적으로 사용될 패키지명을 정의해 주면 편리하다
<typeAliases>
<package name="kr.or.ddit.vo"/>
</typeAliases>
아니면 type과 alias 속성으로 하나씩 다 지정해 주어도 된다
이렇게 하면 alias 속성의 값으로 대신 쓸 수 있다
<typeAliases>
<typeAlias type="kr.or.ddit.vo.LprodVO" alias="LprodVO" />
<typeAlias type="kr.or.ddit.vo.EmployeeVO" alias="employeeVO" />
</typeAliases>
lprod_SQL.xml (매퍼파일)
패키지명 생략하고 클래스명만 지정 가능하다
<!-- <update id="updatePost" parameterType="kr.or.ddit.vo.LprodVO"> -->
<update id="updatePost" parameterType="LprodVO">
</update>
mybatisAlias.xml (마이바티스설정파일)
"_"를 사용한 컬럼명을 사용 시 카멜케이스로 읽어준다
ex) 테이블 컬럼명이 member_id인 경우 jsp화면단에서 이 값을 사용 시 memberId로 사용
<settings>
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
LprodServiceImpl.java
다오 대신 매퍼인터페이스를 사용한다
@Service
public class LprodServiceImpl implements LprodService{
@Autowired
LprodMapper lprodMapper;
@Override
public int getTotal(Map<String, Object> map) {
return this.lprodMapper.getTotal(map);
}
}
LprodMapper.java (매퍼인터페이스)
매퍼패키지 안에 매퍼인터페이스를 두었고 매퍼패키지는 root-context.xml에 매퍼인터페이스 설정이 되어있다
public interface LprodMapper {
public int getTotal(Map<String, Object> map);
}
root-context.xml
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="kr.or.ddit.**.mapper" />
</bean>
lprod_SQL.xml (매퍼파일)
namespace는 패키지명과 매퍼파일까지 다 써준다
select절의 resultMap은 조인을 할 때 조인 결과에 대한 매핑을 정의해야 한다
lprod안에 product가 있는데 (중첩VO)
lprod의 프로퍼티들을 다 적어주고 product와는 1:N관계로 productList는 <collection>으로 적어준다
다시 product도 resultmap으로 프로퍼티들을 추가해 준다
1:1 관계라면 collection 대신 association 을 사용한다
<sql id="where">는 안에 where절의 조건 식을 적어두고 해당 where조건이 필요한 곳에 <include refid="where"></include> 요렇게 한 줄 적으면 된다
또 동적 sql 조립규칙을 정의할 수도 있는데 <if> 는 조건에 따라 안의 쿼리를 실행하거나 실행하지 않을 수 있다
<?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="kr.or.ddit.mapper.LprodMapper">
<sql id="where">
AND (
LPROD_ID LIKE '%' || #{keyword} || '%'
OR LPROD_GU LIKE '%' || #{keyword} || '%'
OR LPROD_NM LIKE '%' || #{keyword} || '%')
</sql>
<select id="list" resultType="lprodVO" parameterType="map">
SELECT LPROD_ID, LPROD_GU, LPROD_NM
FROM LPROD
WHERE 1 = 1
<if test="keyword!=null and keyword!=''">
AND (
LPROD_ID LIKE '%' || #{keyword} || '%'
OR LPROD_GU LIKE '%' || #{keyword} || '%'
OR LPROD_NM LIKE '%' || #{keyword} || '%')
</if>
ORDER BY LPROD_ID
</select>
<!-- LPROD : 1 -->
<resultMap type="lprodVO" id="lprodMap">
<result property="lprodId" column="LPROD_ID"/>
<result property="lprodGu" column="LPROD_GU"/>
<result property="lprodNm" column="LPROD_NM"/>
<collection property="productVOList" resultMap="productMap"></collection>
</resultMap>
<!-- PRODUCT : N -->
<resultMap type="productVO" id="productMap">
<result property="productId" column="PRODUCT_ID"/>
<result property="pname" column="PNAME"/>
<result property="unitPrice" column="UNIT_PRICE"/>
<result property="description" column="DESCRIPTION"/>
<result property="manufacturer" column="MANUFACTURER"/>
<result property="category" column="CATEGORY"/>
<result property="unitsInStock" column="UNITS_IN_STOCK"/>
<result property="condition" column="CONDITION"/>
<result property="filename" column="FILENAME"/>
</resultMap>
<select id="detail" parameterType="lprodVO" resultMap="lprodMap">
SELECT A.LPROD_ID, A.LPROD_GU, A.LPROD_NM,
B.PRODUCT_ID, B.PNAME, B.UNIT_PRICE, B.DESCRIPTION, B.MANUFACTURER,
B.CATEGORY, B.UNITS_IN_STOCK, B.CONDITION, B.FILENAME, B.QUANTITY
FROM LPROD A LEFT OUTER JOIN PRODUCT B
ON (A.LPROD_GU = SUBSTR(B.PRODUCT_ID,1,4))
WHERE A.LPROD_GU = #{lprodGu}
</select>
<select id="getTotal" parameterType="hashMap" resultType="int">
SELECT COUNT(*)
FROM LPROD
WHERE 1 = 1
<include refid="where"></include>
</select>
</mapper>