diff --git a/pom.xml b/pom.xml index 6318853..446b885 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.codingapi simple-mybatis - 1.1.0 + 1.2.1 simple-mybatis https://github.com/codingapi/simple-mybatis simple mybatis project for Spring Boot @@ -22,12 +22,12 @@ 1.2.7 1.18.0 - 5.1.10 - 3.4.6 + 5.3.1 + 3.5.6 1.0.0.Final - 1.9.3 + 1.9.4 3.10 - 28.1-jre + 32.0.0-jre 5.6.2 diff --git a/readme.md b/readme.md index 4b0c7a9..bb97ed7 100644 --- a/readme.md +++ b/readme.md @@ -58,7 +58,7 @@ public class Demo implements ITree{ //ITree根据业务需要可不实现 int save(T t); //批量保存 - int saveAll(@Param("list") List list); + int saveAll(List list); //修改数据,修改数据只会替换非null对象 int update(T t); @@ -67,29 +67,29 @@ public class Demo implements ITree{ //ITree根据业务需要可不实现 int delete(T t); //批量删除,删除条件为Id - int deleteAll(@Param("list") List list); + int deleteAll(List list); //通过Id直接删除 - int deleteById(@Param("id") Object id); + int deleteById(Object id); //通过Id批量删除 - int deleteAllById(@Param("list") List id); + int deleteAllById(List id); ``` * `QueryMapper`提供常用的查询操作 ```java //通过Id查询 - T getById(@Param("id") Object id); + T getById(Object id); //查询属于数据 List findAll(); //通过Query查询数据 - List query(@Param("query") Query query); + List query(Query query); //通过Query查询试图数据,返回List Map对象 - List> queryMap(@Param("query") Query query); + List> queryMap(Query query); //通过Query查询试图数据,返回List Bean对象 List queryView(Class clazz, Query query); @@ -117,28 +117,6 @@ public class Demo implements ITree{ //ITree根据业务需要可不实现 log.info("treeLists:{}",treeLists); ``` -* 用户根据自己的Mapper来选择集成对应的功能接口 - -```java - @Mapper - public interface DemoMapper extends QueryMapper,IPageQuery,ITreeQuery { - - - } - - @Mapper - public interface DemoMapper extends SimpleMapper { - - - } - @Mapper - public interface DemoMapper extends CommandMapper { - - - } - -``` - * query使用说明 query 通过QueryBuilder来创建,当查询返回的是表的数据,则不需要写select语句,直接拼接where()查询条件。 @@ -146,32 +124,31 @@ query 通过QueryBuilder来创建,当查询返回的是表的数据,则不 select语句中的字段可以用下划线,也可以直接处理成小驼峰。都可以转成java bean对象。 ```java @Test - void viewList(){ - //select d.name,d.super_id from t_demo d join t_test t on t.demo_id = d.id where d.time = STR_TO_DATE('2020-04-12','%Y-$m-%d') or d.id = 31 and d.id in (1,2,3,4,5,6,7,8,9,10) and d.name like '%2%' order by d.name desc - List list = - demoMapper.queryView( - DemoView.class, - QueryBuilder.Build() - .select("select d.name,d.super_id from t_demo d join t_test t on t.demo_id = d.id ") - .where() - .date("d.time","2020-04-12") - .or() - .equal("d.id",31) - .and() - .in("d.id",1,2,3,4,5,6,7,8,9,10) - .and() - .like("d.name","2") - .orderBy("d.name desc") - .builder()); - log.info("list:{}",list); - } - - @Test - void queryList(){ - //select * from t_demo where name = '123' - List list = demoMapper.query(QueryBuilder.Build().where().equal("name","123").builder()); - log.info("list:{}",list); - } + void viewList(){ + List list = + demoMapper.queryView( + DemoView.class, + QueryBuilder.Build() + .select("select * from t_demo d left join t_refrigerator r on d.id = r.ID ") + .where() + .condition("d.id between #{small} and #{larger}", Map.of("small",1,"larger",10)) + .or() + .condition("r.state = #{state}",1) + .and() + .condition("d.id in (${ids})",1,2,3,4,5,6,7,8,9,10) + .or() + .condition("d.name like '%${name}%'","2") + .orderBy("d.id desc") + .builder()); + log.info("list:{}",list); + } + + @Test + void queryList(){ + //select * from t_demo where name = '123' + List list = demoMapper.query(QueryBuilder.Build().where().condition("name=#{name}","123").builder()); + log.info("list:{}",list); + } ``` ## 示例 diff --git a/src/main/java/com/codingapi/simplemybatis/mapper/QueryMapper.java b/src/main/java/com/codingapi/simplemybatis/mapper/QueryMapper.java index 2fbe362..e6285c5 100644 --- a/src/main/java/com/codingapi/simplemybatis/mapper/QueryMapper.java +++ b/src/main/java/com/codingapi/simplemybatis/mapper/QueryMapper.java @@ -30,10 +30,14 @@ public interface QueryMapper extends BaseMapper { @SelectProvider(type = QueryProvider.class, method = "queryView") List> queryMap(@Param("query") Query query); + @SuppressWarnings("unchecked") default List queryView(Class clazz, Query query) { List> list = queryMap(query); return list.stream().map(item -> { MapCamelUtils.camelMap(item); + if (Map.class.isAssignableFrom(clazz)) { + return (V) item; + } return MapBeanUtils.toBean(clazz, item); }).collect(Collectors.toList()); } diff --git a/src/main/java/com/codingapi/simplemybatis/mapper/ViewMapper.java b/src/main/java/com/codingapi/simplemybatis/mapper/ViewMapper.java new file mode 100644 index 0000000..ce396c5 --- /dev/null +++ b/src/main/java/com/codingapi/simplemybatis/mapper/ViewMapper.java @@ -0,0 +1,45 @@ +package com.codingapi.simplemybatis.mapper; + +import com.codingapi.simplemybatis.page.PageList; +import com.codingapi.simplemybatis.page.PageRequest; +import com.codingapi.simplemybatis.provider.QueryProvider; +import com.codingapi.simplemybatis.query.Query; +import com.codingapi.simplemybatis.utils.MapBeanUtils; +import com.codingapi.simplemybatis.utils.MapCamelUtils; +import com.github.pagehelper.PageHelper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.SelectProvider; + +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +/** + * @author lorne + * @date 2020/4/27 + */ +public interface ViewMapper { + + @SelectProvider(type = QueryProvider.class, method = "queryView") + List> queryMap(@Param("query") Query query); + + default List queryView(Class clazz, Query query) { + List> list = queryMap(query); + return list.stream().map(item -> { + MapCamelUtils.camelMap(item); + return MapBeanUtils.toBean(clazz, item); + }).collect(Collectors.toList()); + } + + default PageList page(int nowPage, int pageSize, Supplier> supplier) { + PageHelper.startPage(nowPage, pageSize); + return new PageList<>(supplier.get()); + } + + default PageList page(PageRequest request, Supplier> supplier) { + return page(request.getNowPage(), request.getPageSize(), supplier); + } + + +} diff --git a/src/main/java/com/codingapi/simplemybatis/parser/SqlParser.java b/src/main/java/com/codingapi/simplemybatis/parser/SqlParser.java index 45e7526..f1c7a99 100644 --- a/src/main/java/com/codingapi/simplemybatis/parser/SqlParser.java +++ b/src/main/java/com/codingapi/simplemybatis/parser/SqlParser.java @@ -1,7 +1,7 @@ package com.codingapi.simplemybatis.parser; import com.codingapi.simplemybatis.query.Query; -import com.codingapi.simplemybatis.query.QuerySqlBuilder; +import com.codingapi.simplemybatis.query.SqlBuilder; import java.lang.reflect.InvocationTargetException; import java.util.List; @@ -37,14 +37,14 @@ public String createSelectAll() { } public String createQuery(Query query) { - QuerySqlBuilder querySqlBuilder = new QuerySqlBuilder(tableInfo.columnToFiled(), tableInfo.getTableName(), query); - return querySqlBuilder.getSql(); + SqlBuilder sqlBuilder = new SqlBuilder(tableInfo.columnToFiled(), tableInfo.getTableName(), query); + return sqlBuilder.getSql(); } public String createUpdateSql() { if (tableInfo.getIdColumnFiled().getValue() == null) { - throw new RuntimeException("no Id value,do't create update sql."); + throw new RuntimeException("no Id value,don't create update sql."); } StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("update "); diff --git a/src/main/java/com/codingapi/simplemybatis/parser/TableParser.java b/src/main/java/com/codingapi/simplemybatis/parser/TableParser.java index 0b135fa..a76b6cf 100644 --- a/src/main/java/com/codingapi/simplemybatis/parser/TableParser.java +++ b/src/main/java/com/codingapi/simplemybatis/parser/TableParser.java @@ -1,7 +1,7 @@ package com.codingapi.simplemybatis.parser; -import com.codingapi.simplemybatis.properties.DbProperties.ColumnNameStyle; -import com.codingapi.simplemybatis.properties.GlabelProperties; +import com.codingapi.simplemybatis.properties.SimpleMybatisProperties.ColumnNameStyle; +import com.codingapi.simplemybatis.properties.SimpleMybatisPropertiesContext; import com.codingapi.simplemybatis.utils.StringCharacterUtils; import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.lang3.StringUtils; @@ -36,21 +36,23 @@ public class TableParser { public TableParser(Class clazz) { this.clazz = clazz; - columnNameStyle = GlabelProperties.getInstance().getColumnNameStyle(); + columnNameStyle = SimpleMybatisPropertiesContext.getInstance().getColumnNameStyle(); propertyDescriptors = PropertyUtils.getPropertyDescriptors(clazz); columns = new ArrayList<>(); loadTableName(); } - public void parser(Object obj) throws IllegalAccessException, InvocationTargetException { + public TableInfo parser(Object obj) throws IllegalAccessException, InvocationTargetException { loadColumnNames(obj); + return new TableInfo(tableName, idColumn, columns); } private void loadColumnNames(Object obj) throws IllegalAccessException, InvocationTargetException { Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { - if(field.isSynthetic()){ + Method method = getFieldMethod(field); + if(method==null||field.isSynthetic()){ continue; } Transient transientField = field.getAnnotation(Transient.class); @@ -61,7 +63,6 @@ private void loadColumnNames(Object obj) throws IllegalAccessException, Invocati Id id = field.getAnnotation(Id.class); if (id != null) { String idColumnName = getColumnName(field.getAnnotation(Column.class), field); - Method method = getFieldMethod(field); Object idValue = getFieldValue(method, obj); String fieldName = field.getName(); idColumn = new ColumnFiled(fieldName, idColumnName, idValue, method); @@ -70,7 +71,6 @@ private void loadColumnNames(Object obj) throws IllegalAccessException, Invocati } Column column = field.getAnnotation(Column.class); String columnName = getColumnName(column, field); - Method method = getFieldMethod(field); Object value = getFieldValue(method, obj); columns.add(new ColumnFiled(field.getName(), columnName, value, method)); } @@ -139,9 +139,6 @@ private String getColumnStyleName(String name) { } } - public TableInfo getTableInfo() { - return new TableInfo(tableName, idColumn, columns); - } public static class ColumnFiled { diff --git a/src/main/java/com/codingapi/simplemybatis/properties/GlabelProperties.java b/src/main/java/com/codingapi/simplemybatis/properties/GlabelProperties.java deleted file mode 100644 index 73608e0..0000000 --- a/src/main/java/com/codingapi/simplemybatis/properties/GlabelProperties.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.codingapi.simplemybatis.properties; - - -import com.codingapi.simplemybatis.properties.DbProperties.ColumnNameStyle; - -public class GlabelProperties { - - private static GlabelProperties instance = new GlabelProperties(); - - private GlabelProperties() { - dbProperties = new DbProperties(); - } - - private DbProperties dbProperties; - - public static GlabelProperties getInstance() { - return instance; - } - - public ColumnNameStyle getColumnNameStyle() { - return dbProperties.getColumnNameStyle(); - } - - -} diff --git a/src/main/java/com/codingapi/simplemybatis/properties/DbProperties.java b/src/main/java/com/codingapi/simplemybatis/properties/SimpleMybatisProperties.java similarity index 63% rename from src/main/java/com/codingapi/simplemybatis/properties/DbProperties.java rename to src/main/java/com/codingapi/simplemybatis/properties/SimpleMybatisProperties.java index eaa5724..884cc71 100644 --- a/src/main/java/com/codingapi/simplemybatis/properties/DbProperties.java +++ b/src/main/java/com/codingapi/simplemybatis/properties/SimpleMybatisProperties.java @@ -1,7 +1,7 @@ package com.codingapi.simplemybatis.properties; -public class DbProperties { +public class SimpleMybatisProperties { private ColumnNameStyle columnNameStyle = ColumnNameStyle.UNDERLINE; @@ -12,4 +12,8 @@ public enum ColumnNameStyle { public ColumnNameStyle getColumnNameStyle() { return columnNameStyle; } + + public void setColumnNameStyle(ColumnNameStyle columnNameStyle) { + this.columnNameStyle = columnNameStyle; + } } diff --git a/src/main/java/com/codingapi/simplemybatis/properties/SimpleMybatisPropertiesContext.java b/src/main/java/com/codingapi/simplemybatis/properties/SimpleMybatisPropertiesContext.java new file mode 100644 index 0000000..02fc7ab --- /dev/null +++ b/src/main/java/com/codingapi/simplemybatis/properties/SimpleMybatisPropertiesContext.java @@ -0,0 +1,34 @@ +package com.codingapi.simplemybatis.properties; + + +import com.codingapi.simplemybatis.properties.SimpleMybatisProperties.ColumnNameStyle; + +public class SimpleMybatisPropertiesContext { + + private static SimpleMybatisPropertiesContext instance; + + public static SimpleMybatisPropertiesContext getInstance() { + if(instance==null){ + synchronized (SimpleMybatisPropertiesContext.class){ + instance = new SimpleMybatisPropertiesContext(); + } + } + return instance; + } + + private final SimpleMybatisProperties simpleMybatisProperties; + + private SimpleMybatisPropertiesContext() { + simpleMybatisProperties = new SimpleMybatisProperties(); + } + + public void setColumnNameStyle(ColumnNameStyle columnNameStyle) { + simpleMybatisProperties.setColumnNameStyle(columnNameStyle); + } + + public ColumnNameStyle getColumnNameStyle() { + return simpleMybatisProperties.getColumnNameStyle(); + } + + +} diff --git a/src/main/java/com/codingapi/simplemybatis/provider/BaseProvider.java b/src/main/java/com/codingapi/simplemybatis/provider/BaseProvider.java index 572fa55..d4bcd45 100644 --- a/src/main/java/com/codingapi/simplemybatis/provider/BaseProvider.java +++ b/src/main/java/com/codingapi/simplemybatis/provider/BaseProvider.java @@ -2,6 +2,7 @@ import com.codingapi.simplemybatis.mapper.*; import com.codingapi.simplemybatis.parser.SqlParser; +import com.codingapi.simplemybatis.parser.TableInfo; import com.codingapi.simplemybatis.parser.TableParser; import org.apache.ibatis.builder.annotation.ProviderContext; @@ -16,12 +17,9 @@ protected Class entityType(ProviderContext context) { return Stream.of(context.getMapperType().getGenericInterfaces()) .filter(ParameterizedType.class::isInstance) .map(ParameterizedType.class::cast) - .filter(type -> (type.getRawType() == BaseMapper.class - || type.getRawType() == CommonMapper.class - || type.getRawType() == QueryMapper.class - || type.getRawType() == SimpleMapper.class - || type.getRawType() == TreeMapper.class - || type.getRawType() == PageMapper.class) + .filter( + (type) -> + type.getRawType().getClass().isInstance(BaseMapper.class) ) .findFirst() .map(type -> type.getActualTypeArguments()[0]) @@ -34,8 +32,8 @@ protected SqlParser createParser(Object obj, ProviderContext context) throws IllegalAccessException, InvocationTargetException { Class clazz = entityType(context); TableParser tableParser = new TableParser(clazz); - tableParser.parser(obj); - return new SqlParser(tableParser.getTableInfo()); + TableInfo tableInfo = tableParser.parser(obj); + return new SqlParser(tableInfo); } } diff --git a/src/main/java/com/codingapi/simplemybatis/provider/QueryProvider.java b/src/main/java/com/codingapi/simplemybatis/provider/QueryProvider.java index 16af546..dfef768 100644 --- a/src/main/java/com/codingapi/simplemybatis/provider/QueryProvider.java +++ b/src/main/java/com/codingapi/simplemybatis/provider/QueryProvider.java @@ -2,7 +2,7 @@ import com.codingapi.simplemybatis.parser.SqlParser; import com.codingapi.simplemybatis.query.Query; -import com.codingapi.simplemybatis.query.QuerySqlBuilder; +import com.codingapi.simplemybatis.query.SqlBuilder; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.builder.annotation.ProviderContext; @@ -29,8 +29,8 @@ public String query(@Param("query") Query query, ProviderContext context) throws public String queryView(@Param("query") Query query, ProviderContext context) throws IllegalAccessException, InvocationTargetException { - QuerySqlBuilder querySqlBuilder = new QuerySqlBuilder(query.getSelect(), null, query); - return querySqlBuilder.getSql(); + SqlBuilder sqlBuilder = new SqlBuilder(query.getSelect(), null, query); + return sqlBuilder.getSql(); } diff --git a/src/main/java/com/codingapi/simplemybatis/query/ConditionParameter.java b/src/main/java/com/codingapi/simplemybatis/query/ConditionParameter.java new file mode 100644 index 0000000..4142bef --- /dev/null +++ b/src/main/java/com/codingapi/simplemybatis/query/ConditionParameter.java @@ -0,0 +1,66 @@ +package com.codingapi.simplemybatis.query; + +import com.codingapi.simplemybatis.utils.PatternMatcherHelper; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/** + * @author lorne + * @date 2020/4/15 + * @description + */ +public class ConditionParameter { + + private String sql; + private Map map; + + public ConditionParameter(String sql) { + this.map = new HashMap<>(); + this.sql = sql; + } + + public ConditionParameter(String key, Object val, String sql) { + this.map = new HashMap<>(); + this.sql = sql; + map.put(key,val); + } + + public ConditionParameter(Map map, String sql) { + this.map = map; + this.sql = sql; + } + + + public ConditionParameter(Object val, String sql) { + this.map = new HashMap<>(); + String key = new PatternMatcherHelper(PatternMatcherHelper.BRACE_MATCHER).matcher(sql); + if(key!=null) { + map.put(key, val); + } + this.sql = sql; + } + + + public String getSql() { + for(String key:keys()) { + sql = sql.replace(String.format("{%s}", key), String.format("{%s}", getQueryParamKey(key))); + } + return sql; + } + + public Object getVal(String key) { + return map.get(key); + } + + public Set keys() { + return map.keySet(); + } + + private String getQueryParamKey(String key) { + return String.format("query.data.%s", key); + } + + +} diff --git a/src/main/java/com/codingapi/simplemybatis/query/Query.java b/src/main/java/com/codingapi/simplemybatis/query/Query.java index 39c02ba..2e6badc 100644 --- a/src/main/java/com/codingapi/simplemybatis/query/Query.java +++ b/src/main/java/com/codingapi/simplemybatis/query/Query.java @@ -1,10 +1,9 @@ package com.codingapi.simplemybatis.query; -import com.codingapi.simplemybatis.query.parser.QueryCondition; - import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * @author lorne @@ -14,7 +13,7 @@ public class Query { - private List parameterList; + private List parameterList; private List conditions; @@ -22,16 +21,16 @@ public class Query { private String select; - private String orderBy; + private String bySql; public Map data; - protected Query(String select, List parameterList, List conditions, String orderBy) { + protected Query(String select, List parameterList, List conditions, String bySql) { this.select = select; this.parameterList = parameterList; this.conditions = conditions; - this.orderBy = orderBy; + this.bySql = bySql; this.data = new HashMap<>(); pushData(); } @@ -40,15 +39,15 @@ public String getSelect() { return select; } - public String getOrderBy() { - return orderBy; + public String getBySql() { + return bySql; } public Map getData() { return data; } - public List getParameterList() { + public List getParameterList() { return parameterList; } @@ -61,12 +60,10 @@ public String getCondition() { } private void pushData() { - for (QueryParameter queryParameter : parameterList) { - if (queryParameter.getCondition().equals(QueryCondition.BETWEEN)) { - data.put(queryParameter.getKey(), queryParameter.getVal()); - data.put(queryParameter.getTwoKey(), queryParameter.getTwo()); - } else { - data.put(queryParameter.getKey(), queryParameter.getVal()); + for (ConditionParameter parameter : parameterList) { + Set keys = parameter.keys(); + for (String key : keys) { + data.put(key, parameter.getVal(key)); } } } diff --git a/src/main/java/com/codingapi/simplemybatis/query/QueryBuilder.java b/src/main/java/com/codingapi/simplemybatis/query/QueryBuilder.java index 8b6abb9..53e9925 100644 --- a/src/main/java/com/codingapi/simplemybatis/query/QueryBuilder.java +++ b/src/main/java/com/codingapi/simplemybatis/query/QueryBuilder.java @@ -1,10 +1,11 @@ package com.codingapi.simplemybatis.query; -import com.codingapi.simplemybatis.query.parser.QueryCondition; +import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; -import java.util.Arrays; +import java.util.LinkedList; import java.util.List; +import java.util.Map; /** * @author lorne @@ -13,9 +14,9 @@ */ public class QueryBuilder { - private Parameter parameter = new Parameter(); private Condition condition = new Condition(); - private String orderBy; + private Splice splice = new Splice(); + private String bySql; private String select; public QueryBuilder select(String select) { @@ -23,146 +24,110 @@ public QueryBuilder select(String select) { return this; } - public class Parameter { - private List parameterList = new ArrayList<>(); - - public List getParameterList() { - return parameterList; + public class Condition { + private List conditions = new ArrayList<>(); + + public Splice condition(String conditionSql,String paramKey, Object paramVal) { + if(paramVal!=null) { + conditions.add(new ConditionParameter(paramKey, paramVal, conditionSql)); + }else{ + splice.remove(); + } + return splice; } - public void column(QueryParameter queryParameter) { - parameterList.add(queryParameter); - } - public void column(String key, Object val, QueryCondition condition) { - parameterList.add(new QueryParameter(key, val, condition)); + public Splice condition(String conditionSql,Map map) { + conditions.add(new ConditionParameter(map, conditionSql)); + return splice; } - /** - * 完全匹配 - * - * @param key - * @param val - * @return - */ - public Condition equal(String key, Object val) { - parameterList.add(new QueryParameter(key, val, QueryCondition.EQUAL)); - return condition; + public Splice condition(String conditionSql,Object paramVal) { + if(paramVal!=null) { + conditions.add(new ConditionParameter(paramVal, conditionSql)); + }else{ + splice.remove(); + } + return splice; } - /** - * 大于匹配 - * - * @param key - * @param val - * @return - */ - public Condition greater(String key, Object val) { - parameterList.add(new QueryParameter(key, val, QueryCondition.GREATER)); - return condition; - } - /** - * 小于匹配 - * - * @param key - * @param val - * @return - */ - public Condition less(String key, Object val) { - parameterList.add(new QueryParameter(key, val, QueryCondition.LESS)); - return condition; + public Splice condition(String conditionSql,Object... paramVal) { + if(paramVal!=null&¶mVal.length>0) { + conditions.add(new ConditionParameter(StringUtils.join(paramVal, ","), conditionSql)); + }else{ + splice.remove(); + } + return splice; } + } + + public class Splice { + private List splices = new ArrayList<>(); /** - * 模糊匹配 + * and 条件 * - * @param key - * @param val * @return */ - public Condition like(String key, String val) { - parameterList.add(new QueryParameter(key, val, QueryCondition.LIKE)); + public Condition and() { + splices.add(" and "); return condition; } /** - * 日期字段 + * or 条件 * - * @param key 数据库字段 - * @param val %Y-%m-%d 格式的时间串 2020-02-17 * @return */ - public Condition date(String key, String val) { - parameterList.add(new QueryParameter(key, val, QueryCondition.DATE)); + public Condition or() { + splices.add(" or "); return condition; } - - /** - * in 包含 - * - * @param key - * @param val - * @return - */ - public Condition in(String key, Object... val) { - parameterList.add(new QueryParameter(key, Arrays.asList(val), QueryCondition.IN)); + public Condition splice(String splice) { + splices.add(String.format(" %s ",splice)); return condition; } - } - - public class Condition { - private List conditions = new ArrayList<>(); - - public List getConditions() { - return conditions; - } - /** - * and 条件 - * - * @return - */ - public Parameter and() { - conditions.add(" and "); - return parameter; - } - - /** - * or 条件 - * - * @return - */ - public Parameter or() { - conditions.add(" or "); - return parameter; + public QueryBuilder orderBy(String orderByStr) { + bySql = String.format(" order by %s",orderByStr); + return QueryBuilder.this; } - public QueryBuilder orderBy(String orderByStr) { - orderBy = orderByStr; + public QueryBuilder groupBy(String groupBySql) { + bySql = String.format(" group by %s",groupBySql); return QueryBuilder.this; } public Query builder() { - return new Query(select, parameter.parameterList, condition.conditions, orderBy); + return new Query(select, condition.conditions, splice.splices, bySql); + } + + public void remove() { + if(splices.size()>0) { + splices.remove(splices.size()-1); + } } } public Query builder() { - return new Query(select, parameter.parameterList, condition.conditions, orderBy); + return new Query(select, condition.conditions, splice.splices, bySql); } public static QueryBuilder Build() { - QueryBuilder queryBuilder = new QueryBuilder(); - return queryBuilder; + return new QueryBuilder(); } - public Parameter where() { - return parameter; + public Condition where() { + return condition; } + public QueryBuilder orderBy(String orderByStr) { + bySql = String.format(" order by %s",orderByStr); + return QueryBuilder.this; + } } diff --git a/src/main/java/com/codingapi/simplemybatis/query/QueryConditionParser.java b/src/main/java/com/codingapi/simplemybatis/query/QueryConditionParser.java deleted file mode 100644 index 21120cc..0000000 --- a/src/main/java/com/codingapi/simplemybatis/query/QueryConditionParser.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.codingapi.simplemybatis.query; - -import com.codingapi.simplemybatis.query.parser.*; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author lorne - * @date 2020/4/15 - * @description - */ -public class QueryConditionParser { - - private List conditionParsers = new ArrayList<>(); - - public QueryConditionParser() { - conditionParsers.add(new EqualConditionParser()); - conditionParsers.add(new LikeConditionParser()); - conditionParsers.add(new DateConditionParser()); - conditionParsers.add(new BetweenConditionParser()); - conditionParsers.add(new InConditionParser()); - } - - public String parserParam(QueryParameter queryParameter) { - for (IConditionParser conditionParser : conditionParsers) { - if (conditionParser.type().equals(queryParameter.getCondition())) { - return conditionParser.condition(queryParameter); - } - } - throw new IllegalArgumentException("no find condition parser to " + queryParameter.getCondition()); - } -} diff --git a/src/main/java/com/codingapi/simplemybatis/query/QueryParameter.java b/src/main/java/com/codingapi/simplemybatis/query/QueryParameter.java deleted file mode 100644 index 01f3b5a..0000000 --- a/src/main/java/com/codingapi/simplemybatis/query/QueryParameter.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.codingapi.simplemybatis.query; - -import com.codingapi.simplemybatis.query.parser.QueryCondition; - -/** - * @author lorne - * @date 2020/4/15 - * @description - */ -public class QueryParameter { - - public QueryParameter(String key, Object val, QueryCondition condition) { - this.key = key; - this.val = val; - this.condition = condition; - } - - private String key; - private Object val; - private Object two; - private QueryCondition condition; - - public String getKey() { - return key; - } - - public Object getVal() { - return val; - } - - public Object getTwo() { - return two; - } - - public QueryCondition getCondition() { - return condition; - } - - public String getParamKey() { - return getParamKey(false); - } - - public String getParamKey(boolean dollar) { - if (dollar) { - return String.format("${%s}", getQueryKey()); - } else { - return String.format("#{%s}", getQueryKey()); - } - } - - public String getQueryKey() { - return String.format("query.data.%s", key); - } - - public String getTwoParamKey() { - return String.format("#{query.data.%s}", getTwoKey()); - } - - public String getTwoKey() { - return String.format("%s_two", key); - } -} diff --git a/src/main/java/com/codingapi/simplemybatis/query/QuerySqlBuilder.java b/src/main/java/com/codingapi/simplemybatis/query/SqlBuilder.java similarity index 74% rename from src/main/java/com/codingapi/simplemybatis/query/QuerySqlBuilder.java rename to src/main/java/com/codingapi/simplemybatis/query/SqlBuilder.java index 105093a..b262d70 100644 --- a/src/main/java/com/codingapi/simplemybatis/query/QuerySqlBuilder.java +++ b/src/main/java/com/codingapi/simplemybatis/query/SqlBuilder.java @@ -8,17 +8,15 @@ * @date 2020/4/15 * @description */ -public class QuerySqlBuilder { +public class SqlBuilder { private StringBuilder currentSql; private Query query; - private QueryConditionParser queryConditionParser = new QueryConditionParser(); private String tableName; private String columnName; - public QuerySqlBuilder(String columnName, String tableName, Query query) { + public SqlBuilder(String columnName, String tableName, Query query) { this.currentSql = new StringBuilder(); - ; this.query = query; this.tableName = tableName; this.columnName = columnName; @@ -41,16 +39,15 @@ private boolean hasParameter() { } private void appendParameter() { - for (QueryParameter queryParameter : query.getParameterList()) { - currentSql.append(queryConditionParser.parserParam(queryParameter)); + for (ConditionParameter conditionParameter : query.getParameterList()) { + currentSql.append(conditionParameter.getSql()); currentSql.append(query.getCondition()); } } - private void orderBy() { - if (StringUtils.isNotEmpty(query.getOrderBy())) { - currentSql.append(" order by "); - currentSql.append(query.getOrderBy()); + private void bySql() { + if (StringUtils.isNotEmpty(query.getBySql())) { + currentSql.append(query.getBySql()); } } @@ -61,7 +58,7 @@ public String getSql() { appendParameter(); appendOver(); } - orderBy(); + bySql(); currentSql.append(""); return currentSql.toString(); } @@ -80,7 +77,6 @@ private void appendBegin() { currentSql.append(" from "); currentSql.append(tableName); } - } } diff --git a/src/main/java/com/codingapi/simplemybatis/query/parser/BetweenConditionParser.java b/src/main/java/com/codingapi/simplemybatis/query/parser/BetweenConditionParser.java deleted file mode 100644 index 141d43b..0000000 --- a/src/main/java/com/codingapi/simplemybatis/query/parser/BetweenConditionParser.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.codingapi.simplemybatis.query.parser; - -import com.codingapi.simplemybatis.query.QueryParameter; - -/** - * @author lorne - * @date 2020/4/15 - * @description - */ -public class BetweenConditionParser implements IConditionParser { - - @Override - public QueryCondition type() { - return QueryCondition.BETWEEN; - } - - @Override - public String condition(QueryParameter queryParameter) { - StringBuilder currentSql = new StringBuilder(); - currentSql.append(queryParameter.getKey()); - currentSql.append(" between "); - currentSql.append(queryParameter.getParamKey()); - currentSql.append(" and "); - currentSql.append(queryParameter.getTwoParamKey()); - return currentSql.toString(); - } -} diff --git a/src/main/java/com/codingapi/simplemybatis/query/parser/DateConditionParser.java b/src/main/java/com/codingapi/simplemybatis/query/parser/DateConditionParser.java deleted file mode 100644 index 3abc074..0000000 --- a/src/main/java/com/codingapi/simplemybatis/query/parser/DateConditionParser.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.codingapi.simplemybatis.query.parser; - -import com.codingapi.simplemybatis.query.QueryParameter; - -/** - * @author lorne - * @date 2020/4/15 - * @description - */ -public class DateConditionParser implements IConditionParser { - - @Override - public QueryCondition type() { - return QueryCondition.DATE; - } - - @Override - public String condition(QueryParameter queryParameter) { - StringBuilder currentSql = new StringBuilder(); - currentSql.append(queryParameter.getKey()); - currentSql.append(" = "); - currentSql.append("STR_TO_DATE(" + queryParameter.getParamKey() + ",'%Y-%m-%d')"); - return currentSql.toString(); - } -} diff --git a/src/main/java/com/codingapi/simplemybatis/query/parser/EqualConditionParser.java b/src/main/java/com/codingapi/simplemybatis/query/parser/EqualConditionParser.java deleted file mode 100644 index 8c350e4..0000000 --- a/src/main/java/com/codingapi/simplemybatis/query/parser/EqualConditionParser.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.codingapi.simplemybatis.query.parser; - -import com.codingapi.simplemybatis.query.QueryParameter; - -/** - * @author lorne - * @date 2020/4/15 - * @description - */ -public class EqualConditionParser implements IConditionParser { - - @Override - public QueryCondition type() { - return QueryCondition.EQUAL; - } - - @Override - public String condition(QueryParameter queryParameter) { - StringBuilder currentSql = new StringBuilder(); - currentSql.append(queryParameter.getKey()); - currentSql.append("="); - currentSql.append(queryParameter.getParamKey()); - return currentSql.toString(); - } -} diff --git a/src/main/java/com/codingapi/simplemybatis/query/parser/GreaterConditionParser.java b/src/main/java/com/codingapi/simplemybatis/query/parser/GreaterConditionParser.java deleted file mode 100644 index fed61b3..0000000 --- a/src/main/java/com/codingapi/simplemybatis/query/parser/GreaterConditionParser.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.codingapi.simplemybatis.query.parser; - -import com.codingapi.simplemybatis.query.QueryParameter; - -/** - * @author lorne - * @date 2020/4/15 - * @description - */ -public class GreaterConditionParser implements IConditionParser { - - @Override - public QueryCondition type() { - return QueryCondition.EQUAL; - } - - @Override - public String condition(QueryParameter queryParameter) { - StringBuilder currentSql = new StringBuilder(); - currentSql.append(queryParameter.getKey()); - currentSql.append(">"); - currentSql.append(queryParameter.getParamKey()); - return currentSql.toString(); - } -} \ No newline at end of file diff --git a/src/main/java/com/codingapi/simplemybatis/query/parser/IConditionParser.java b/src/main/java/com/codingapi/simplemybatis/query/parser/IConditionParser.java deleted file mode 100644 index dfbdb9d..0000000 --- a/src/main/java/com/codingapi/simplemybatis/query/parser/IConditionParser.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.codingapi.simplemybatis.query.parser; - -import com.codingapi.simplemybatis.query.QueryParameter; - -/** - * @author lorne - * @date 2020/4/15 - * @description - */ -public interface IConditionParser { - - QueryCondition type(); - - String condition(QueryParameter queryParameter); - - -} diff --git a/src/main/java/com/codingapi/simplemybatis/query/parser/InConditionParser.java b/src/main/java/com/codingapi/simplemybatis/query/parser/InConditionParser.java deleted file mode 100644 index e7905f8..0000000 --- a/src/main/java/com/codingapi/simplemybatis/query/parser/InConditionParser.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.codingapi.simplemybatis.query.parser; - -import com.codingapi.simplemybatis.query.QueryParameter; - -/** - * @author lorne - * @date 2020/4/15 - * @description - */ -public class InConditionParser implements IConditionParser { - - @Override - public QueryCondition type() { - return QueryCondition.IN; - } - - @Override - public String condition(QueryParameter queryParameter) { - StringBuilder currentSql = new StringBuilder(); - currentSql.append(queryParameter.getKey()); - currentSql.append(" in "); - currentSql.append(""); - currentSql.append("#{item}"); - currentSql.append(""); - return currentSql.toString(); - } -} diff --git a/src/main/java/com/codingapi/simplemybatis/query/parser/LessConditionParser.java b/src/main/java/com/codingapi/simplemybatis/query/parser/LessConditionParser.java deleted file mode 100644 index e98d0a3..0000000 --- a/src/main/java/com/codingapi/simplemybatis/query/parser/LessConditionParser.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.codingapi.simplemybatis.query.parser; - -import com.codingapi.simplemybatis.query.QueryParameter; - -/** - * @author lorne - * @date 2020/4/15 - * @description - */ -public class LessConditionParser implements IConditionParser { - - @Override - public QueryCondition type() { - return QueryCondition.EQUAL; - } - - @Override - public String condition(QueryParameter queryParameter) { - StringBuilder currentSql = new StringBuilder(); - currentSql.append(queryParameter.getKey()); - currentSql.append("<"); - currentSql.append(queryParameter.getParamKey()); - return currentSql.toString(); - } -} \ No newline at end of file diff --git a/src/main/java/com/codingapi/simplemybatis/query/parser/LikeConditionParser.java b/src/main/java/com/codingapi/simplemybatis/query/parser/LikeConditionParser.java deleted file mode 100644 index 7b898f7..0000000 --- a/src/main/java/com/codingapi/simplemybatis/query/parser/LikeConditionParser.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.codingapi.simplemybatis.query.parser; - -import com.codingapi.simplemybatis.query.QueryParameter; - -/** - * @author lorne - * @date 2020/4/15 - * @description - */ -public class LikeConditionParser implements IConditionParser { - - @Override - public QueryCondition type() { - return QueryCondition.LIKE; - } - - @Override - public String condition(QueryParameter queryParameter) { - StringBuilder currentSql = new StringBuilder(); - currentSql.append(queryParameter.getKey()); - currentSql.append(" like "); - currentSql.append("'%" + queryParameter.getParamKey(true) + "%'"); - return currentSql.toString(); - } -} diff --git a/src/main/java/com/codingapi/simplemybatis/query/parser/QueryCondition.java b/src/main/java/com/codingapi/simplemybatis/query/parser/QueryCondition.java deleted file mode 100644 index 75df1dc..0000000 --- a/src/main/java/com/codingapi/simplemybatis/query/parser/QueryCondition.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.codingapi.simplemybatis.query.parser; - -/** - * @author lorne - * @date 2020/4/15 - * @description - */ -public enum QueryCondition { - - LIKE, - EQUAL, - DATE, - BETWEEN, - GREATER, - LESS, - IN - -} diff --git a/src/main/java/com/codingapi/simplemybatis/tree/ITreeQuery.java b/src/main/java/com/codingapi/simplemybatis/tree/ITreeQuery.java index 9ecedb2..c6c4c80 100644 --- a/src/main/java/com/codingapi/simplemybatis/tree/ITreeQuery.java +++ b/src/main/java/com/codingapi/simplemybatis/tree/ITreeQuery.java @@ -7,7 +7,6 @@ public interface ITreeQuery, ID> { - default List> tree(Supplier> supplier, ID rootId) { List list = supplier.get(); List> trees = new ArrayList<>(); diff --git a/src/main/java/com/codingapi/simplemybatis/tree/TreeList.java b/src/main/java/com/codingapi/simplemybatis/tree/TreeList.java index af475c2..c0d20de 100644 --- a/src/main/java/com/codingapi/simplemybatis/tree/TreeList.java +++ b/src/main/java/com/codingapi/simplemybatis/tree/TreeList.java @@ -5,9 +5,9 @@ public class TreeList { - T node; + private T node; - List> children; + private List> children; public TreeList(T node) { this.node = node; diff --git a/src/main/java/com/codingapi/simplemybatis/utils/MapCamelUtils.java b/src/main/java/com/codingapi/simplemybatis/utils/MapCamelUtils.java index 1d00b7a..8240d2a 100644 --- a/src/main/java/com/codingapi/simplemybatis/utils/MapCamelUtils.java +++ b/src/main/java/com/codingapi/simplemybatis/utils/MapCamelUtils.java @@ -17,6 +17,7 @@ public static void camelMap(Map item) { String newKey = StringCharacterUtils.underlineToCamel(key); if (!newKey.equals(key)) { item.put(newKey, item.get(key)); + item.remove(key); } } } diff --git a/src/main/java/com/codingapi/simplemybatis/utils/MapListCamelParser.java b/src/main/java/com/codingapi/simplemybatis/utils/MapListCamelParser.java new file mode 100644 index 0000000..e3cdd50 --- /dev/null +++ b/src/main/java/com/codingapi/simplemybatis/utils/MapListCamelParser.java @@ -0,0 +1,61 @@ +package com.codingapi.simplemybatis.utils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author lorne + * @date 2020/4/28 + * @description + */ +public class MapListCamelParser { + + private List> list; + + private Set keys; + + public MapListCamelParser(List> list) { + this.keys = new HashSet<>(); + this.list = list; + + if(hasData()){ + camelMap(); + } + } + + private boolean hasData(){ + return list!=null&&list.size()>0; + } + + + private void camelMap(){ + this.list = list.stream().map(item->{ + MapCamelUtils.camelMap(item); + keys.addAll(item.keySet()); + return item; + }).collect(Collectors.toList()); + } + + public List> parser(){ + if(!hasData()) { + return null; + } + return list.stream().map(item -> { + pushKeys(item); + return item; + }).collect(Collectors.toList()); + } + + public List> getList() { + return list; + } + + private void pushKeys(Map item){ + for(String key:keys){ + if(!item.containsKey(key)){ + item.put(key,null); + } + } + } + +} diff --git a/src/main/java/com/codingapi/simplemybatis/utils/PatternMatcherHelper.java b/src/main/java/com/codingapi/simplemybatis/utils/PatternMatcherHelper.java new file mode 100644 index 0000000..73679c3 --- /dev/null +++ b/src/main/java/com/codingapi/simplemybatis/utils/PatternMatcherHelper.java @@ -0,0 +1,35 @@ +package com.codingapi.simplemybatis.utils; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class PatternMatcherHelper { + + public final static String BRACE_MATCHER = "\\{([^}]*)\\}"; + + private Pattern pattern; + + public PatternMatcherHelper(String regex) { + this.pattern = Pattern.compile(regex); + } + + public String matcher(String val){ + Matcher matcher = pattern.matcher(val); + if (matcher.find()){ + return matcher.group(1); + } + throw new IllegalArgumentException(String.format("not matcher of {%s} in regex:%s",val,pattern.pattern())); + } + + public List matcherList(String val){ + List list = new ArrayList<>(); + Matcher matcher = pattern.matcher(val); + while (matcher.find()){ + list.add(matcher.group(1)); + } + return list; + } + +} diff --git a/src/test/java/com/codingapi/simplemybatis/parser/SqlParserTest.java b/src/test/java/com/codingapi/simplemybatis/parser/SqlParserTest.java index 9e491d4..ed486d8 100644 --- a/src/test/java/com/codingapi/simplemybatis/parser/SqlParserTest.java +++ b/src/test/java/com/codingapi/simplemybatis/parser/SqlParserTest.java @@ -22,8 +22,8 @@ private Demo createDemo(){ private SqlParser createSqlParser() throws InvocationTargetException, IllegalAccessException { Demo demo = createDemo(); TableParser tableParser = new TableParser(demo.getClass()); - tableParser.parser(demo); - return new SqlParser(tableParser.getTableInfo()); + TableInfo tableInfo = tableParser.parser(demo); + return new SqlParser(tableInfo); } @Test @@ -88,4 +88,4 @@ void createGetByIdSql() throws InvocationTargetException, IllegalAccessException String sql = sqlParser.createGetByIdSql(); System.out.println(sql); } -} \ No newline at end of file +} diff --git a/src/test/java/com/codingapi/simplemybatis/query/QueryTest.java b/src/test/java/com/codingapi/simplemybatis/query/QueryTest.java index a0ceb67..8b54875 100644 --- a/src/test/java/com/codingapi/simplemybatis/query/QueryTest.java +++ b/src/test/java/com/codingapi/simplemybatis/query/QueryTest.java @@ -2,10 +2,13 @@ import com.codingapi.simplemybatis.entity.Demo; import com.codingapi.simplemybatis.parser.SqlParser; +import com.codingapi.simplemybatis.parser.TableInfo; import com.codingapi.simplemybatis.parser.TableParser; import org.junit.jupiter.api.Test; import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import java.util.HashMap; class QueryTest { @@ -22,8 +25,8 @@ private Demo createDemo(){ private SqlParser createSqlParser() throws InvocationTargetException, IllegalAccessException { Demo demo = createDemo(); TableParser tableParser = new TableParser(demo.getClass()); - tableParser.parser(demo); - return new SqlParser(tableParser.getTableInfo()); + TableInfo tableInfo = tableParser.parser(demo); + return new SqlParser(tableInfo); } @@ -32,12 +35,12 @@ void query() throws InvocationTargetException, IllegalAccessException { SqlParser sqlParser = createSqlParser(); String sql = sqlParser.createQuery(QueryBuilder.Build() .where() - .equal("name","hello") + .condition("name=#{name}","hello") .and() - .date("create_time","2020-01-12") + .condition("create_time=STR_TO_DATE(%{createTime},'%Y-%m-%d')","2020-01-12") .or() - .in("id",1,2,3,4,5) - .orderBy("name desc") + .condition("id in (${ids})", 1,2,3,4,5) + .groupBy("d.name") .builder()); System.out.println(sql); } @@ -48,16 +51,68 @@ void queryView() throws InvocationTargetException, IllegalAccessException { Query query = QueryBuilder.Build() .select("select * from t_demo d join t_test t on d.id = t.demo_id ") .where() - .equal("d.name","hello") - .and() - .date("d.create_time","2020-01-12") + .condition("d.name = #{name}","name","234") .or() - .in("d.id",1,2,3,4,5) + .condition("d.name = '1'") + .and() + .condition("create_time=STR_TO_DATE(%{createTime},'%Y-%m-%d')","createTime","2020-01-12") .orderBy("d.name desc") .builder(); - QuerySqlBuilder querySqlBuilder = new QuerySqlBuilder(query.getSelect(),null,query); - String sql = querySqlBuilder.getSql(); + SqlBuilder sqlBuilder = new SqlBuilder(query.getSelect(),null,query); + String sql = sqlBuilder.getSql(); + System.out.println(sql); + } + + + @Test + void queryNumberKey() throws InvocationTargetException, IllegalAccessException { + Query query = QueryBuilder.Build() + .select("select * from t_demo d join t_test t on d.id = t.demo_id ") + .where() + .condition("d.order = #{?1} or d.order = #{?2} or d.order = #{?3} or d.order = #{?4} ",1,2,3,4) + .builder(); + SqlBuilder sqlBuilder = new SqlBuilder(query.getSelect(),null,query); + String sql = sqlBuilder.getSql(); + System.out.println(sql); + } + + @Test + void queryOrderBy() throws InvocationTargetException, IllegalAccessException { + Query query = QueryBuilder.Build() + .select("select * from t_demo d join t_test t on d.id = t.demo_id ") + .orderBy("d.sort desc ") + .builder(); + SqlBuilder sqlBuilder = new SqlBuilder(query.getSelect(),null,query); + String sql = sqlBuilder.getSql(); System.out.println(sql); } -} \ No newline at end of file + @Test + void queryLikeKey() throws InvocationTargetException, IllegalAccessException { + Query query = QueryBuilder.Build() + .select("select * from t_demo d join t_test t on d.id = t.demo_id ") + .where() + .condition("d.name = #{name} and d.name = '123'",new HashMap<>()) + .builder(); + SqlBuilder sqlBuilder = new SqlBuilder(query.getSelect(),null,query); + String sql = sqlBuilder.getSql(); + System.out.println(sql); + } + + @Test + void queryNotNullView() throws InvocationTargetException, IllegalAccessException { + Object object = Arrays.asList(1,2,3,4,5,6,7,8,9,10); + Query query = QueryBuilder.Build() + .select("select * from t_demo d join t_test t on d.id = t.demo_id ") + .where() + .condition("d.name = #{name}","112") + .and() + .condition("d.id in (%{ids})",object) + .builder(); + SqlBuilder sqlBuilder = new SqlBuilder(query.getSelect(),null,query); + String sql = sqlBuilder.getSql(); + System.out.println(sql); + } + + +}