View Javadoc
1   /**
2    *    Copyright 2009-2015 the original author or authors.
3    *
4    *    Licensed under the Apache License, Version 2.0 (the "License");
5    *    you may not use this file except in compliance with the License.
6    *    You may obtain a copy of the License at
7    *
8    *       http://www.apache.org/licenses/LICENSE-2.0
9    *
10   *    Unless required by applicable law or agreed to in writing, software
11   *    distributed under the License is distributed on an "AS IS" BASIS,
12   *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *    See the License for the specific language governing permissions and
14   *    limitations under the License.
15   */
16  package org.apache.ibatis.jdbc;
17  
18  import org.junit.Test;
19  
20  import static org.junit.Assert.assertEquals;
21  
22  public class SQLTest {
23  
24    @Test
25    public void shouldDemonstrateProvidedStringBuilder() {
26      //You can pass in your own StringBuilder
27      final StringBuilder sb = new StringBuilder();
28      //From the tutorial
29      final String sql = new SQL() {{
30        SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME");
31        SELECT("P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON");
32        FROM("PERSON P");
33        FROM("ACCOUNT A");
34        INNER_JOIN("DEPARTMENT D on D.ID = P.DEPARTMENT_ID");
35        INNER_JOIN("COMPANY C on D.COMPANY_ID = C.ID");
36        WHERE("P.ID = A.ID");
37        WHERE("P.FIRST_NAME like ?");
38        OR();
39        WHERE("P.LAST_NAME like ?");
40        GROUP_BY("P.ID");
41        HAVING("P.LAST_NAME like ?");
42        OR();
43        HAVING("P.FIRST_NAME like ?");
44        ORDER_BY("P.ID");
45        ORDER_BY("P.FULL_NAME");
46      }}.usingAppender(sb).toString();
47  
48      assertEquals("SELECT P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME, P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON\n" +
49          "FROM PERSON P, ACCOUNT A\n" +
50          "INNER JOIN DEPARTMENT D on D.ID = P.DEPARTMENT_ID\n" +
51          "INNER JOIN COMPANY C on D.COMPANY_ID = C.ID\n" +
52          "WHERE (P.ID = A.ID AND P.FIRST_NAME like ?) \n" +
53          "OR (P.LAST_NAME like ?)\n" +
54          "GROUP BY P.ID\n" +
55          "HAVING (P.LAST_NAME like ?) \n" +
56          "OR (P.FIRST_NAME like ?)\n" +
57          "ORDER BY P.ID, P.FULL_NAME", sql);
58    }
59  
60    @Test
61    public void shouldDemonstrateMixedStyle() {
62      //Mixed
63      final String sql = new SQL() {{
64        SELECT("id, name");
65        FROM("PERSON A");
66        WHERE("name like ?").WHERE("id = ?");
67      }}.toString();
68  
69      assertEquals("" +
70          "SELECT id, name\n" +
71          "FROM PERSON A\n" +
72          "WHERE (name like ? AND id = ?)", sql);
73    }
74  
75    @Test
76    public void shouldDemonstrateFluentStyle() {
77      //Fluent Style
78      final String sql = new SQL()
79          .SELECT("id, name").FROM("PERSON A")
80          .WHERE("name like ?")
81          .WHERE("id = ?").toString();
82  
83      assertEquals("" +
84          "SELECT id, name\n" +
85          "FROM PERSON A\n" +
86          "WHERE (name like ? AND id = ?)", sql);
87    }
88  
89    @Test
90    public void shouldProduceExpectedSimpleSelectStatement() {
91      final String expected =
92          "SELECT P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME\n" +
93              "FROM PERSON P\n" +
94              "WHERE (P.ID like #id# AND P.FIRST_NAME like #firstName# AND P.LAST_NAME like #lastName#)\n" +
95              "ORDER BY P.LAST_NAME";
96      assertEquals(expected, example2("a", "b", "c"));
97    }
98  
99    @Test
100   public void shouldProduceExpectedSimpleSelectStatementMissingFirstParam() {
101     final String expected =
102         "SELECT P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME\n" +
103             "FROM PERSON P\n" +
104             "WHERE (P.FIRST_NAME like #firstName# AND P.LAST_NAME like #lastName#)\n" +
105             "ORDER BY P.LAST_NAME";
106     assertEquals(expected, example2(null, "b", "c"));
107   }
108 
109   @Test
110   public void shouldProduceExpectedSimpleSelectStatementMissingFirstTwoParams() {
111     final String expected =
112         "SELECT P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME\n" +
113             "FROM PERSON P\n" +
114             "WHERE (P.LAST_NAME like #lastName#)\n" +
115             "ORDER BY P.LAST_NAME";
116     assertEquals(expected, example2(null, null, "c"));
117   }
118 
119   @Test
120   public void shouldProduceExpectedSimpleSelectStatementMissingAllParams() {
121     final String expected =
122         "SELECT P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME\n" +
123             "FROM PERSON P\n" +
124             "ORDER BY P.LAST_NAME";
125     assertEquals(expected, example2(null, null, null));
126   }
127 
128   @Test
129   public void shouldProduceExpectedComplexSelectStatement() {
130     final String expected =
131         "SELECT P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME, P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON\n" +
132             "FROM PERSON P, ACCOUNT A\n" +
133             "INNER JOIN DEPARTMENT D on D.ID = P.DEPARTMENT_ID\n" +
134             "INNER JOIN COMPANY C on D.COMPANY_ID = C.ID\n" +
135             "WHERE (P.ID = A.ID AND P.FIRST_NAME like ?) \n" +
136             "OR (P.LAST_NAME like ?)\n" +
137             "GROUP BY P.ID\n" +
138             "HAVING (P.LAST_NAME like ?) \n" +
139             "OR (P.FIRST_NAME like ?)\n" +
140             "ORDER BY P.ID, P.FULL_NAME";
141     assertEquals(expected, example1());
142   }
143 
144   private static String example1() {
145     return new SQL() {{
146       SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME");
147       SELECT("P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON");
148       FROM("PERSON P");
149       FROM("ACCOUNT A");
150       INNER_JOIN("DEPARTMENT D on D.ID = P.DEPARTMENT_ID");
151       INNER_JOIN("COMPANY C on D.COMPANY_ID = C.ID");
152       WHERE("P.ID = A.ID");
153       WHERE("P.FIRST_NAME like ?");
154       OR();
155       WHERE("P.LAST_NAME like ?");
156       GROUP_BY("P.ID");
157       HAVING("P.LAST_NAME like ?");
158       OR();
159       HAVING("P.FIRST_NAME like ?");
160       ORDER_BY("P.ID");
161       ORDER_BY("P.FULL_NAME");
162     }}.toString();
163   }
164 
165   private static String example2(final String id, final String firstName, final String lastName) {
166     return new SQL() {{
167       SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME");
168       FROM("PERSON P");
169       if (id != null) {
170         WHERE("P.ID like #id#");
171       }
172       if (firstName != null) {
173         WHERE("P.FIRST_NAME like #firstName#");
174       }
175       if (lastName != null) {
176         WHERE("P.LAST_NAME like #lastName#");
177       }
178       ORDER_BY("P.LAST_NAME");
179     }}.toString();
180   }
181 
182 }