java构建sql语句_MyBatis的SQL语句构建器

Java程序员面对的最痛苦的事情之一就是在Java代码中嵌入SQL语句。由于SQL语句需要动态来生成,否则可以将它们放到外部文件或者存储过程中。虽然MyBatis的XML映射文件中有一个强大的动态SQL生成方案,但有时在Java代码内部创建SQL语句也是必要的。此时,MyBatis有另外一个特性可以帮到你,可以减少诸如加号、引号和嵌入条件等SQL硬拼接问题。事实上,在Java代码中来动态生成SQL代码就是一场噩梦。例如:String sql = "SELECT P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME, "

"P.LAST_NAME,P.CREATED_ON, P.UPDATED_ON " +

"FROM PERSON P, 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 AND P.FIRST_NAME like ?) " +

"OR (P.LAST_NAME like ?) " +

"GROUP BY P.ID " +

"HAVING (P.LAST_NAME like ?) " +

"OR (P.FIRST_NAME like ?) " +

"ORDER BY P.ID, P.FULL_NAME";

MyBatis 3提供了方便的工具类来帮助解决该问题。使用SQL类,简单地创建一个实例来调用方法生成SQL语句。上面示例中的问题就像重写SQL类那样:private String selectPersonSql() {

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");

}}.toString();

}

SQL类简介

这里给出一些示例:// 匿名内部类

public String deletePersonSql() {

return new SQL() {{

DELETE_FROM("PERSON");

WHERE("ID = #{id}");

}}.toString();

}

// Builder / Fluent 风格

public String insertPersonSql() {

String sql = new SQL()

.INSERT_INTO("PERSON")

.VALUES("ID, FIRST_NAME", "#{id}, #{firstName}")

.VALUES("LAST_NAME", "#{lastName}")

.toString();

return sql;

}

// 带条件的sql语句

public String selectPersonLike(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();

}

public String deletePersonSql() {

return new SQL() {{

DELETE_FROM("PERSON");

WHERE("ID = #{id}");

}}.toString();

}

public String insertPersonSql() {

return new SQL() {{

INSERT_INTO("PERSON");

VALUES("ID, FIRST_NAME", "#{id}, #{firstName}");

VALUES("LAST_NAME", "#{lastName}");

}}.toString();

}

public String updatePersonSql() {

return new SQL() {{

UPDATE("PERSON");

SET("FIRST_NAME = #{firstName}");

WHERE("ID = #{id}");

}}.toString();

}

SQL语句构建器列表

方法

描述

SELECT(String)

SELECT(String...)

开始或插入到 SELECT子句。 可以被多次调用,参数也会添加到 SELECT子句。 参数通常使用逗号分隔的列名和别名列表,但也可以是数据库驱动程序接受的任意类型。

SELECT_DISTINCT(String)

SELECT_DISTINCT(String...)

开始或插入到 SELECT子句, 也可以插入 DISTINCT关键字到生成的查询语句中。 可以被多次调用,参数也会添加到 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子句。 参数可以包含由列命和join on条件组合成标准的join。

WHERE(String)

WHERE(String...)

插入新的 WHERE子句条件, 由AND链接。可以多次被调用,每次都由AND来链接新条件。使用 OR() 来分隔OR。

OR()

使用OR来分隔当前的 WHERE子句条件。 可以被多次调用,但在一行中多次调用或生成不稳定的SQL。

AND()

使用AND来分隔当前的 WHERE子句条件。 可以被多次调用,但在一行中多次调用或生成不稳定的SQL。因为 WHERE 和 HAVING 二者都会自动链接 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子句元素, 由逗号连接。可以多次被调用,每次由逗号连接新的条件。

LIMIT(String)

LIMIT(int)

Appends a LIMIT clause. This method valid when use together with SELECT(), UPDATE() and DELETE(). And this method is designed to use together with OFFSET() when use SELECT(). (Available since 3.5.2)

OFFSET(String)

OFFSET(long)

Appends a OFFSET clause. This method valid when use together with SELECT(). And this method is designed to use together with LIMIT(). (Available since 3.5.2)

OFFSET_ROWS(String)

OFFSET_ROWS(long)

Appends a OFFSET n ROWS clause. This method valid when use together with SELECT(). And this method is designed to use together with FETCH_FIRST_ROWS_ONLY(). (Available since 3.5.2)

FETCH_FIRST_ROWS_ONLY(String)

FETCH_FIRST_ROWS_ONLY(int)

Appends a FETCH FIRST n ROWS ONLY clause. This method valid when use together with SELECT(). And this method is designed to use together with OFFSET_ROWS(). (Available since 3.5.2)

DELETE_FROM(String)

开始一个delete语句并指定需要从哪个表删除的表名。通常它后面都会跟着WHERE语句!

INSERT_INTO(String)

开始一个insert语句并指定需要插入数据的表名。后面都会跟着一个或者多个VALUES() or INTO_COLUMNS() and INTO_VALUES()。

SET(String)

SET(String...)

针对update语句,插入到"set"列表中

UPDATE(String)

开始一个update语句并指定需要更新的表明。后面都会跟着一个或者多个SET(),通常也会有一个WHERE()。

VALUES(String, String)

插入到insert语句中。第一个参数是要插入的列名,第二个参数则是该列的值。

INTO_COLUMNS(String...)

插入语句的形式是:INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)

INTO_VALUES(String...)

插入语句的形式是:INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)

ADD_ROW()

Add new row for bulk insert. (Available since 3.5.2)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值