diff --git a/.travis.yml b/.travis.yml
index 17ed049..f688b51 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -5,6 +5,7 @@ jdk: openjdk8
branches:
only:
- master
+ - dev
before_install:
- pip install --user codecov
@@ -17,4 +18,4 @@ after_success:
env:
global:
- - CODECOV_TOKEN=5ee0f56b-7d1e-4e5c-870a-f6c128fa62eb
\ No newline at end of file
+ - CODECOV_TOKEN=5ee0f56b-7d1e-4e5c-870a-f6c128fa62eb
diff --git a/pom.xml b/pom.xml
index e690f99..18ae23f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
com.codingapi
simple-mybatis
- 1.2.1
+ 1.2.2
simple-mybatis
https://github.com/codingapi/simple-mybatis
simple mybatis project for Spring Boot
diff --git a/src/main/java/com/codingapi/simplemybatis/mapper/AutoGeneratorMapper.java b/src/main/java/com/codingapi/simplemybatis/mapper/AutoGeneratorMapper.java
new file mode 100644
index 0000000..d0200df
--- /dev/null
+++ b/src/main/java/com/codingapi/simplemybatis/mapper/AutoGeneratorMapper.java
@@ -0,0 +1,18 @@
+package com.codingapi.simplemybatis.mapper;
+
+import com.codingapi.simplemybatis.provider.AutoGeneratorProvider;
+import org.apache.ibatis.annotations.UpdateProvider;
+
+/**
+ * @author lorne
+ * @since 1.0.0
+ */
+public interface AutoGeneratorMapper extends BaseMapper{
+
+ @UpdateProvider(type = AutoGeneratorProvider.class, method = "create")
+ void create();
+
+ @UpdateProvider(type = AutoGeneratorProvider.class, method = "drop")
+ void drop();
+
+}
diff --git a/src/main/java/com/codingapi/simplemybatis/parser/FieldTypeConvertorContext.java b/src/main/java/com/codingapi/simplemybatis/parser/FieldTypeConvertorContext.java
new file mode 100644
index 0000000..814fcd4
--- /dev/null
+++ b/src/main/java/com/codingapi/simplemybatis/parser/FieldTypeConvertorContext.java
@@ -0,0 +1,54 @@
+package com.codingapi.simplemybatis.parser;
+
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author lorne
+ * @since 1.0.0
+ */
+public class FieldTypeConvertorContext {
+
+ private static FieldTypeConvertorContext context;
+
+ public static FieldTypeConvertorContext getInstance(){
+ if(context==null){
+ synchronized (FieldTypeConvertorContext.class){
+ context = new FieldTypeConvertorContext();
+ }
+ }
+ return context;
+ }
+
+ private final Map,String> convertors;
+
+ private FieldTypeConvertorContext(){
+ this.convertors = new HashMap<>();
+ this.init();
+ }
+
+ private void init(){
+ addConvertor(String.class,"varchar(%d)");
+ addConvertor(Integer.class,"int(%d)");
+ addConvertor(int.class,"int(%d)");
+ addConvertor(long.class,"int(%d)");
+ addConvertor(Long.class,"int(%d)");
+ addConvertor(boolean.class,"int(1)");
+ addConvertor(Boolean.class,"int(1)");
+ }
+
+ public void addConvertor(Class> key,String value){
+ convertors.put(key, value);
+ }
+
+
+ public String convertor(Class> type,int length){
+ String format = convertors.get(type);
+ if(format==null){
+ throw new RuntimeException("cont find convertor match type:"+type);
+ }
+ return String.format(format,length);
+ }
+
+}
diff --git a/src/main/java/com/codingapi/simplemybatis/parser/TableInfo.java b/src/main/java/com/codingapi/simplemybatis/parser/TableInfo.java
index 21ae4a7..1180c0e 100644
--- a/src/main/java/com/codingapi/simplemybatis/parser/TableInfo.java
+++ b/src/main/java/com/codingapi/simplemybatis/parser/TableInfo.java
@@ -16,7 +16,9 @@ public class TableInfo {
private List columnFields;
- public TableInfo(String tableName, TableParser.ColumnFiled idColumnFiled, List columnFields) {
+ public TableInfo(String tableName,
+ TableParser.ColumnFiled idColumnFiled,
+ List columnFields) {
this.tableName = tableName;
this.idColumnFiled = idColumnFiled;
this.columnFields = columnFields;
diff --git a/src/main/java/com/codingapi/simplemybatis/parser/TableParser.java b/src/main/java/com/codingapi/simplemybatis/parser/TableParser.java
index a76b6cf..9e43949 100644
--- a/src/main/java/com/codingapi/simplemybatis/parser/TableParser.java
+++ b/src/main/java/com/codingapi/simplemybatis/parser/TableParser.java
@@ -59,20 +59,34 @@ private void loadColumnNames(Object obj) throws IllegalAccessException, Invocati
if (transientField != null) {
continue;
}
+ Column column = field.getAnnotation(Column.class);
+ String columnName = getColumnName(column, field);
+ String columnDefinition = getColumnDefinition(column,field);
+
if (idColumn == null) {
Id id = field.getAnnotation(Id.class);
if (id != null) {
- String idColumnName = getColumnName(field.getAnnotation(Column.class), field);
Object idValue = getFieldValue(method, obj);
String fieldName = field.getName();
- idColumn = new ColumnFiled(fieldName, idColumnName, idValue, method);
+ idColumn = new ColumnFiled(fieldName, columnName,columnDefinition, idValue, method);
continue;
}
}
- Column column = field.getAnnotation(Column.class);
- String columnName = getColumnName(column, field);
+
Object value = getFieldValue(method, obj);
- columns.add(new ColumnFiled(field.getName(), columnName, value, method));
+ columns.add(new ColumnFiled(field.getName(), columnName,columnDefinition, value, method));
+ }
+ }
+
+ private String getColumnDefinition(Column column, Field field) {
+ if (column == null) {
+ return FieldTypeConvertorContext.getInstance().convertor(field.getType(),255);
+ } else {
+ String columnDefinition = column.columnDefinition();
+ if(StringUtils.isEmpty(columnDefinition)){
+ return FieldTypeConvertorContext.getInstance().convertor(field.getType(),column.length());
+ }
+ return columnDefinition;
}
}
@@ -144,47 +158,39 @@ private String getColumnStyleName(String name) {
public static class ColumnFiled {
private String fieldName;
private String columnName;
+ private String columnDefinition;
private Object value;
private Method method;
- public ColumnFiled(String fieldName, String columnName, Object value, Method method) {
+ public ColumnFiled(String fieldName, String columnName,String columnDefinition, Object value, Method method) {
this.fieldName = fieldName;
this.columnName = columnName;
+ this.columnDefinition = columnDefinition;
this.value = value;
this.method = method;
}
+ public String getColumnDefinition() {
+ return columnDefinition;
+ }
+
public String getFieldName() {
return fieldName;
}
- public void setFieldName(String fieldName) {
- this.fieldName = fieldName;
- }
public String getColumnName() {
return columnName;
}
- public void setColumnName(String columnName) {
- this.columnName = columnName;
- }
-
public Object getValue() {
return value;
}
- public void setValue(Object value) {
- this.value = value;
- }
-
public Method getMethod() {
return method;
}
- public void setMethod(Method method) {
- this.method = method;
- }
}
diff --git a/src/main/java/com/codingapi/simplemybatis/provider/AutoGeneratorProvider.java b/src/main/java/com/codingapi/simplemybatis/provider/AutoGeneratorProvider.java
new file mode 100644
index 0000000..06b0324
--- /dev/null
+++ b/src/main/java/com/codingapi/simplemybatis/provider/AutoGeneratorProvider.java
@@ -0,0 +1,20 @@
+package com.codingapi.simplemybatis.provider;
+
+import java.lang.reflect.InvocationTargetException;
+
+/**
+ * @author lorne
+ * @since 1.0.0
+ */
+public class AutoGeneratorProvider {
+
+ public String create(org.apache.ibatis.builder.annotation.ProviderContext context) throws IllegalAccessException, InvocationTargetException {
+ SimpleProviderContext simpleProviderContext = new SimpleProviderContext(context,null);
+ return SimpleMybatisProviderContext.getInstance().getBuilder(AutoGeneratorSQLBuilder.class).create(simpleProviderContext);
+ }
+
+ public String drop(org.apache.ibatis.builder.annotation.ProviderContext context) throws IllegalAccessException, InvocationTargetException {
+ SimpleProviderContext simpleProviderContext = new SimpleProviderContext(context,null);
+ return SimpleMybatisProviderContext.getInstance().getBuilder(AutoGeneratorSQLBuilder.class).drop(simpleProviderContext);
+ }
+}
diff --git a/src/main/java/com/codingapi/simplemybatis/provider/AutoGeneratorSQLBuilder.java b/src/main/java/com/codingapi/simplemybatis/provider/AutoGeneratorSQLBuilder.java
new file mode 100644
index 0000000..5d0247f
--- /dev/null
+++ b/src/main/java/com/codingapi/simplemybatis/provider/AutoGeneratorSQLBuilder.java
@@ -0,0 +1,15 @@
+package com.codingapi.simplemybatis.provider;
+
+import java.lang.reflect.InvocationTargetException;
+
+/**
+ * @author lorne
+ * @since 1.0.0
+ */
+public interface AutoGeneratorSQLBuilder extends SimpleMybatisSQLBuilder{
+
+ String create(SimpleProviderContext simpleProviderContext) throws IllegalAccessException, InvocationTargetException ;
+
+ String drop(SimpleProviderContext simpleProviderContext) throws IllegalAccessException, InvocationTargetException ;
+
+}
diff --git a/src/main/java/com/codingapi/simplemybatis/provider/BaseProvider.java b/src/main/java/com/codingapi/simplemybatis/provider/BaseProvider.java
deleted file mode 100644
index d4bcd45..0000000
--- a/src/main/java/com/codingapi/simplemybatis/provider/BaseProvider.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.codingapi.simplemybatis.provider;
-
-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;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.ParameterizedType;
-import java.util.stream.Stream;
-
-
-public class BaseProvider {
-
- protected Class> entityType(ProviderContext context) {
- return Stream.of(context.getMapperType().getGenericInterfaces())
- .filter(ParameterizedType.class::isInstance)
- .map(ParameterizedType.class::cast)
- .filter(
- (type) ->
- type.getRawType().getClass().isInstance(BaseMapper.class)
- )
- .findFirst()
- .map(type -> type.getActualTypeArguments()[0])
- .filter(Class.class::isInstance).map(Class.class::cast)
- .orElseThrow(() -> new IllegalStateException(
- "not find BaseMapper type " + context.getMapperType().getName() + "."));
- }
-
- protected SqlParser createParser(Object obj, ProviderContext context)
- throws IllegalAccessException, InvocationTargetException {
- Class clazz = entityType(context);
- TableParser tableParser = new TableParser(clazz);
- TableInfo tableInfo = tableParser.parser(obj);
- return new SqlParser(tableInfo);
- }
-
-}
diff --git a/src/main/java/com/codingapi/simplemybatis/provider/CommandProvider.java b/src/main/java/com/codingapi/simplemybatis/provider/CommandProvider.java
index a52411d..536576e 100644
--- a/src/main/java/com/codingapi/simplemybatis/provider/CommandProvider.java
+++ b/src/main/java/com/codingapi/simplemybatis/provider/CommandProvider.java
@@ -1,54 +1,48 @@
package com.codingapi.simplemybatis.provider;
-import com.codingapi.simplemybatis.parser.SqlParser;
-import org.apache.ibatis.builder.annotation.ProviderContext;
-
import java.lang.reflect.InvocationTargetException;
-import java.util.List;
import java.util.Map;
-public class CommandProvider extends BaseProvider {
-
+public class CommandProvider {
- public String save(Object obj, ProviderContext context) throws IllegalAccessException, InvocationTargetException {
- SqlParser sqlParser = createParser(obj, context);
- return sqlParser.createInsertSql();
+ public String save(Object obj, org.apache.ibatis.builder.annotation.ProviderContext context) throws IllegalAccessException, InvocationTargetException {
+ SimpleProviderContext simpleProviderContext = new SimpleProviderContext(context,obj);
+ return SimpleMybatisProviderContext.getInstance().getBuilder(CommandSQLBuilder.class).insertSql(simpleProviderContext);
}
- public String saveAll(Map map, ProviderContext context) throws IllegalAccessException, InvocationTargetException {
- List list = (List) map.get("list");
- if (list == null || list.size() == 0) {
- throw new RuntimeException("not data.");
- }
- SqlParser sqlParser = createParser(null, context);
- return sqlParser.createInsertAllSql(list);
+ public String saveAll(Map map, org.apache.ibatis.builder.annotation.ProviderContext context) throws IllegalAccessException, InvocationTargetException {
+ SimpleProviderContext simpleProviderContext = new SimpleProviderContext(context,map);
+ return SimpleMybatisProviderContext.getInstance().getBuilder(CommandSQLBuilder.class).insertAllSql(simpleProviderContext);
}
- public String deleteAll(Map map, ProviderContext context) throws IllegalAccessException, InvocationTargetException {
- SqlParser sqlParser = createParser(null, context);
- return sqlParser.createDeleteAllSql();
+ public String deleteAll(Map map, org.apache.ibatis.builder.annotation.ProviderContext context) throws IllegalAccessException, InvocationTargetException {
+ SimpleProviderContext simpleProviderContext = new SimpleProviderContext(context,map);
+ return SimpleMybatisProviderContext.getInstance().getBuilder(CommandSQLBuilder.class).deleteAllSql(simpleProviderContext);
}
- public String deleteAllById(Map map, ProviderContext context) throws IllegalAccessException, InvocationTargetException {
- SqlParser sqlParser = createParser(null, context);
- return sqlParser.createDeleteAllByIdSql();
+ public String deleteAllById(Map map, org.apache.ibatis.builder.annotation.ProviderContext context) throws IllegalAccessException, InvocationTargetException {
+ SimpleProviderContext simpleProviderContext = new SimpleProviderContext(context,map);
+ return SimpleMybatisProviderContext.getInstance().getBuilder(CommandSQLBuilder.class).deleteAllByIdSql(simpleProviderContext);
}
-
- public String update(Object obj, ProviderContext context) throws IllegalAccessException, InvocationTargetException {
- SqlParser sqlParser = createParser(obj, context);
- return sqlParser.createUpdateSql();
+ public String deleteById(Object obj, org.apache.ibatis.builder.annotation.ProviderContext context) throws IllegalAccessException, InvocationTargetException {
+ SimpleProviderContext simpleProviderContext = new SimpleProviderContext(context,obj);
+ return SimpleMybatisProviderContext.getInstance().getBuilder(CommandSQLBuilder.class).deleteByIdSql(simpleProviderContext);
}
- public String delete(Object obj, ProviderContext context) throws IllegalAccessException, InvocationTargetException {
- SqlParser sqlParser = createParser(obj, context);
- return sqlParser.createDeleteSql();
+ public String delete(Object obj, org.apache.ibatis.builder.annotation.ProviderContext context) throws IllegalAccessException, InvocationTargetException {
+ SimpleProviderContext simpleProviderContext = new SimpleProviderContext(context,obj);
+ return SimpleMybatisProviderContext.getInstance().getBuilder(CommandSQLBuilder.class).deleteSql(simpleProviderContext);
}
- public String deleteById(Object obj, ProviderContext context) throws IllegalAccessException, InvocationTargetException {
- SqlParser sqlParser = createParser(null, context);
- return sqlParser.createDeleteSql();
+
+ public String update(Object obj, org.apache.ibatis.builder.annotation.ProviderContext context) throws IllegalAccessException, InvocationTargetException {
+ SimpleProviderContext simpleProviderContext = new SimpleProviderContext(context,obj);
+ return SimpleMybatisProviderContext.getInstance().getBuilder(CommandSQLBuilder.class).updateSql(simpleProviderContext);
}
+
+
+
}
diff --git a/src/main/java/com/codingapi/simplemybatis/provider/CommandSQLBuilder.java b/src/main/java/com/codingapi/simplemybatis/provider/CommandSQLBuilder.java
new file mode 100644
index 0000000..d2e547d
--- /dev/null
+++ b/src/main/java/com/codingapi/simplemybatis/provider/CommandSQLBuilder.java
@@ -0,0 +1,24 @@
+package com.codingapi.simplemybatis.provider;
+
+import java.lang.reflect.InvocationTargetException;
+
+/**
+ * @author lorne
+ * @since 1.0.0
+ */
+public interface CommandSQLBuilder extends SimpleMybatisSQLBuilder {
+
+ String insertSql(SimpleProviderContext context)throws IllegalAccessException, InvocationTargetException;
+
+ String insertAllSql(SimpleProviderContext simpleProviderContext) throws IllegalAccessException,InvocationTargetException;
+
+ String deleteSql(SimpleProviderContext simpleProviderContext)throws IllegalAccessException, InvocationTargetException ;
+
+ String deleteAllSql(SimpleProviderContext simpleProviderContext) throws IllegalAccessException,InvocationTargetException;
+
+ String deleteAllByIdSql(SimpleProviderContext simpleProviderContext) throws IllegalAccessException,InvocationTargetException;
+
+ String deleteByIdSql(SimpleProviderContext simpleProviderContext) throws IllegalAccessException,InvocationTargetException;
+
+ String updateSql(SimpleProviderContext simpleProviderContext) throws IllegalAccessException,InvocationTargetException;
+}
diff --git a/src/main/java/com/codingapi/simplemybatis/provider/QueryProvider.java b/src/main/java/com/codingapi/simplemybatis/provider/QueryProvider.java
index dfef768..6a240ea 100644
--- a/src/main/java/com/codingapi/simplemybatis/provider/QueryProvider.java
+++ b/src/main/java/com/codingapi/simplemybatis/provider/QueryProvider.java
@@ -1,36 +1,33 @@
package com.codingapi.simplemybatis.provider;
-import com.codingapi.simplemybatis.parser.SqlParser;
import com.codingapi.simplemybatis.query.Query;
-import com.codingapi.simplemybatis.query.SqlBuilder;
import org.apache.ibatis.annotations.Param;
-import org.apache.ibatis.builder.annotation.ProviderContext;
import java.lang.reflect.InvocationTargetException;
-public class QueryProvider extends BaseProvider {
+public class QueryProvider {
- public String getById(Object obj, ProviderContext context) throws IllegalAccessException, InvocationTargetException {
- SqlParser sqlParser = createParser(null, context);
- return sqlParser.createGetByIdSql();
+ public String getById(Object obj, org.apache.ibatis.builder.annotation.ProviderContext context) throws IllegalAccessException, InvocationTargetException {
+ SimpleProviderContext simpleProviderContext = new SimpleProviderContext(context,obj);
+ return SimpleMybatisProviderContext.getInstance().getBuilder(QuerySQLBuilder.class).getById(simpleProviderContext);
}
- public String findAll(ProviderContext context) throws IllegalAccessException, InvocationTargetException {
- SqlParser sqlParser = createParser(null, context);
- return sqlParser.createSelectAll();
+ public String findAll(org.apache.ibatis.builder.annotation.ProviderContext context) throws IllegalAccessException, InvocationTargetException {
+ SimpleProviderContext simpleProviderContext = new SimpleProviderContext(context,null);
+ return SimpleMybatisProviderContext.getInstance().getBuilder(QuerySQLBuilder.class).findAll(simpleProviderContext);
}
- public String query(@Param("query") Query query, ProviderContext context) throws IllegalAccessException, InvocationTargetException {
- SqlParser sqlParser = createParser(null, context);
- return sqlParser.createQuery(query);
+ public String query(@Param("query") Query query, org.apache.ibatis.builder.annotation.ProviderContext context) throws IllegalAccessException, InvocationTargetException {
+ SimpleProviderContext simpleProviderContext = new SimpleProviderContext(context,query);
+ return SimpleMybatisProviderContext.getInstance().getBuilder(QuerySQLBuilder.class).query(simpleProviderContext);
}
- public String queryView(@Param("query") Query query, ProviderContext context) throws IllegalAccessException, InvocationTargetException {
- SqlBuilder sqlBuilder = new SqlBuilder(query.getSelect(), null, query);
- return sqlBuilder.getSql();
+ public String queryView(@Param("query") Query query, org.apache.ibatis.builder.annotation.ProviderContext context) throws IllegalAccessException, InvocationTargetException {
+ SimpleProviderContext simpleProviderContext = new SimpleProviderContext(context,query);
+ return SimpleMybatisProviderContext.getInstance().getBuilder(QuerySQLBuilder.class).queryView(simpleProviderContext);
}
diff --git a/src/main/java/com/codingapi/simplemybatis/provider/QuerySQLBuilder.java b/src/main/java/com/codingapi/simplemybatis/provider/QuerySQLBuilder.java
new file mode 100644
index 0000000..3be3aea
--- /dev/null
+++ b/src/main/java/com/codingapi/simplemybatis/provider/QuerySQLBuilder.java
@@ -0,0 +1,17 @@
+package com.codingapi.simplemybatis.provider;
+
+import java.lang.reflect.InvocationTargetException;
+
+
+public interface QuerySQLBuilder extends SimpleMybatisSQLBuilder {
+
+ String getById(SimpleProviderContext simpleProviderContext) throws IllegalAccessException, InvocationTargetException ;
+
+ String findAll(SimpleProviderContext simpleProviderContext) throws IllegalAccessException, InvocationTargetException ;
+
+ String query(SimpleProviderContext simpleProviderContext) throws IllegalAccessException, InvocationTargetException ;
+
+
+ String queryView(SimpleProviderContext simpleProviderContext) throws IllegalAccessException, InvocationTargetException;
+
+}
diff --git a/src/main/java/com/codingapi/simplemybatis/provider/SimpleMybatisProviderContext.java b/src/main/java/com/codingapi/simplemybatis/provider/SimpleMybatisProviderContext.java
new file mode 100644
index 0000000..1143bcb
--- /dev/null
+++ b/src/main/java/com/codingapi/simplemybatis/provider/SimpleMybatisProviderContext.java
@@ -0,0 +1,47 @@
+package com.codingapi.simplemybatis.provider;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author lorne
+ * @since 1.0.0
+ */
+public class SimpleMybatisProviderContext {
+
+ private final List commandSQLBuilders;
+
+ private SimpleMybatisProviderContext(){
+ this.commandSQLBuilders = new ArrayList<>();
+ }
+
+ private void addSimpleMybatisSQLBuilder(SimpleMybatisSQLBuilder sqlBuilder){
+ this.commandSQLBuilders.add(sqlBuilder);
+ }
+
+ private static SimpleMybatisProviderContext context;
+
+ public static SimpleMybatisProviderContext getInstance(){
+ if(context==null){
+ synchronized (SimpleMybatisProviderContext.class){
+ context = new SimpleMybatisProviderContext();
+ }
+ }
+ return context;
+ }
+
+ public void registerSQLBuilder(SimpleMybatisSQLBuilder sqlBuilder){
+ this.addSimpleMybatisSQLBuilder(sqlBuilder);
+ }
+
+ public T getBuilder(Class clazz){
+ for(SimpleMybatisSQLBuilder sqlBuilder: commandSQLBuilders){
+ if(clazz.isAssignableFrom(sqlBuilder.getClass())){
+ return (T)sqlBuilder;
+ }
+ }
+ return null;
+ }
+
+
+}
diff --git a/src/main/java/com/codingapi/simplemybatis/provider/SimpleMybatisSQLBuilder.java b/src/main/java/com/codingapi/simplemybatis/provider/SimpleMybatisSQLBuilder.java
new file mode 100644
index 0000000..9307af4
--- /dev/null
+++ b/src/main/java/com/codingapi/simplemybatis/provider/SimpleMybatisSQLBuilder.java
@@ -0,0 +1,12 @@
+package com.codingapi.simplemybatis.provider;
+
+/**
+ * @author lorne
+ * @since 1.0.0
+ */
+public interface SimpleMybatisSQLBuilder {
+
+
+
+
+}
diff --git a/src/main/java/com/codingapi/simplemybatis/provider/SimpleProviderContext.java b/src/main/java/com/codingapi/simplemybatis/provider/SimpleProviderContext.java
new file mode 100644
index 0000000..23c2114
--- /dev/null
+++ b/src/main/java/com/codingapi/simplemybatis/provider/SimpleProviderContext.java
@@ -0,0 +1,64 @@
+package com.codingapi.simplemybatis.provider;
+
+import com.codingapi.simplemybatis.mapper.BaseMapper;
+import com.codingapi.simplemybatis.parser.TableInfo;
+import com.codingapi.simplemybatis.parser.TableParser;
+import org.apache.ibatis.builder.annotation.ProviderContext;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.ParameterizedType;
+import java.util.stream.Stream;
+
+
+public final class SimpleProviderContext {
+
+ private ProviderContext providerContext;
+ private Object parameter;
+
+ SimpleProviderContext(ProviderContext providerContext, Object parameter) {
+ this.providerContext = providerContext;
+ this.parameter = parameter;
+ }
+
+ public Object getParameter() {
+ return parameter;
+ }
+
+ public T getParameter(Class clazz) {
+ return (T)parameter;
+ }
+
+ public ProviderContext getProviderContext() {
+ return providerContext;
+ }
+
+ private Class> entityType() {
+ return Stream.of(providerContext.getMapperType().getGenericInterfaces())
+ .filter(ParameterizedType.class::isInstance)
+ .map(ParameterizedType.class::cast)
+ .filter(
+ (type) ->
+ type.getRawType().getClass().isInstance(BaseMapper.class)
+ )
+ .findFirst()
+ .map(type -> type.getActualTypeArguments()[0])
+ .filter(Class.class::isInstance).map(Class.class::cast)
+ .orElseThrow(() -> new IllegalStateException(
+ "not find BaseMapper type " + providerContext.getMapperType().getName() + "."));
+ }
+
+ public TableInfo tableInfo()
+ throws IllegalAccessException, InvocationTargetException {
+ Class> clazz = entityType();
+ TableParser tableParser = new TableParser(clazz);
+ return tableParser.parser(parameter);
+ }
+
+ public TableInfo nullTableInfo()
+ throws IllegalAccessException, InvocationTargetException {
+ Class> clazz = entityType();
+ TableParser tableParser = new TableParser(clazz);
+ return tableParser.parser(null);
+ }
+
+}
diff --git a/src/main/java/com/codingapi/simplemybatis/provider/builder/BasicAutoGeneratorSQLBuilder.java b/src/main/java/com/codingapi/simplemybatis/provider/builder/BasicAutoGeneratorSQLBuilder.java
new file mode 100644
index 0000000..d988426
--- /dev/null
+++ b/src/main/java/com/codingapi/simplemybatis/provider/builder/BasicAutoGeneratorSQLBuilder.java
@@ -0,0 +1,28 @@
+package com.codingapi.simplemybatis.provider.builder;
+
+import com.codingapi.simplemybatis.parser.TableInfo;
+import com.codingapi.simplemybatis.provider.AutoGeneratorSQLBuilder;
+import com.codingapi.simplemybatis.provider.SimpleProviderContext;
+
+import java.lang.reflect.InvocationTargetException;
+
+/**
+ * @author lorne
+ * @since 1.0.0
+ */
+public class BasicAutoGeneratorSQLBuilder implements AutoGeneratorSQLBuilder {
+
+ @Override
+ public String create(SimpleProviderContext simpleProviderContext) throws IllegalAccessException, InvocationTargetException {
+ TableInfo tableInfo = simpleProviderContext.nullTableInfo();
+ BasicTableBuilder builder = new BasicTableBuilder(tableInfo);
+ builder.builder();
+ return builder.sql();
+ }
+
+ @Override
+ public String drop(SimpleProviderContext simpleProviderContext) throws IllegalAccessException, InvocationTargetException {
+ TableInfo tableInfo = simpleProviderContext.nullTableInfo();
+ return "drop table "+tableInfo.getTableName();
+ }
+}
diff --git a/src/main/java/com/codingapi/simplemybatis/provider/builder/BasicCommandSQLBuilder.java b/src/main/java/com/codingapi/simplemybatis/provider/builder/BasicCommandSQLBuilder.java
new file mode 100644
index 0000000..6ce7698
--- /dev/null
+++ b/src/main/java/com/codingapi/simplemybatis/provider/builder/BasicCommandSQLBuilder.java
@@ -0,0 +1,65 @@
+package com.codingapi.simplemybatis.provider.builder;
+
+import com.codingapi.simplemybatis.parser.TableInfo;
+import com.codingapi.simplemybatis.provider.CommandSQLBuilder;
+import com.codingapi.simplemybatis.provider.SimpleProviderContext;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author lorne
+ * @since 1.0.0
+ */
+public class BasicCommandSQLBuilder implements CommandSQLBuilder {
+
+
+ @Override
+ public String insertSql(SimpleProviderContext context) throws IllegalAccessException, InvocationTargetException {
+ TableInfo tableInfo = context.tableInfo();
+ BasicSqlParser basicSqlParser = new BasicSqlParser(tableInfo);
+ return basicSqlParser.createInsertSql();
+ }
+
+ @Override
+ public String insertAllSql(SimpleProviderContext simpleProviderContext) throws IllegalAccessException, InvocationTargetException {
+ List list = (List) simpleProviderContext.getParameter(Map.class).get("list");
+ if (list == null || list.size() == 0) {
+ throw new RuntimeException("not data.");
+ }
+ BasicSqlParser basicSqlParser = new BasicSqlParser(simpleProviderContext.nullTableInfo());
+ return basicSqlParser.createInsertAllSql(list);
+ }
+
+ @Override
+ public String deleteSql(SimpleProviderContext simpleProviderContext)throws IllegalAccessException, InvocationTargetException {
+ BasicSqlParser basicSqlParser = new BasicSqlParser(simpleProviderContext.nullTableInfo());
+ return basicSqlParser.createDeleteSql();
+ }
+
+ @Override
+ public String deleteByIdSql(SimpleProviderContext simpleProviderContext) throws IllegalAccessException, InvocationTargetException {
+ BasicSqlParser basicSqlParser = new BasicSqlParser(simpleProviderContext.nullTableInfo());
+ return basicSqlParser.createDeleteSql();
+ }
+
+
+ @Override
+ public String deleteAllByIdSql(SimpleProviderContext simpleProviderContext) throws IllegalAccessException, InvocationTargetException {
+ BasicSqlParser basicSqlParser = new BasicSqlParser(simpleProviderContext.nullTableInfo());
+ return basicSqlParser.createDeleteAllByIdSql();
+ }
+
+ @Override
+ public String deleteAllSql(SimpleProviderContext simpleProviderContext) throws IllegalAccessException, InvocationTargetException {
+ BasicSqlParser basicSqlParser = new BasicSqlParser(simpleProviderContext.nullTableInfo());
+ return basicSqlParser.createDeleteAllSql();
+ }
+
+ @Override
+ public String updateSql(SimpleProviderContext simpleProviderContext) throws IllegalAccessException, InvocationTargetException {
+ BasicSqlParser basicSqlParser = new BasicSqlParser(simpleProviderContext.tableInfo());
+ return basicSqlParser.createUpdateSql();
+ }
+}
diff --git a/src/main/java/com/codingapi/simplemybatis/provider/builder/BasicQuerySQLBuilder.java b/src/main/java/com/codingapi/simplemybatis/provider/builder/BasicQuerySQLBuilder.java
new file mode 100644
index 0000000..7a88f54
--- /dev/null
+++ b/src/main/java/com/codingapi/simplemybatis/provider/builder/BasicQuerySQLBuilder.java
@@ -0,0 +1,41 @@
+package com.codingapi.simplemybatis.provider.builder;
+
+import com.codingapi.simplemybatis.provider.QuerySQLBuilder;
+import com.codingapi.simplemybatis.provider.SimpleProviderContext;
+import com.codingapi.simplemybatis.query.Query;
+import com.codingapi.simplemybatis.query.SqlBuilder;
+
+import java.lang.reflect.InvocationTargetException;
+
+/**
+ * @author lorne
+ * @since 1.0.0
+ */
+public class BasicQuerySQLBuilder implements QuerySQLBuilder {
+
+ @Override
+ public String getById(SimpleProviderContext simpleProviderContext) throws IllegalAccessException, InvocationTargetException {
+ BasicSqlParser basicSqlParser = new BasicSqlParser(simpleProviderContext.nullTableInfo());
+ return basicSqlParser.createGetByIdSql();
+ }
+
+ @Override
+ public String findAll(SimpleProviderContext simpleProviderContext) throws IllegalAccessException, InvocationTargetException {
+ BasicSqlParser basicSqlParser = new BasicSqlParser(simpleProviderContext.nullTableInfo());
+ return basicSqlParser.createSelectAll();
+ }
+
+ @Override
+ public String query(SimpleProviderContext simpleProviderContext) throws IllegalAccessException, InvocationTargetException {
+ BasicSqlParser basicSqlParser = new BasicSqlParser(simpleProviderContext.nullTableInfo());
+ Query query = simpleProviderContext.getParameter(Query.class);
+ return basicSqlParser.createQuery(query);
+ }
+
+ @Override
+ public String queryView(SimpleProviderContext simpleProviderContext) throws IllegalAccessException, InvocationTargetException {
+ Query query = simpleProviderContext.getParameter(Query.class);
+ SqlBuilder sqlBuilder = new SqlBuilder(query.getSelect(), null, query);
+ return sqlBuilder.getSql();
+ }
+}
diff --git a/src/main/java/com/codingapi/simplemybatis/provider/builder/BasicSqlBuilder.java b/src/main/java/com/codingapi/simplemybatis/provider/builder/BasicSqlBuilder.java
new file mode 100644
index 0000000..3ea8a70
--- /dev/null
+++ b/src/main/java/com/codingapi/simplemybatis/provider/builder/BasicSqlBuilder.java
@@ -0,0 +1,16 @@
+package com.codingapi.simplemybatis.provider.builder;
+
+import com.codingapi.simplemybatis.provider.SimpleMybatisProviderContext;
+
+/**
+ * @author lorne
+ * @since 1.0.0
+ */
+public class BasicSqlBuilder {
+
+ static {
+ SimpleMybatisProviderContext.getInstance().registerSQLBuilder(new BasicCommandSQLBuilder());
+ SimpleMybatisProviderContext.getInstance().registerSQLBuilder(new BasicQuerySQLBuilder());
+ SimpleMybatisProviderContext.getInstance().registerSQLBuilder(new BasicAutoGeneratorSQLBuilder());
+ }
+}
diff --git a/src/main/java/com/codingapi/simplemybatis/parser/SqlParser.java b/src/main/java/com/codingapi/simplemybatis/provider/builder/BasicSqlParser.java
similarity index 96%
rename from src/main/java/com/codingapi/simplemybatis/parser/SqlParser.java
rename to src/main/java/com/codingapi/simplemybatis/provider/builder/BasicSqlParser.java
index f1c7a99..7f243ce 100644
--- a/src/main/java/com/codingapi/simplemybatis/parser/SqlParser.java
+++ b/src/main/java/com/codingapi/simplemybatis/provider/builder/BasicSqlParser.java
@@ -1,16 +1,17 @@
-package com.codingapi.simplemybatis.parser;
+package com.codingapi.simplemybatis.provider.builder;
+import com.codingapi.simplemybatis.parser.TableInfo;
import com.codingapi.simplemybatis.query.Query;
import com.codingapi.simplemybatis.query.SqlBuilder;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
-public class SqlParser {
+public class BasicSqlParser {
private TableInfo tableInfo;
- public SqlParser(TableInfo tableInfo) {
+ public BasicSqlParser(TableInfo tableInfo) {
this.tableInfo = tableInfo;
}
@@ -57,17 +58,6 @@ public String createUpdateSql() {
return stringBuilder.toString();
}
- public String createDeleteSql() {
- StringBuilder stringBuilder = new StringBuilder();
- stringBuilder.append("delete from ");
- stringBuilder.append(tableInfo.getTableName());
- stringBuilder.append(" where ");
- stringBuilder.append(tableInfo.getIdColumnFiled().getColumnName());
- stringBuilder.append("=");
- stringBuilder.append("#{").append(tableInfo.getIdColumnFiled().getFieldName()).append("}");
- return stringBuilder.toString();
- }
-
public String createInsertAllSql(List list)
throws InvocationTargetException, IllegalAccessException {
@@ -90,6 +80,17 @@ public String createInsertAllSql(List list)
return stringBuilder.toString();
}
+ public String createDeleteSql() {
+ StringBuilder stringBuilder = new StringBuilder();
+ stringBuilder.append("delete from ");
+ stringBuilder.append(tableInfo.getTableName());
+ stringBuilder.append(" where ");
+ stringBuilder.append(tableInfo.getIdColumnFiled().getColumnName());
+ stringBuilder.append("=");
+ stringBuilder.append("#{").append(tableInfo.getIdColumnFiled().getFieldName()).append("}");
+ return stringBuilder.toString();
+ }
+
public String createDeleteAllSql() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("