mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
new feature : sql builder
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
+21
@@ -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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user