<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://maybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.TestMapper"> <!-- Mapper을 namespace에 지정 -->
</mapper>
// Mapper 인터페이스로 만든다
public interface TestMapper{
// @SelectProvider으로 SQL을 생성하는 클래스 메소드를 설정한다.
@SelectProvider(type=TestSqlProvider.class, method="selectTestSql")
List<Test> selectTest();
}
// SQL을 생성하는 클래스
public class TestSqlProvider{
// SQL 클래스를 사용하여 SQL을 생성한다.
SQL sql = new SQL(){{
SELECT("id, name");
SELECT("mobile");
SELECT("email");
FROM("test");
}};
return sql.toString();
}
[DEBUG] s.m.T.selectTest - ==> Preparing: SELECT id, name, mobile, email FROM test
new SQL(){{
SELECT("id");
SELECT("name");
SELECT("email");
FROM("user");
}};
결과
SELECT id, name, email FROM user
연속하여 작성하면 각 항목을 쉼표로 마음대로 구분된다.
명시적으로 쉼표로 구분된 문자열 전달도 된다.
끝에 불필요한 쉼표가 있는 경우 제거해 주지 않는다.
new SQL(){{
SELECT("*");
FROM("user");
FROM("address");
}};
SELECT * FROM user, address
new SQL(){{
SELECT("*");
FROM("user");
WHERE("id = test");
WHERE("name = 홍길동");
AND();
WHERE("email = test@test.com");
OR();
WHERE("mobile = 01011112222");
}};
SELECT *
FROM users
WHERE ( id = test AND name = 홍길동)
AND email = test@test.com
OR mobile = 01011112222
new SQL(){{
SELECT("*");
FROM("user");
ORDER_BY("ID");
ORDER_BY("NAME");
}};
SELECT * FROM USER ORDER BY ID, NAME DESC
new SQL(){{
SELECT("id, name");
FROM("USER");
GROUP_BY("id");
GROUP_BY("name");
}};
SELECT id, name FROM user GROUP BY id, name
new SQL(){{
SELECT("id, count(*)");
FROM("user");
GROUP_BY("id");
Having("0 < count(*)");
HAVING("count(*) < 100");
}};
SELECT id, count(*)
FROM user
GROUP BY id
HAVING ( 0 < count(id)
AND count(id) < 100
)