JSqlParser基本应用文档
该文档旨在快速了解JSqlParser的基本结构设计和JSqlParser中的select部分的应用(alter、delete、insert等其他部分视具体情况而定)。主要从普通查询(select)、子查询(subselect)、连接查询(union select)三个方面来了解JSqlParser的直接调用和SelectObject(已封装)的调用两个方面来简单构造。在构建sql之前先了解下JSqlParser的基本构造。
JSqlParser组成部分:
selectBody结构:
基本应用
基础数据:
直销客户业务量汇总:KB_ZX_CUST_PROD_SUM
字段 |
名称 |
month |
统计月份 |
VIP_TYPE |
客户类型 |
ZX_CUST_CODE |
直销客户编码 |
ZX_CUST_NAME |
直销客户名称 |
CUST_SUBST_NAME |
客户局向 |
SUM_TOTAL |
全部总用户数 |
生成表别名:
selectObject.generateTableAlias(key, tableName, aliasName);
等价于
selectObject.generateTableAlias(key, tableName, aliasName,false);
获取表别名:
selectObject.getTableAlias(key);
获取表:
selectObject.getTableByKey(key);
构造查询语句:
普通查询
条件设置 |
|
统计月份 |
12 |
客户类型 |
高值商客 |
直销客户编码 |
12 |
输出字段 |
|
统计月份 |
不使用函数 |
全部总用户数 |
不使用函数 |
目的SQL:
SELECT T_A.month, T_A.SUM_TOTAL FROM KB_ZX_CUST_PROD_SUM T_A WHERE T_A.MONTH = '201512' AND ( T_A.month = '12') AND ( T_A.VIP_TYPE = '高值商客') AND ( T_A.ZX_CUST_CODE = '12')
Demo:
package com.chinatmg.ecpp.helper;
import java.util.ArrayList;
import java.util.List;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.Alias;
import net.sf.jsqlparser.expression.BinaryExpression;
import net.sf.jsqlparser.expression.CastExpression;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.Function;
import net.sf.jsqlparser.expression.LongValue;
import net.sf.jsqlparser.expression.Parenthesis;
import net.sf.jsqlparser.expression.StringValue;
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.create.table.ColDataType;
import net.sf.jsqlparser.statement.select.AllColumns;
import net.sf.jsqlparser.statement.select.Limit;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.SelectExpressionItem;
import org.apache.commons.lang.StringUtils;
public class SimpleSelectDemo {
public static void main(String[] args){
SimpleSelectDemo demo = new SimpleSelectDemo();
String table= "KB_ZX_CUST_PROD_SUM";
String[][] condition ={ {"MONTH","12"},{"VIP_TYPE","高值商客"},{"ZX_CUST_CODE","12"}};
String[][] outColumn = { {"MONTH"},{"SUM_TOTAL"}};
String limit = "122";
demo.selectObjectDemo(table, null,condition, outColumn,null,limit);
demo.jsqlDemo(table, null,condition, outColumn,null,limit);
}
//SelectObject使用
SelectObject selectObjectDemo(String table,String aliasName,String[][] condition,String[][] outColumn,String[][] groubyColumn,String limit){
if(aliasName==null){
aliasName="T_A";
}
SelectObject selectObject = new SelectObject();
//生成表别名,默认userAs为true
selectObject.generateTableAlias(table, table, aliasName);
//设置查询的主体
selectObject.setFromItem(selectObject.getTableByKey(table));
//加入查询字段
if(outColumn!=null){
for(String[] out:outColumn){
switch (out.length){
case 1:
selectObject.addSelectItem(aliasName+"."+out[0]);
break;
case 2:
selectObject.addSelectItem(out[1]+"("+aliasName+"."+out[0]+")");
break;
case 4:
selectObject.addSelectItem(out[1]+"("+out[2]+"("+aliasName+"."+out[0]+" as "+out[3]+"))");
break;
}
}
}else{
selectObject.addSelectItem("(*)");
}
//加入查询条件
if(condition!=null){
for(String[] cond:condition){
try {
selectObject.addWhereExpression("("+aliasName+"."+cond[0]+"='"+cond[1]+"')");
} catch (JSQLParserException e) {
e.printStackTrace();
}
}
}
//添加group by
if(groubyColumn!=null){
for(String[] group:groubyColumn){
selectObject.addGroupByExpression(aliasName+"."+group[0]);
}
}
//设置Limit
if(StringUtils.isNotEmpty(limit)){
selectObject.setLimit(limit);
}
System.out.println("selectObject:"+selectObject);
return selectObject;
}
//JSqlParser直接调用
PlainSelect jsqlDemo(String ta,String aliasName,String[][] condition,String[][] outColumn,String[][] groubyColumn,String rowCount){
if(aliasName==null){
aliasName="T_A";
}
PlainSelect plainSelect = new PlainSelect();
Table table = new Table(ta);
Alias alias = new Alias(aliasName);
table.setAlias(alias);
//设置查询的主体
plainSelect.setFromItem(table);
//加入查询字段
if(outColumn!=null){
SelectExpressionItem selectItem = null;
Expression selectExpression = null;
Function func = null;
List<Expression> funcExpression = null;
CastExpression castExpression = null;
ColDataType colDataType = null;
for(String[] out:outColumn){
selectExpression = null;
selectItem = new SelectExpressionItem();
switch (out.length){
case 1:
selectExpression = new Column(aliasName+"."+out[0]);
break;
case 2:
func = new Function();
func.setName(out[1]);
funcExpression = new ArrayList<Expression>();
funcExpression.add(new Column(aliasName+"."+out[0]));
func.setParameters(new ExpressionList(funcExpression));
selectExpression = func;
break;
case 4:
//此处以cast 为例
func = new Function();
func.setName(out[1]);
funcExpression = new ArrayList<Expression>();
castExpression = new CastExpression();
castExpression.setLeftExpression(new Column(aliasName+"."+out[0]));
colDataType = new ColDataType();
colDataType.setDataType(out[3]);
castExpression.setType(colDataType);
castExpression.setUseCastKeyword(true);
funcExpression.add(castExpression);
func.setParameters(new ExpressionList(funcExpression));
selectExpression = func;
break;
}
selectItem.setExpression(selectExpression);
plainSelect.addSelectItems(selectItem);
}
}else{
plainSelect.addSelectItems(new AllColumns());
}
//加入查询条件
if(condition!=null){
BinaryExpression whereExpression =null;
for(String[] cond:condition){
whereExpression = new EqualsTo();
whereExpression.setLeftExpression(new Column(aliasName+"."+cond[0]));
whereExpression.setRightExpression(new StringValue(cond[1]));
if(plainSelect.getWhere()==null){
plainSelect.setWhere(new Parenthesis(whereExpression));
}else{
plainSelect.setWhere(new AndExpression(plainSelect.getWhere(),new Parenthesis(whereExpression)));
}
}
}
//添加group by
if(groubyColumn!=null){
for(String[] group:groubyColumn){
plainSelect.addGroupByColumnReference(new Column(aliasName+"."+group[0]));
}
}
//设置Limit
if(StringUtils.isNotEmpty(rowCount)){
Limit limit = new Limit();
limit.setRowCount(new LongValue(rowCount));
plainSelect.setLimit(limit);
}
System.out.println("JSqlDemo:"+plainSelect);
return plainSelect;
}
}
子查询:基于普通查询
条件设置 |
|
统计月份 |
12 |
客户类型 |
高值商客 |
直销客户编码 |
12 |
分组维度 |
|
直销客户名称 |
|
客户局向 |
|
输出字段 |
|
统计月份 |
统计 |
全部总用户数 |
求和 |
目的SQL:
select COUNT(a.month), SUM(CAST(a.SUM_TOTAL as double)), a.ZX_CUST_NAME, a.CUST_SUBST_NAME from (SELECT T_A.month, T_A.SUM_TOTAL, T_A.ZX_CUST_NAME, T_A.CUST_SUBST_NAME FROM KB_ZX_CUST_PROD_SUM T_A WHERE ( T_A.month = '12') AND ( T_A.VIP_TYPE = '高值商客') AND ( T_A.ZX_CUST_CODE = '12') AND ( ( T_A.ZX_CUST_CODE = '3232') AND ( T_A.CUST_SUBST_NAME = '23') ) ) a group by a.ZX_CUST_NAME, a.CUST_SUBST_NAME limit 122
Demo:
package com.chinatmg.ecpp.helper;
import net.sf.jsqlparser.expression.Alias;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.SubSelect;
public class SimpleSubselectDemo {
public static void main(String[] args){
String table= "KB_ZX_CUST_PROD_SUM";
String[][] condition ={ {"MONTH","12"},{"VIP_TYPE","高值商客"},{"ZX_CUST_CODE","12"}};
String[][] outColumn = { {"MONTH","COUNT"},{"SUM_TOTAL","SUM","CAST","double"},{"ZX_CUST_NAME"},{"CUST_SUBST_NAME"}};
String[][] groubyColumn = { {"MONTH"},{"SUM_TOTAL"}};
//子查询输出的字段
String[][] suboutColumn = { {"MONTH"},{"SUM_TOTAL"},{"ZX_CUST_NAME"},{"CUST_SUBST_NAME"}};
String limit = "122";
SimpleSubselectDemo demo= new SimpleSubselectDemo();
demo.suselectObjectDemo(table, condition, outColumn, groubyColumn, suboutColumn,limit);
demo.jsqlDemo(table, condition, outColumn, groubyColumn, suboutColumn,limit);
}
//SelectObject使用
SelectObject suselectObjectDemo(String table,String[][] condition,String[][] outColumn,String[][] groubyColumn,String[][] suboutColumn,String limit){
SimpleSelectDemo demo = new SimpleSelectDemo();
SelectObject selectObject = demo.selectObjectDemo("a", "a", null, outColumn, groubyColumn, limit);
SelectObject subselectObject = demo.selectObjectDemo(table,null, condition, suboutColumn,null,null);
selectObject.setSubselectObject(subselectObject, "a", false);;
System.out.println("subselect:"+selectObject);
return selectObject;
}
////JSqlParser直接调用
PlainSelect jsqlDemo(String ta,String[][] condition,String[][] outColumn,String[][] groubyColumn,String[][] s