/** * Copyright 2009-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.ibatis.jdbc; import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; public class SQLTest { @Test public void shouldDemonstrateProvidedStringBuilder() { //You can pass in your own StringBuilder final StringBuilder sb = new StringBuilder(); //From the tutorial final String sql = example1().usingAppender(sb).toString(); assertEquals("SELECT P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME, P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON\n" + "FROM PERSON P, ACCOUNT A\n" + "INNER JOIN DEPARTMENT D on D.ID = P.DEPARTMENT_ID\n" + "INNER JOIN COMPANY C on D.COMPANY_ID = C.ID\n" + "WHERE (P.ID = A.ID AND P.FIRST_NAME like ?) \n" + "OR (P.LAST_NAME like ?)\n" + "GROUP BY P.ID\n" + "HAVING (P.LAST_NAME like ?) \n" + "OR (P.FIRST_NAME like ?)\n" + "ORDER BY P.ID, P.FULL_NAME", sql); } @Test public void shouldDemonstrateMixedStyle() { //Mixed final String sql = new SQL() {{ SELECT("id, name"); FROM("PERSON A"); WHERE("name like ?").WHERE("id = ?"); }}.toString(); assertEquals("" + "SELECT id, name\n" + "FROM PERSON A\n" + "WHERE (name like ? AND id = ?)", sql); } @Test public void shouldDemonstrateFluentStyle() { //Fluent Style final String sql = new SQL() .SELECT("id, name").FROM("PERSON A") .WHERE("name like ?") .WHERE("id = ?").toString(); assertEquals("" + "SELECT id, name\n" + "FROM PERSON A\n" + "WHERE (name like ? AND id = ?)", sql); } @Test public void shouldProduceExpectedSimpleSelectStatement() { final String expected = "SELECT P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME\n" + "FROM PERSON P\n" + "WHERE (P.ID like #id# AND P.FIRST_NAME like #firstName# AND P.LAST_NAME like #lastName#)\n" + "ORDER BY P.LAST_NAME"; assertEquals(expected, example2("a", "b", "c")); } @Test public void shouldProduceExpectedSimpleSelectStatementMissingFirstParam() { final String expected = "SELECT P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME\n" + "FROM PERSON P\n" + "WHERE (P.FIRST_NAME like #firstName# AND P.LAST_NAME like #lastName#)\n" + "ORDER BY P.LAST_NAME"; assertEquals(expected, example2(null, "b", "c")); } @Test public void shouldProduceExpectedSimpleSelectStatementMissingFirstTwoParams() { final String expected = "SELECT P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME\n" + "FROM PERSON P\n" + "WHERE (P.LAST_NAME like #lastName#)\n" + "ORDER BY P.LAST_NAME"; assertEquals(expected, example2(null, null, "c")); } @Test public void shouldProduceExpectedSimpleSelectStatementMissingAllParams() { final String expected = "SELECT P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME\n" + "FROM PERSON P\n" + "ORDER BY P.LAST_NAME"; assertEquals(expected, example2(null, null, null)); } @Test public void shouldProduceExpectedComplexSelectStatement() { final String expected = "SELECT P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME, P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON\n" + "FROM PERSON P, ACCOUNT A\n" + "INNER JOIN DEPARTMENT D on D.ID = P.DEPARTMENT_ID\n" + "INNER JOIN COMPANY C on D.COMPANY_ID = C.ID\n" + "WHERE (P.ID = A.ID AND P.FIRST_NAME like ?) \n" + "OR (P.LAST_NAME like ?)\n" + "GROUP BY P.ID\n" + "HAVING (P.LAST_NAME like ?) \n" + "OR (P.FIRST_NAME like ?)\n" + "ORDER BY P.ID, P.FULL_NAME"; assertEquals(expected, example1().toString()); } private static SQL example1() { return new SQL() {{ SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME"); SELECT("P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON"); FROM("PERSON P"); FROM("ACCOUNT A"); INNER_JOIN("DEPARTMENT D on D.ID = P.DEPARTMENT_ID"); INNER_JOIN("COMPANY C on D.COMPANY_ID = C.ID"); WHERE("P.ID = A.ID"); WHERE("P.FIRST_NAME like ?"); OR(); WHERE("P.LAST_NAME like ?"); GROUP_BY("P.ID"); HAVING("P.LAST_NAME like ?"); OR(); HAVING("P.FIRST_NAME like ?"); ORDER_BY("P.ID"); ORDER_BY("P.FULL_NAME"); }}; } private static String example2(final String id, final String firstName, final String lastName) { return new SQL() {{ SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME"); FROM("PERSON P"); if (id != null) { WHERE("P.ID like #id#"); } if (firstName != null) { WHERE("P.FIRST_NAME like #firstName#"); } if (lastName != null) { WHERE("P.LAST_NAME like #lastName#"); } ORDER_BY("P.LAST_NAME"); }}.toString(); } @Test public void variableLengthArgumentOnSelect() { final String sql = new SQL() {{ SELECT("P.ID", "P.USERNAME"); }}.toString(); assertEquals("SELECT P.ID, P.USERNAME", sql); } @Test public void variableLengthArgumentOnSelectDistinct() { final String sql = new SQL() {{ SELECT_DISTINCT("P.ID", "P.USERNAME"); }}.toString(); assertEquals("SELECT DISTINCT P.ID, P.USERNAME", sql); } @Test public void variableLengthArgumentOnFrom() { final String sql = new SQL() {{ SELECT().FROM("TABLE_A a", "TABLE_B b"); }}.toString(); assertEquals("FROM TABLE_A a, TABLE_B b", sql); } @Test public void variableLengthArgumentOnJoin() { final String sql = new SQL() {{ SELECT().JOIN("TABLE_A b ON b.id = a.id", "TABLE_C c ON c.id = a.id"); }}.toString(); assertEquals("JOIN TABLE_A b ON b.id = a.id\n" + "JOIN TABLE_C c ON c.id = a.id", sql); } @Test public void variableLengthArgumentOnInnerJoin() { final String sql = new SQL() {{ SELECT().INNER_JOIN("TABLE_A b ON b.id = a.id", "TABLE_C c ON c.id = a.id"); }}.toString(); assertEquals("INNER JOIN TABLE_A b ON b.id = a.id\n" + "INNER JOIN TABLE_C c ON c.id = a.id", sql); } @Test public void variableLengthArgumentOnOuterJoin() { final String sql = new SQL() {{ SELECT().OUTER_JOIN("TABLE_A b ON b.id = a.id", "TABLE_C c ON c.id = a.id"); }}.toString(); assertEquals("OUTER JOIN TABLE_A b ON b.id = a.id\n" + "OUTER JOIN TABLE_C c ON c.id = a.id", sql); } @Test public void variableLengthArgumentOnLeftOuterJoin() { final String sql = new SQL() {{ SELECT().LEFT_OUTER_JOIN("TABLE_A b ON b.id = a.id", "TABLE_C c ON c.id = a.id"); }}.toString(); assertEquals("LEFT OUTER JOIN TABLE_A b ON b.id = a.id\n" + "LEFT OUTER JOIN TABLE_C c ON c.id = a.id", sql); } @Test public void variableLengthArgumentOnRightOuterJoin() { final String sql = new SQL() {{ SELECT().RIGHT_OUTER_JOIN("TABLE_A b ON b.id = a.id", "TABLE_C c ON c.id = a.id"); }}.toString(); assertEquals("RIGHT OUTER JOIN TABLE_A b ON b.id = a.id\n" + "RIGHT OUTER JOIN TABLE_C c ON c.id = a.id", sql); } @Test public void variableLengthArgumentOnWhere() { final String sql = new SQL() {{ SELECT().WHERE("a = #{a}", "b = #{b}"); }}.toString(); assertEquals("WHERE (a = #{a} AND b = #{b})", sql); } @Test public void variableLengthArgumentOnGroupBy() { final String sql = new SQL() {{ SELECT().GROUP_BY("a", "b"); }}.toString(); assertEquals("GROUP BY a, b", sql); } @Test public void variableLengthArgumentOnHaving() { final String sql = new SQL() {{ SELECT().HAVING("a = #{a}", "b = #{b}"); }}.toString(); assertEquals("HAVING (a = #{a} AND b = #{b})", sql); } @Test public void variableLengthArgumentOnOrderBy() { final String sql = new SQL() {{ SELECT().ORDER_BY("a", "b"); }}.toString(); assertEquals("ORDER BY a, b", sql); } @Test public void variableLengthArgumentOnSet() { final String sql = new SQL() {{ UPDATE("TABLE_A").SET("a = #{a}", "b = #{b}"); }}.toString(); assertEquals("UPDATE TABLE_A\n" + "SET a = #{a}, b = #{b}", sql); } @Test public void variableLengthArgumentOnIntoColumnsAndValues() { final String sql = new SQL() {{ INSERT_INTO("TABLE_A").INTO_COLUMNS("a", "b").INTO_VALUES("#{a}", "#{b}"); }}.toString(); System.out.println(sql); assertEquals("INSERT INTO TABLE_A\n (a, b)\nVALUES (#{a}, #{b})", sql); } @Test public void fixFor903UpdateJoins() { final SQL sql = new SQL().UPDATE("table1 a").INNER_JOIN("table2 b USING (ID)").SET("a.value = b.value"); assertThat(sql.toString()).isEqualTo("UPDATE table1 a\nINNER JOIN table2 b USING (ID)\nSET a.value = b.value"); } }