본문 바로가기
[ Developer ]/Spring Framework

[Spring] 스프링 쿼리 Query

by 김현섭. 2016. 6. 13.
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
Query

# Insert
<insert 이후에 id로 특정 쿼리명을 주고 values에서 #{객체가 가진 변수명}을 넣어주면 객체가 갖는 변수를 자동으로 입력을 한다

쿼리 시 이전에 입력할 데이터를 ?로 쓰던 것을 #{ 변수명 }으로 대체를 한다
하지만 파라미터를 어떤 타입 인지를 전달되는 객체에 따라 파라미터의 타입이 결정된다

<insert id="insertUser" parameterType="User">
     insert into users (id, username, password)
     values ( #{id}, #{username}, #{password})
</insert>

위의 쿼리에서 parameterType의 클래스명이 들어가고 values의 #{}는 User 클래스 타입의 파라미터가 전달이 된다
그러나 여러 가지의 클래스를 보내고 싶을 때는 허용되지 않기 때문에 보편적인 방법으로는 Map으로 사용해서 해결한다

# Parameters
#{ param }은 PreparedStatement의 ? 와 같음 즉 문자열인 경우 파라미터의 앞 뒤에 자동으로 '가 붙음
#(샵)이외에도 $(달러)로도 컬럼명을 사용할 수 있지만 보안상의 문제로 쓰지 않는다

우선 vo 패키지 내에 EmployeesVO를 생성한다


그리고 호출을 확인하기 위해서 Getter/Setter 시 로그를 남기기 위해 Logger를 추가한다
Getter와 Setter에 로그를 남겨줄 수 있도록 logger를 남긴다


그리고 ArticleDAO 인터페이스에서 List<EmployeesVO>를 리턴하는 메소드를 정의한다


그런다면 이제 ArticleDAOImpl에서 인터페이스에서 정의한 메소드를 오버라이딩한다



그리고 articleDAO.xml에서 쿼리를 입력한다


이제는 인터페이스 ArticleBiz에서 List<EmployeesVO>를 리턴하는 메소드를 작성하고 Impl에서 오버라이딩 시킨다



위에 작성한 메소드를 실행시킬 곳을 지정해서 메소드를 실행하면 된다
ArticleController에서 /list로 접근할 때 받고 출력을 해주기로 한다


기존의 해왔던 방식과 동일하게 List를 생성해서 Biz를 실행시켜 Employees 목록을 리턴 받는다
그 후 view의 addObject를 이용해서 리스트를 보내준다

그리고 jsp에서 taglib를 이용하기 위해서는 jstl을 추가해야 하는데
pom.xml에서 추가를 해주면 된다


jstl을 검색해서 1.1.2 버전을 추가 한 후 jsp에서 이전의 방식과 동일하게 사용하면 된다


taglib 추가 후 내용 쪽에 forEach를 통해서 출력해주면 된다


# 별칭으로 resultType에 적는 패키지 간단하게 작성
main/resources에 있는 mybatis.xml을 열고 typeAliases를 준다
별칭을 줘서 클래스의 위치를 지정하는 방식이다


type에는 DAO.xml에서 작성한 쿼리의 resultType를 주고 alias에 클래스의 이름을 주면 된다


그런 후 쿼리로 가서 resultType에서 패키지명을 없애도 된다


결과를 보면 출력되는 것을 볼 수 있다


# 쿼리에 Parameter주기
LAST_NAME이 King이 사람만을 출력하고 싶다
우선 쿼리를 수정해서 WHERE 절을 넣으면 된다


그런 후 parameterType을 지정해주면 된다 우선 string으로 지정한다


그런 후 쿼리를 실행하는 ArticleDAOImpl.java에서 메소드를 찾아서 파라미터를 lastName으로 보내면 된다


그런 후 /list로 접근하면 LAST_NAME이 King인 사람만 출력되는 것을 볼 수 있다


그런 후 First Name이 Steven인 사람만 출력하고 싶다면 쿼리에 하나의 조건을 더 추가하면 된다


그런데 파라미터가 2개라면 parameterType을 string으로 주지못한다 그렇기 때문에 Type을 map으로 변경한다


그런 후 ArticleDAOImpl.java에서 String 변수를 파라미터로 보낼 것이 아니라 Map 변수를 보내면 된다
우선 Map을 생성한다


Map의 key는 무조건 String으로 선언을 하고 value는 Object로 정의한다


Map에는 이런식으로 String 타입으로 넣을 수도 있고 숫자도 넣을 수 있다
심지어는 객체도 넣을 수 있다 그렇기 때문에 쿼리로 주는 Map은 항상 value를 Object로 정의한다
쿼리의 파라미터로 받는 #{Key}는 Key값의 이름과 동일하다면 동일한 value값이 들어가게 된다

그런 후 파라미터를 Map으로 보내면 다음과 같은 결과를 갖는다



그런 다음 객체로도 보내는 방식을 사용할 수도 있다


그렇다면 쿼리에서 파라미터 타입을 객체명으로 지정해주면 된다


동일하게 결과는 1건이 나온것을 볼 수 있다