浏览代码

增加字段到列名的映射

mxd 4 年之前
父节点
当前提交
fcaeefc58a

+ 25 - 9
src/main/java/org/ssssssss/magicapi/adapter/ColumnMapperAdapter.java

@@ -5,31 +5,47 @@ import org.ssssssss.magicapi.provider.ColumnMapperProvider;
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.function.Function;
 
 public class ColumnMapperAdapter {
 
-	private Map<String, RowMapper<Map<String, Object>>> mappers = new HashMap<>();
+	private Map<String, RowMapper<Map<String, Object>>> columnMapRowMappers = new HashMap<>();
 
-	private RowMapper<Map<String, Object>> defaultMapper;
+	private Map<String, Function<String, String>> rowMapColumnMappers = new HashMap<>();
+
+	private RowMapper<Map<String, Object>> mapRowColumnMapper;
+
+	private Function<String, String> rowMapColumnMapper;
 
 	public void add(ColumnMapperProvider columnMapperProvider) {
-		mappers.put(columnMapperProvider.name(), columnMapperProvider.getColumnMapRowMapper());
+		columnMapRowMappers.put(columnMapperProvider.name(), columnMapperProvider.getColumnMapRowMapper());
+		rowMapColumnMappers.put(columnMapperProvider.name(), columnMapperProvider.getRowMapColumnMapper());
 	}
 
 	public void setDefault(ColumnMapperProvider columnMapperProvider) {
-		this.defaultMapper = columnMapperProvider.getColumnMapRowMapper();
+		this.mapRowColumnMapper = columnMapperProvider.getColumnMapRowMapper();
+		this.rowMapColumnMapper = columnMapperProvider.getRowMapColumnMapper();
 		add(columnMapperProvider);
 	}
 
 	public void setDefault(String name) {
-		this.defaultMapper = get(name);
+		this.mapRowColumnMapper = getColumnMapRowMapper(name);
+		this.rowMapColumnMapper = getRowMapColumnMapper(name);
+	}
+
+	public RowMapper<Map<String, Object>> getDefaultColumnMapRowMapper() {
+		return this.mapRowColumnMapper;
+	}
+
+	public Function<String, String> getDefaultRowMapColumnMapper() {
+		return this.rowMapColumnMapper;
 	}
 
-	public RowMapper<Map<String, Object>> getDefault() {
-		return this.defaultMapper;
+	public RowMapper<Map<String, Object>> getColumnMapRowMapper(String name) {
+		return columnMapRowMappers.getOrDefault(name, mapRowColumnMapper);
 	}
 
-	public RowMapper<Map<String, Object>> get(String name) {
-		return mappers.getOrDefault(name, defaultMapper);
+	public Function<String, String> getRowMapColumnMapper(String name) {
+		return rowMapColumnMappers.getOrDefault(name, rowMapColumnMapper);
 	}
 }

+ 18 - 8
src/main/java/org/ssssssss/magicapi/functions/SQLExecutor.java

@@ -52,7 +52,10 @@ public class SQLExecutor extends HashMap<String, SQLExecutor> implements MagicMo
 	private DialectAdapter dialectAdapter;
 
 	@UnableCall
-	private RowMapper<Map<String, Object>> rowMapper;
+	private RowMapper<Map<String, Object>> columnMapRowMapper;
+
+	@UnableCall
+	private Function<String, String> rowMapColumnMapper;
 
 	@UnableCall
 	private SqlCache sqlCache;
@@ -93,8 +96,13 @@ public class SQLExecutor extends HashMap<String, SQLExecutor> implements MagicMo
 	}
 
 	@UnableCall
-	public void setRowMapper(RowMapper<Map<String, Object>> rowMapper) {
-		this.rowMapper = rowMapper;
+	public void setColumnMapRowMapper(RowMapper<Map<String, Object>> columnMapRowMapper) {
+		this.columnMapRowMapper = columnMapRowMapper;
+	}
+
+	@UnableCall
+	public void setRowMapColumnMapper(Function<String, String> rowMapColumnMapper) {
+		this.rowMapColumnMapper = rowMapColumnMapper;
 	}
 
 	private void setDynamicDataSource(MagicDynamicDataSource dynamicDataSource) {
@@ -125,7 +133,8 @@ public class SQLExecutor extends HashMap<String, SQLExecutor> implements MagicMo
 		sqlExecutor.setDataSourceNode(this.dataSourceNode);
 		sqlExecutor.setPageProvider(this.pageProvider);
 		sqlExecutor.setColumnMapperProvider(this.columnMapperAdapter);
-		sqlExecutor.setRowMapper(this.rowMapper);
+		sqlExecutor.setColumnMapRowMapper(this.columnMapRowMapper);
+		sqlExecutor.setRowMapColumnMapper(this.rowMapColumnMapper);
 		sqlExecutor.setSqlCache(this.sqlCache);
 		sqlExecutor.setTtl(this.ttl);
 		sqlExecutor.setResultProvider(this.resultProvider);
@@ -232,7 +241,8 @@ public class SQLExecutor extends HashMap<String, SQLExecutor> implements MagicMo
 	@Comment("指定列名转换")
 	public SQLExecutor columnCase(String name) {
 		SQLExecutor sqlExecutor = cloneSQLExecutor();
-		sqlExecutor.setRowMapper(this.columnMapperAdapter.get(name));
+		sqlExecutor.setColumnMapRowMapper(this.columnMapperAdapter.getColumnMapRowMapper(name));
+		sqlExecutor.setRowMapColumnMapper(this.columnMapperAdapter.getRowMapColumnMapper(name));
 		return sqlExecutor;
 	}
 
@@ -258,7 +268,7 @@ public class SQLExecutor extends HashMap<String, SQLExecutor> implements MagicMo
 	public List<Map<String, Object>> select(@Comment("`SQL`语句") String sql) {
 		BoundSql boundSql = new BoundSql(sql);
 		return (List<Map<String, Object>>) boundSql.getCacheValue(this.sqlCache, this.cacheName)
-				.orElseGet(() -> putCacheValue(dataSourceNode.getJdbcTemplate().query(boundSql.getSql(), this.rowMapper, boundSql.getParameters()), boundSql));
+				.orElseGet(() -> putCacheValue(dataSourceNode.getJdbcTemplate().query(boundSql.getSql(), this.columnMapRowMapper, boundSql.getParameters()), boundSql));
 	}
 
 	/**
@@ -394,7 +404,7 @@ public class SQLExecutor extends HashMap<String, SQLExecutor> implements MagicMo
 		if (count > 0) {
 			String pageSql = dialect.getPageSql(boundSql.getSql(), boundSql, offset, limit);
 			list = (List<Object>) boundSql.removeCacheKey().getCacheValue(this.sqlCache, this.cacheName)
-					.orElseGet(() -> putCacheValue(dataSourceNode.getJdbcTemplate().query(pageSql, this.rowMapper, boundSql.getParameters()), boundSql));
+					.orElseGet(() -> putCacheValue(dataSourceNode.getJdbcTemplate().query(pageSql, this.columnMapRowMapper, boundSql.getParameters()), boundSql));
 		}
 		return resultProvider.buildPageResult(count, list);
 	}
@@ -417,7 +427,7 @@ public class SQLExecutor extends HashMap<String, SQLExecutor> implements MagicMo
 		BoundSql boundSql = new BoundSql(sql);
 		return (Map<String, Object>) boundSql.getCacheValue(this.sqlCache, this.cacheName)
 				.orElseGet(() -> {
-					List<Map<String, Object>> list = dataSourceNode.getJdbcTemplate().query(boundSql.getSql(), this.rowMapper, boundSql.getParameters());
+					List<Map<String, Object>> list = dataSourceNode.getJdbcTemplate().query(boundSql.getSql(), this.columnMapRowMapper, boundSql.getParameters());
 					return list != null && list.size() > 0 ? list.get(0) : null;
 				});
 	}

+ 11 - 2
src/main/java/org/ssssssss/magicapi/provider/ColumnMapperProvider.java

@@ -4,6 +4,7 @@ import org.springframework.jdbc.core.ColumnMapRowMapper;
 
 import java.util.LinkedHashMap;
 import java.util.Map;
+import java.util.function.Function;
 
 public interface ColumnMapperProvider {
 
@@ -11,8 +12,16 @@ public interface ColumnMapperProvider {
 
 	String mapping(String columnName);
 
-	default ColumnMapRowMapper getColumnMapRowMapper(){
-		return new ColumnMapRowMapper(){
+	default String unmapping(String name) {
+		return name;
+	}
+
+	default Function<String, String> getRowMapColumnMapper() {
+		return this::mapping;
+	}
+
+	default ColumnMapRowMapper getColumnMapRowMapper() {
+		return new ColumnMapRowMapper() {
 			@Override
 			protected Map<String, Object> createColumnMap(int columnCount) {
 				return new LinkedHashMap<>(columnCount);

+ 13 - 0
src/main/java/org/ssssssss/magicapi/provider/impl/CamelColumnMapperProvider.java

@@ -33,4 +33,17 @@ public class CamelColumnMapperProvider implements ColumnMapperProvider {
 		}
 		return sb.toString();
 	}
+
+	@Override
+	public String unmapping(String name) {
+		StringBuilder sb = new StringBuilder();
+		for (int i = 0; i < name.length(); i++) {
+			char ch = name.charAt(i);
+			if (Character.isUpperCase(ch)) {
+				sb.append("_");
+			}
+			sb.append(Character.toLowerCase(ch));
+		}
+		return sb.toString();
+	}
 }

+ 13 - 0
src/main/java/org/ssssssss/magicapi/provider/impl/PascalColumnMapperProvider.java

@@ -33,4 +33,17 @@ public class PascalColumnMapperProvider implements ColumnMapperProvider {
 		}
 		return sb.toString();
 	}
+
+	@Override
+	public String unmapping(String name) {
+		StringBuilder sb = new StringBuilder();
+		for (int i = 0; i < name.length(); i++) {
+			char ch = name.charAt(i);
+			if (i > 0 && Character.isUpperCase(ch)) {
+				sb.append("_");
+			}
+			sb.append(Character.toLowerCase(ch));
+		}
+		return sb.toString();
+	}
 }

+ 1 - 0
src/main/java/org/ssssssss/magicapi/provider/impl/UpperColumnMapperProvider.java

@@ -16,4 +16,5 @@ public class UpperColumnMapperProvider implements ColumnMapperProvider {
 	public String mapping(String columnName) {
 		return columnName.toUpperCase();
 	}
+
 }