SQL介紹
SQL(org.apache.ibatis.jdbc.SQL) 是mybatis 自帶 sql 構造對象。
表1:SQL的方法及作用介紹
方法 | 作用 |
---|---|
SELECT(String) SELECT(String...) |
開始一個 SELECT 字句或將內容追加到 SELECT 字句。方法可以被多次調用,參數也會添加到 SELECT 字句。參數通常是使用 "," 分割的列名或列的別名列表,也可以是數據庫驅動程序接收的任意關鍵字。 |
SELECT_DISTINCT(String) SELECT_DISTINCT(String...) |
開始一個 SELECT 字句或將內容追加到 SELECT 字句。同時可以追加 DISTINCT 關鍵字到SELECT 語句中。方法可以被多次調用,參數也會添加到 SELECT 字句。參數通常是使用 ”,“ 分割的列名或列的別名列表,也可以是數據庫驅動程序接收的任意關鍵字。 |
FROM(String) FROM(String...) |
開始或追加 FROM 字句。方法可以被多次調用,參數會添加到 FROM 字句。參數通常是表名或別名,也可以是數據庫驅動程序接收的任意關鍵字。 |
JOIN(String) JOIN(String...) INNER_JOIN(String) INNER_JOIN(String...) LEFT_OUTER_JOIN(String) LEFT_OUTER_JOIN(String...) RIGHT_OUTER_JOIN(String) RIGHT_OUTER_JOIN(String...) |
根據不同的方法添加到對應類型的 JOIN 字句, 例如 INNER_JOIN() 方法添加 INNER JOIN 字句, LEFT_OUTER_JOIN()方法增加 LEFT OUTER JOIN 字句。參數可以包含又列名和 JOIN ON 條件組合成的標准 JOIN。 |
WHERE(String) WHERE(String...) |
追加新的 WHERE 字句條件,並通過 AND 關鍵字連接。方法可以多次被調用,每次都由 AND 來連接新的條件。使用 OR() 方法可以追加 OR 關鍵字。 |
OR() | 使用 OR 來分割當前的 WHERE 或 HAVING 字句條件。可以被多次調用,但在同一行中,多次調用,可能會生成錯誤的 SQL 語句。 |
AND() | 使用 AND 來分割當前的 WHERE 或 HAVING 字句條件。可以被多次調用,但在同一行中,多次調用,可能會生成錯誤的 SQL 語句。 這個方法使用比較少,因為 WHERE() 和 HAVING() 方法都會自動追加 AND,只有必要時才會額外調用 AND() 方法。 |
GROUP_BY(String) GROUP_BY(String...) |
追加新的 GROUP BY 字句,通過 "," 連接。方法可以被多次調用,每次都會使用 "," 連接新的條件。 |
HAVING(String) HAVING(String...) |
追加新的 HAVING 字句條件。由 AND 關鍵字連接。方法可以被多次調用,每次都由 AND 連接新的條件。使用 OR() 方法可以追加 OR 關鍵字。 |
ORDER_BY(String) ORDER_BY(String...) |
追加新的 ORDER BY 字句元素,由 "," 連接。可以多次被調用,每次都由 "," 連接新的條件。 |
DELETE_FROM(String) | 開始一個 DELETE 語句並指定表名。通常它后面都會跟着 WHERE 語句。 |
INSERT_INTO(String) | 開始一個 INSERT 語句並指定表名,后面都會跟着一個或者多個VALUES(),或 INTO_COLUMNS()和 INTO_VALUES()。 |
SET(String) SET(String...) |
針對 UPDATE 語句,追加 SET 字句。 |
UPDATE(String) | 開始一個 UPDATE 語句並制定需要更新的表名。后面都會跟着一個或者多個 SET() 方法,通常會有一個或多個 WHERE()方法。 |
VALUES(String, String) | 追加 INSERT 語句中,第一個參數是要追加的列名,第二個參數則是列的值。 |
INTO_COLUMNS(String...) | 追加列到 INSERT 語句中,必須和 INTO_VALUES() 聯合使用。 |
INTO_VALUES(String...) | 追加列的值到 INSERT 語句中,必須和 INTO_COLUMNS() 聯合使用。 |
續表(3.5.2版本之后)
方法 | 作用 |
---|---|
LIMIT(String) LIMIT(int) |
追加 LIMIT 語句。 該方法與 SELECT(),UPDATE(),DELETE()一起使用時有效。並且該方法設計在使用 SELECT() 時與 OFFSET() 一起使用。 |
OFFSET(String) OFFSET(long) |
追加 OFFSET 語句. 該方法與 SELECT() 一起使用時有效. 並且該方法設計在使用 SELECT() 時與 LIMIT() 一起使用。 |
OFFSET_ROWS(String) OFFSET_ROWS(long) |
追加 OFFSET n ROWS 語句. 該方法與 SELECT() 一起使用時有效。 該方法設計與 FETCH_FIRST_ROWS_ONLY() 一起使用。 |
FETCH_FIRST_ROWS_ONLY(String) FETCH_FIRST_ROWS_ONLY(int) |
追加 FETCH FIRST n ROWS ONLY 語句. 該方法與 SELECT() 一起使用時有效。 該方法設計與 OFFSET_ROWS() 一起使用。 |
ADD_ROW() | 為批量追加增加新行。 |
SQL示例
查詢
// 普通查詢
String orgSql = "SELECT P.PERSON_ID, P.PERSON_NAME, P.NICK_NAME, "
+ "P.TITLE, P.AGE, C.COMPANY_NAME, C.CITY\n"
+ "FROM PERSON P\n"
+ "LEFT OUTER JOIN COMPANY C ON C.COMPANY_ID = P.COMPANY_ID\n"
+ "WHERE (P.AGE > ? AND C.CITY = ?) \n"
+ "OR (P.AGE < ?)\n"
+ "ORDER BY C.CITY, C.COMPANY_NAME";
String newSql = new SQL()
.SELECT("P.PERSON_ID", "P.PERSON_NAME", "P.NICK_NAME")
.SELECT("P.TITLE", "P.AGE", "C.COMPANY_NAME", "C.CITY")
.FROM("PERSON P")
.LEFT_OUTER_JOIN("COMPANY C ON C.COMPANY_ID = P.COMPANY_ID")
.WHERE("P.AGE > ?")
.WHERE("C.CITY = ?")
.OR()
.WHERE("P.AGE < ?")
.ORDER_BY("C.CITY", "C.COMPANY_NAME")
.toString();
Assert.assertEquals(orgSql, newSql);
// 聚合函數
orgSql = "SELECT MAX(P.AGE) MAX_AGE, C.COMPANY_NAME, C.CITY\n"
+ "FROM PERSON P\n"
+ "LEFT OUTER JOIN COMPANY C ON C.COMPANY_ID = P.COMPANY_ID\n"
+ "WHERE (C.CITY IN(?, ?))\n"
+ "GROUP BY C.COMPANY_NAME, C.CITY\n"
+ "HAVING (MAX_AGE > ? AND C.CITY = ?) \n"
+ "OR (MAX_AGE < ?)\n"
+ "ORDER BY C.CITY, C.COMPANY_NAME";
newSql = new SQL()
.SELECT("MAX(P.AGE) MAX_AGE")
.SELECT("C.COMPANY_NAME", "C.CITY")
.FROM("PERSON P")
.LEFT_OUTER_JOIN("COMPANY C ON C.COMPANY_ID = P.COMPANY_ID")
.WHERE("C.CITY IN(?, ?)")
.GROUP_BY("C.COMPANY_NAME", "C.CITY")
.HAVING("MAX_AGE > ?")
.HAVING("C.CITY = ?")
.OR()
.HAVING("MAX_AGE < ?")
.ORDER_BY("C.CITY", "C.COMPANY_NAME")
.toString();
Assert.assertEquals(orgSql, newSql);
查詢(offset row)
String orgSql = "SELECT P.PERSON_ID, P.PERSON_NAME, P.NICK_NAME, "
+ "P.TITLE, P.AGE, C.COMPANY_NAME, C.CITY\n"
+ "FROM PERSON P\n"
+ "LEFT OUTER JOIN COMPANY C ON C.COMPANY_ID = P.COMPANY_ID\n"
+ "WHERE (P.AGE > ? AND C.CITY = ?) \n"
+ "OR (P.AGE < ?)\n"
+ "ORDER BY C.CITY, C.COMPANY_NAME OFFSET 10 ROWS FETCH FIRST 1 ROWS ONLY";
String newSql = new SQL()
.SELECT("P.PERSON_ID", "P.PERSON_NAME", "P.NICK_NAME")
.SELECT("P.TITLE", "P.AGE", "C.COMPANY_NAME", "C.CITY")
.FROM("PERSON P")
.LEFT_OUTER_JOIN("COMPANY C ON C.COMPANY_ID = P.COMPANY_ID")
.WHERE("P.AGE > ?")
.WHERE("C.CITY = ?")
.OR()
.WHERE("P.AGE < ?")
.ORDER_BY("C.CITY", "C.COMPANY_NAME")
.OFFSET_ROWS(10)
.FETCH_FIRST_ROWS_ONLY(1)
.ADD_ROW()
.toString();
Assert.assertEquals(orgSql, newSql);
動態查詢
String orgSql = "SELECT P.PERSON_ID, P.PERSON_NAME, P.NICK_NAME, "
+ "P.TITLE, P.AGE, C.COMPANY_NAME, C.CITY\n"
+ "FROM PERSON P\n"
+ "LEFT OUTER JOIN COMPANY C ON C.COMPANY_ID = P.COMPANY_ID\n"
+ "WHERE (P.AGE > #{age} AND C.CITY = #{city})\n"
+ "ORDER BY C.CITY, C.COMPANY_NAME";
String newSql = new SQL()
.SELECT("P.PERSON_ID", "P.PERSON_NAME", "P.NICK_NAME")
.SELECT("P.TITLE", "P.AGE", "C.COMPANY_NAME", "C.CITY")
.FROM("PERSON P")
.LEFT_OUTER_JOIN("COMPANY C ON C.COMPANY_ID = P.COMPANY_ID")
.WHERE("P.AGE > #{age}")
.WHERE("C.CITY = #{city}")
.ORDER_BY("C.CITY", "C.COMPANY_NAME")
.toString();
Assert.assertEquals(orgSql, newSql);
動態插入
String orgSql = "INSERT INTO PERSON\n"
+ " (PERSON_ID, PERSON_NAME, NICK_NAME, TITLE, AGE, COMPANY_ID)\n"
+ "VALUES (#{personId}, #{personName}, #{nickName}, #{title}, #{age}, #{companyId})";
String newSql = new SQL()
.INSERT_INTO("PERSON")
.INTO_COLUMNS("PERSON_ID", "PERSON_NAME", "NICK_NAME", "TITLE", "AGE", "COMPANY_ID")
.INTO_VALUES("#{personId}", "#{personName}", "#{nickName}", "#{title}", "#{age}", "#{companyId}")
.toString();
Assert.assertEquals(orgSql, newSql);
批量插入(多行)
String orgSql = "INSERT INTO PERSON\n"
+ " (PERSON_ID, PERSON_NAME, NICK_NAME, TITLE, AGE, COMPANY_ID)\n"
+ "VALUES (?, ?, ?, ?, ?, ?)\n, (?, ?, ?, ?, ?, ?)";
String newSql = new SQL()
.INSERT_INTO("PERSON")
.INTO_COLUMNS("PERSON_ID", "PERSON_NAME", "NICK_NAME", "TITLE", "AGE", "COMPANY_ID")
.INTO_VALUES("?", "?", "?", "?", "?", "?")
.ADD_ROW()
.INTO_VALUES("?", "?", "?", "?", "?", "?")
.toString();
Assert.assertEquals(orgSql, newSql);
動態刪除
String orgSql = "DELETE FROM PERSON\n"
+ "WHERE (PERSON_ID = #{personId})";
String newSql = new SQL()
.DELETE_FROM("PERSON")
.WHERE("PERSON_ID = #{personId}")
.toString();
Assert.assertEquals(orgSql, newSql);
動態更新
String orgSql = "UPDATE PERSON\n"
+ "SET NICK_NAME = #{nickName}\n"
+ "WHERE (PERSON_ID = #{personId})";
String newSql = new SQL()
.UPDATE("PERSON")
.SET("NICK_NAME = #{nickName}")
.WHERE("PERSON_ID = #{personId}").toString();
Assert.assertEquals(orgSql, newSql);
公眾號
喜歡我的文章,請關注公眾號