new feature : sql builder

This commit is contained in:
wenshao
2015-06-07 22:36:33 +08:00
parent 7575d5f1ff
commit 3a7d001b93
32 changed files with 921 additions and 125 deletions
@@ -0,0 +1,8 @@
package com.alibaba.druid.sql.builder.impl;
import com.alibaba.druid.sql.builder.SQLBuilder;
public class SQLBuilderImpl implements SQLBuilder {
}
@@ -0,0 +1,94 @@
package com.alibaba.druid.sql.builder.impl;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.builder.SQLDeleteBuilder;
public class SQLDeleteBuilderImpl implements SQLDeleteBuilder {
private SQLDeleteStatement stmt;
private String dbType;
public SQLDeleteBuilderImpl(String dbType){
this.dbType = dbType;
}
public SQLDeleteBuilderImpl(SQLDeleteStatement stmt, String dbType){
this.stmt = stmt;
this.dbType = dbType;
}
@Override
public SQLDeleteBuilderImpl limit(int rowCount) {
throw new UnsupportedOperationException();
}
@Override
public SQLDeleteBuilderImpl limit(int rowCount, int offset) {
throw new UnsupportedOperationException();
}
@Override
public SQLDeleteBuilder from(String table) {
return from(table, null);
}
@Override
public SQLDeleteBuilder from(String table, String alias) {
SQLDeleteStatement delete = getSQLDeleteStatement();
SQLExprTableSource from = new SQLExprTableSource(new SQLIdentifierExpr(table), alias);
delete.setTableSource(from);
return this;
}
@Override
public SQLDeleteBuilder where(String expr) {
SQLDeleteStatement delete = getSQLDeleteStatement();
SQLExpr exprObj = SQLUtils.toSQLExpr(expr, dbType);
delete.setWhere(exprObj);
return this;
}
@Override
public SQLDeleteBuilder whereAnd(String expr) {
SQLDeleteStatement delete = getSQLDeleteStatement();
SQLExpr exprObj = SQLUtils.toSQLExpr(expr, dbType);
SQLExpr newCondition = SQLUtils.buildCondition(SQLBinaryOperator.BooleanAnd, exprObj, false, delete.getWhere());
delete.setWhere(newCondition);
return this;
}
@Override
public SQLDeleteBuilder whereOr(String expr) {
SQLDeleteStatement delete = getSQLDeleteStatement();
SQLExpr exprObj = SQLUtils.toSQLExpr(expr, dbType);
SQLExpr newCondition = SQLUtils.buildCondition(SQLBinaryOperator.BooleanOr, exprObj, false, delete.getWhere());
delete.setWhere(newCondition);
return this;
}
public SQLDeleteStatement getSQLDeleteStatement() {
if (stmt == null) {
stmt = createSQLDeleteStatement();
}
return stmt;
}
public SQLDeleteStatement createSQLDeleteStatement() {
return new SQLDeleteStatement();
}
public String toString() {
return SQLUtils.toSQLString(stmt, dbType);
}
}
@@ -0,0 +1,217 @@
package com.alibaba.druid.sql.builder.impl;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLOrderBy;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.ast.statement.SQLSelectGroupByClause;
import com.alibaba.druid.sql.ast.statement.SQLSelectItem;
import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem;
import com.alibaba.druid.sql.ast.statement.SQLSelectQuery;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
import com.alibaba.druid.sql.builder.SQLSelectBuilder;
public class SQLSelectBuilderImpl implements SQLSelectBuilder {
private SQLSelectStatement stmt;
private String dbType;
public SQLSelectBuilderImpl(String dbType){
this(new SQLSelectStatement(), dbType);
}
public SQLSelectBuilderImpl(SQLSelectStatement stmt, String dbType){
this.stmt = stmt;
this.dbType = dbType;
}
public SQLSelect getSQLSelect() {
if (stmt.getSelect() == null) {
stmt.setSelect(createSelect());
}
return stmt.getSelect();
}
@Override
public SQLSelectStatement getSQLSelectStatement() {
return stmt;
}
public SQLSelectBuilderImpl select(String... columns) {
SQLSelectQueryBlock queryBlock = getQueryBlock();
for (String column : columns) {
SQLSelectItem selectItem = SQLUtils.toSelectItem(column, dbType);
queryBlock.addSelectItem(selectItem);
}
return this;
}
@Override
public SQLSelectBuilderImpl selectWithAlias(String column, String alias) {
SQLSelectQueryBlock queryBlock = getQueryBlock();
SQLExpr columnExpr = SQLUtils.toSQLExpr(column, dbType);
SQLSelectItem selectItem = new SQLSelectItem(columnExpr, alias);
queryBlock.addSelectItem(selectItem);
return this;
}
@Override
public SQLSelectBuilderImpl from(String table) {
return from(table, null);
}
@Override
public SQLSelectBuilderImpl from(String table, String alias) {
SQLSelectQueryBlock queryBlock = getQueryBlock();
SQLExprTableSource from = new SQLExprTableSource(new SQLIdentifierExpr(table), alias);
queryBlock.setFrom(from);
return this;
}
@Override
public SQLSelectBuilderImpl orderBy(String... columns) {
SQLSelect select = this.getSQLSelect();
SQLOrderBy orderBy = select.getOrderBy();
if (orderBy == null) {
orderBy = createOrderBy();
select.setOrderBy(orderBy);
}
for (String column : columns) {
SQLSelectOrderByItem orderByItem = SQLUtils.toOrderByItem(column, dbType);
orderBy.addItem(orderByItem);
}
return this;
}
@Override
public SQLSelectBuilderImpl groupBy(String expr) {
SQLSelectQueryBlock queryBlock = getQueryBlock();
SQLSelectGroupByClause groupBy = queryBlock.getGroupBy();
if (groupBy == null) {
groupBy = createGroupBy();
queryBlock.setGroupBy(groupBy);
}
SQLExpr exprObj = SQLUtils.toSQLExpr(expr, dbType);
groupBy.addItem(exprObj);
return this;
}
@Override
public SQLSelectBuilderImpl having(String expr) {
SQLSelectQueryBlock queryBlock = getQueryBlock();
SQLSelectGroupByClause groupBy = queryBlock.getGroupBy();
if (groupBy == null) {
groupBy = createGroupBy();
queryBlock.setGroupBy(groupBy);
}
SQLExpr exprObj = SQLUtils.toSQLExpr(expr, dbType);
groupBy.setHaving(exprObj);
return this;
}
@Override
public SQLSelectBuilderImpl into(String expr) {
SQLSelectQueryBlock queryBlock = getQueryBlock();
SQLExpr exprObj = SQLUtils.toSQLExpr(expr, dbType);
queryBlock.setInto(exprObj);
return this;
}
@Override
public SQLSelectBuilderImpl where(String expr) {
SQLSelectQueryBlock queryBlock = getQueryBlock();
SQLExpr exprObj = SQLUtils.toSQLExpr(expr, dbType);
queryBlock.setWhere(exprObj);
return this;
}
@Override
public SQLSelectBuilderImpl whereAnd(String expr) {
SQLSelectQueryBlock queryBlock = getQueryBlock();
SQLExpr exprObj = SQLUtils.toSQLExpr(expr, dbType);
SQLExpr newCondition = SQLUtils.buildCondition(SQLBinaryOperator.BooleanAnd, exprObj, false, queryBlock.getWhere());
queryBlock.setWhere(newCondition);
return this;
}
@Override
public SQLSelectBuilderImpl whereOr(String expr) {
SQLSelectQueryBlock queryBlock = getQueryBlock();
SQLExpr exprObj = SQLUtils.toSQLExpr(expr, dbType);
SQLExpr newCondition = SQLUtils.buildCondition(SQLBinaryOperator.BooleanOr, exprObj, false, queryBlock.getWhere());
queryBlock.setWhere(newCondition);
return this;
}
@Override
public SQLSelectBuilderImpl limit(int rowCount) {
throw new UnsupportedOperationException();
}
@Override
public SQLSelectBuilderImpl limit(int rowCount, int offset) {
throw new UnsupportedOperationException();
}
protected SQLSelectQueryBlock getQueryBlock() {
SQLSelect select = getSQLSelect();
SQLSelectQuery query = select.getQuery();
if (query == null) {
query = createSelectQueryBlock();
select.setQuery(query);
}
if (!(query instanceof SQLSelectQueryBlock)) {
throw new IllegalStateException("not support from, class : " + query.getClass().getName());
}
SQLSelectQueryBlock queryBlock = (SQLSelectQueryBlock) query;
return queryBlock;
}
protected SQLSelect createSelect() {
return new SQLSelect();
}
protected SQLSelectQuery createSelectQueryBlock() {
return new SQLSelectQueryBlock();
}
protected SQLOrderBy createOrderBy() {
return new SQLOrderBy();
}
protected SQLSelectGroupByClause createGroupBy() {
return new SQLSelectGroupByClause();
}
public String toString() {
return SQLUtils.toSQLString(stmt, dbType);
}
}
@@ -0,0 +1,105 @@
package com.alibaba.druid.sql.builder.impl;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem;
import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement;
import com.alibaba.druid.sql.builder.SQLUpdateBuilder;
public class SQLUpdateBuilderImpl implements SQLUpdateBuilder {
private SQLUpdateStatement stmt;
private String dbType;
public SQLUpdateBuilderImpl(String dbType){
this.dbType = dbType;
}
public SQLUpdateBuilderImpl(SQLUpdateStatement stmt, String dbType){
this.stmt = stmt;
this.dbType = dbType;
}
@Override
public SQLUpdateBuilderImpl limit(int rowCount) {
throw new UnsupportedOperationException();
}
@Override
public SQLUpdateBuilderImpl limit(int rowCount, int offset) {
throw new UnsupportedOperationException();
}
@Override
public SQLUpdateBuilderImpl from(String table) {
return from(table, null);
}
@Override
public SQLUpdateBuilderImpl from(String table, String alias) {
SQLUpdateStatement update = getSQLUpdateStatement();
SQLExprTableSource from = new SQLExprTableSource(new SQLIdentifierExpr(table), alias);
update.setTableSource(from);
return this;
}
@Override
public SQLUpdateBuilderImpl where(String expr) {
SQLUpdateStatement update = getSQLUpdateStatement();
SQLExpr exprObj = SQLUtils.toSQLExpr(expr, dbType);
update.setWhere(exprObj);
return this;
}
@Override
public SQLUpdateBuilderImpl whereAnd(String expr) {
SQLUpdateStatement update = getSQLUpdateStatement();
SQLExpr exprObj = SQLUtils.toSQLExpr(expr, dbType);
SQLExpr newCondition = SQLUtils.buildCondition(SQLBinaryOperator.BooleanAnd, exprObj, false, update.getWhere());
update.setWhere(newCondition);
return this;
}
@Override
public SQLUpdateBuilderImpl whereOr(String expr) {
SQLUpdateStatement update = getSQLUpdateStatement();
SQLExpr exprObj = SQLUtils.toSQLExpr(expr, dbType);
SQLExpr newCondition = SQLUtils.buildCondition(SQLBinaryOperator.BooleanOr, exprObj, false, update.getWhere());
update.setWhere(newCondition);
return this;
}
public SQLUpdateBuilderImpl set(String... items) {
SQLUpdateStatement update = getSQLUpdateStatement();
for (String item : items) {
SQLUpdateSetItem updateSetItem = SQLUtils.toUpdateSetItem(item, dbType);
update.addItem(updateSetItem);
}
return this;
}
public SQLUpdateStatement getSQLUpdateStatement() {
if (stmt == null) {
stmt = createSQLUpdateStatement();
}
return stmt;
}
public SQLUpdateStatement createSQLUpdateStatement() {
return new SQLUpdateStatement();
}
public String toString() {
return SQLUtils.toSQLString(stmt, dbType);
}
}
@@ -0,0 +1,23 @@
package com.alibaba.druid.sql.builder.impl.dialect;
import com.alibaba.druid.sql.ast.statement.SQLSelectGroupByClause;
import com.alibaba.druid.sql.ast.statement.SQLSelectQuery;
import com.alibaba.druid.sql.builder.impl.SQLSelectBuilderImpl;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectGroupBy;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock;
import com.alibaba.druid.util.JdbcConstants;
public class MySqlSelectBuilderImpl extends SQLSelectBuilderImpl {
public MySqlSelectBuilderImpl(){
super(JdbcConstants.MYSQL);
}
protected SQLSelectQuery createSelectQueryBlock() {
return new MySqlSelectQueryBlock();
}
protected SQLSelectGroupByClause createGroupBy() {
return new MySqlSelectGroupBy();
}
}
@@ -0,0 +1,26 @@
package com.alibaba.druid.sql.builder.impl.dialect;
import com.alibaba.druid.sql.builder.impl.SQLSelectBuilderImpl;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleOrderBy;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock;
import com.alibaba.druid.util.JdbcConstants;
public class OracleSelectBuilderImpl extends SQLSelectBuilderImpl {
public OracleSelectBuilderImpl(){
super(JdbcConstants.ORACLE);
}
protected OracleSelectQueryBlock createSelectQueryBlock() {
return new OracleSelectQueryBlock();
}
protected OracleSelect createSelect() {
return new OracleSelect();
}
protected OracleOrderBy createOrderBy() {
return new OracleOrderBy();
}
}
@@ -0,0 +1,22 @@
package com.alibaba.druid.sql.builder.impl.dialect;
import com.alibaba.druid.sql.builder.impl.SQLSelectBuilderImpl;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGOrderBy;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectStatement;
import com.alibaba.druid.util.JdbcConstants;
public class PGSelectBuilderImpl extends SQLSelectBuilderImpl {
public PGSelectBuilderImpl(){
super(new PGSelectStatement(), JdbcConstants.POSTGRESQL);
}
protected PGSelectQueryBlock createSelectQueryBlock() {
return new PGSelectQueryBlock();
}
protected PGOrderBy createOrderBy() {
return new PGOrderBy();
}
}
@@ -0,0 +1,21 @@
package com.alibaba.druid.sql.builder.impl.dialect;
import com.alibaba.druid.sql.builder.impl.SQLSelectBuilderImpl;
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelect;
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock;
import com.alibaba.druid.util.JdbcConstants;
public class SQLServerSelectBuilderImpl extends SQLSelectBuilderImpl {
public SQLServerSelectBuilderImpl(){
super(JdbcConstants.SQL_SERVER);
}
protected SQLServerSelectQueryBlock createSelectQueryBlock() {
return new SQLServerSelectQueryBlock();
}
protected SQLServerSelect createSelect() {
return new SQLServerSelect();
}
}