瀏覽代碼

修改版本号、自定义方言、自定义列名转换

mxd 4 年之前
父節點
當前提交
7177029931
共有 21 個文件被更改,包括 447 次插入168 次删除
  1. 2 2
      pom.xml
  2. 35 0
      src/main/java/org/ssssssss/magicapi/adapter/ColumnMapperAdapter.java
  3. 46 0
      src/main/java/org/ssssssss/magicapi/adapter/DialectAdapter.java
  4. 0 110
      src/main/java/org/ssssssss/magicapi/config/DynamicDataSource.java
  5. 104 1
      src/main/java/org/ssssssss/magicapi/config/MagicDynamicDataSource.java
  6. 9 0
      src/main/java/org/ssssssss/magicapi/dialect/ClickhouseDialect.java
  7. 5 0
      src/main/java/org/ssssssss/magicapi/dialect/DB2Dialect.java
  8. 5 0
      src/main/java/org/ssssssss/magicapi/dialect/Dialect.java
  9. 0 43
      src/main/java/org/ssssssss/magicapi/dialect/DialectUtils.java
  10. 5 0
      src/main/java/org/ssssssss/magicapi/dialect/MySQLDialect.java
  11. 5 0
      src/main/java/org/ssssssss/magicapi/dialect/OracleDialect.java
  12. 5 0
      src/main/java/org/ssssssss/magicapi/dialect/PostgreSQLDialect.java
  13. 5 0
      src/main/java/org/ssssssss/magicapi/dialect/SQLServer2005Dialect.java
  14. 5 0
      src/main/java/org/ssssssss/magicapi/dialect/SQLServerDialect.java
  15. 59 12
      src/main/java/org/ssssssss/magicapi/functions/SQLExecutor.java
  16. 28 0
      src/main/java/org/ssssssss/magicapi/provider/ColumnMapperProvider.java
  17. 36 0
      src/main/java/org/ssssssss/magicapi/provider/impl/CamelColumnMapperProvider.java
  18. 19 0
      src/main/java/org/ssssssss/magicapi/provider/impl/DefaultColumnMapperProvider.java
  19. 19 0
      src/main/java/org/ssssssss/magicapi/provider/impl/LowerColumnMapperProvider.java
  20. 36 0
      src/main/java/org/ssssssss/magicapi/provider/impl/PascalColumnMapperProvider.java
  21. 19 0
      src/main/java/org/ssssssss/magicapi/provider/impl/UpperColumnMapperProvider.java

+ 2 - 2
pom.xml

@@ -11,7 +11,7 @@
     </parent>
     <groupId>org.ssssssss</groupId>
     <artifactId>magic-api</artifactId>
-    <version>0.4.7</version>
+    <version>0.5.0</version>
     <packaging>jar</packaging>
     <name>magic-api</name>
     <description>auto generate http api</description>
@@ -38,7 +38,7 @@
         <dependency>
             <groupId>org.ssssssss</groupId>
             <artifactId>magic-script</artifactId>
-            <version>1.3.1</version>
+            <version>1.3.2</version>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>

+ 35 - 0
src/main/java/org/ssssssss/magicapi/adapter/ColumnMapperAdapter.java

@@ -0,0 +1,35 @@
+package org.ssssssss.magicapi.adapter;
+
+import org.springframework.jdbc.core.RowMapper;
+import org.ssssssss.magicapi.provider.ColumnMapperProvider;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class ColumnMapperAdapter {
+
+	private Map<String, RowMapper<Map<String, Object>>> mappers = new HashMap<>();
+
+	private RowMapper<Map<String, Object>> defaultMapper;
+
+	public void add(ColumnMapperProvider columnMapperProvider) {
+		mappers.put(columnMapperProvider.name(), columnMapperProvider.getColumnMapRowMapper());
+	}
+
+	public void setDefault(ColumnMapperProvider columnMapperProvider) {
+		this.defaultMapper = columnMapperProvider.getColumnMapRowMapper();
+		add(columnMapperProvider);
+	}
+
+	public void setDefault(String name) {
+		this.defaultMapper = get(name);
+	}
+
+	public RowMapper<Map<String, Object>> getDefault() {
+		return this.defaultMapper;
+	}
+
+	public RowMapper<Map<String, Object>> get(String name) {
+		return mappers.getOrDefault(name, defaultMapper);
+	}
+}

+ 46 - 0
src/main/java/org/ssssssss/magicapi/adapter/DialectAdapter.java

@@ -0,0 +1,46 @@
+package org.ssssssss.magicapi.adapter;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.ssssssss.magicapi.dialect.Dialect;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class DialectAdapter {
+
+	private static Logger logger = LoggerFactory.getLogger(DialectAdapter.class);
+
+	private List<Dialect> dialectList = new ArrayList<>();
+
+	/**
+	 * 缓存已解析的方言
+	 */
+	private Map<String, Dialect> dialectMap = new ConcurrentHashMap<>();
+
+	public void add(Dialect dialect){
+		this.dialectList.add(dialect);
+	}
+
+	/**
+	 * 获取数据库方言
+	 */
+	public Dialect getDialectFromUrl(String fromUrl) {
+		Dialect cached = dialectMap.get(fromUrl);
+		if (cached == null && !dialectMap.containsKey(fromUrl)) {
+			for (Dialect dialect : dialectList) {
+				if (dialect.match(fromUrl)) {
+					cached = dialect;
+					break;
+				}
+			}
+			if (cached == null) {
+				logger.warn(String.format("magic-api在%s中无法获取dialect", fromUrl));
+			}
+			dialectMap.put(fromUrl, cached);
+		}
+		return cached;
+	}
+}

+ 0 - 110
src/main/java/org/ssssssss/magicapi/config/DynamicDataSource.java

@@ -1,110 +0,0 @@
-package org.ssssssss.magicapi.config;
-
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.jdbc.datasource.DataSourceTransactionManager;
-import org.ssssssss.magicapi.utils.Assert;
-
-import javax.sql.DataSource;
-import java.util.*;
-
-/**
- * 动态数据源
- */
-@Deprecated
-public class DynamicDataSource {
-
-    private static Logger logger = LoggerFactory.getLogger(DynamicDataSource.class);
-
-    private Map<String, DataSourceNode> dataSourceMap = new HashMap<>();
-
-    /**
-     * 注册默认数据源
-     */
-    public void put(DataSource dataSource) {
-        put(null, dataSource);
-    }
-
-    /**
-     * 注册数据源(可以运行时注册)
-     *
-     * @param dataSourceName 数据源名称
-     */
-    public void put(String dataSourceName, DataSource dataSource) {
-        if (dataSourceName == null) {
-            dataSourceName = "";
-        }
-        logger.info("注册数据源:{}", StringUtils.isNotBlank(dataSourceName) ? dataSourceName : "default");
-        this.dataSourceMap.put(dataSourceName, new DataSourceNode(dataSource));
-    }
-
-    /**
-     * 获取全部数据源
-     */
-    public List<String> datasources(){
-        return new ArrayList<>(this.dataSourceMap.keySet());
-    }
-
-    /**
-     * 删除数据源
-     * @param datasourceName    数据源名称
-     */
-    public boolean delete(String datasourceName){
-        boolean result = false;
-        // 检查参数是否合法
-        if(datasourceName != null && !datasourceName.isEmpty()){
-            result = this.dataSourceMap.remove(datasourceName) != null;
-        }
-        logger.info("删除数据源:{}:{}", datasourceName, result ? "成功" : "失败");
-        return result;
-    }
-
-    /**
-     * 获取默认数据源
-     * @return
-     */
-    public DataSourceNode getDataSource() {
-        return getDataSource(null);
-    }
-
-    /**
-     * 获取数据源
-     * @param dataSourceName    数据源名称
-     */
-    public DataSourceNode getDataSource(String dataSourceName) {
-        if (dataSourceName == null) {
-            dataSourceName = "";
-        }
-        DataSourceNode dataSourceNode = dataSourceMap.get(dataSourceName);
-        Assert.isNotNull(dataSourceNode, String.format("找不到数据源%s", dataSourceName));
-        return dataSourceNode;
-    }
-
-    public static class DataSourceNode {
-
-        /**
-         * 事务管理器
-         */
-        private DataSourceTransactionManager dataSourceTransactionManager;
-
-        private JdbcTemplate jdbcTemplate;
-
-        private DataSource dataSource;
-
-        public DataSourceNode(DataSource dataSource) {
-            this.dataSource = dataSource;
-            this.dataSourceTransactionManager = new DataSourceTransactionManager(this.dataSource);
-            this.jdbcTemplate = new JdbcTemplate(dataSource);
-        }
-
-        public JdbcTemplate getJdbcTemplate(){
-            return this.jdbcTemplate;
-        }
-
-        public DataSourceTransactionManager getDataSourceTransactionManager() {
-            return dataSourceTransactionManager;
-        }
-    }
-}

+ 104 - 1
src/main/java/org/ssssssss/magicapi/config/MagicDynamicDataSource.java

@@ -1,8 +1,111 @@
 package org.ssssssss.magicapi.config;
 
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+import org.ssssssss.magicapi.utils.Assert;
+
 import javax.sql.DataSource;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class MagicDynamicDataSource {
+
+	private static Logger logger = LoggerFactory.getLogger(MagicDynamicDataSource.class);
+
+	private Map<String, MagicDynamicDataSource.DataSourceNode> dataSourceMap = new HashMap<>();
+
+	/**
+	 * 注册默认数据源
+	 */
+	public void put(DataSource dataSource) {
+		put(null, dataSource);
+	}
+
+	/**
+	 * 注册数据源(可以运行时注册)
+	 *
+	 * @param dataSourceName 数据源名称
+	 */
+	public void put(String dataSourceName, DataSource dataSource) {
+		if (dataSourceName == null) {
+			dataSourceName = "";
+		}
+		logger.info("注册数据源:{}", StringUtils.isNotBlank(dataSourceName) ? dataSourceName : "default");
+		this.dataSourceMap.put(dataSourceName, new MagicDynamicDataSource.DataSourceNode(dataSource));
+	}
+
+	/**
+	 * 获取全部数据源
+	 */
+	public List<String> datasources(){
+		return new ArrayList<>(this.dataSourceMap.keySet());
+	}
+
+	/**
+	 * 删除数据源
+	 * @param datasourceName    数据源名称
+	 */
+	public boolean delete(String datasourceName){
+		boolean result = false;
+		// 检查参数是否合法
+		if(datasourceName != null && !datasourceName.isEmpty()){
+			result = this.dataSourceMap.remove(datasourceName) != null;
+		}
+		logger.info("删除数据源:{}:{}", datasourceName, result ? "成功" : "失败");
+		return result;
+	}
 
-public class MagicDynamicDataSource extends DynamicDataSource {
+	/**
+	 * 获取默认数据源
+	 * @return
+	 */
+	public MagicDynamicDataSource.DataSourceNode getDataSource() {
+		return getDataSource(null);
+	}
+
+	/**
+	 * 获取数据源
+	 * @param dataSourceName    数据源名称
+	 */
+	public MagicDynamicDataSource.DataSourceNode getDataSource(String dataSourceName) {
+		if (dataSourceName == null) {
+			dataSourceName = "";
+		}
+		MagicDynamicDataSource.DataSourceNode dataSourceNode = dataSourceMap.get(dataSourceName);
+		Assert.isNotNull(dataSourceNode, String.format("找不到数据源%s", dataSourceName));
+		return dataSourceNode;
+	}
+
+	public static class DataSourceNode {
+
+		/**
+		 * 事务管理器
+		 */
+		private DataSourceTransactionManager dataSourceTransactionManager;
+
+		private JdbcTemplate jdbcTemplate;
+
+		private DataSource dataSource;
+
+		public DataSourceNode(DataSource dataSource) {
+			this.dataSource = dataSource;
+			this.dataSourceTransactionManager = new DataSourceTransactionManager(this.dataSource);
+			this.jdbcTemplate = new JdbcTemplate(dataSource);
+		}
+
+		public JdbcTemplate getJdbcTemplate(){
+			return this.jdbcTemplate;
+		}
+
+		public DataSourceTransactionManager getDataSourceTransactionManager() {
+			return dataSourceTransactionManager;
+		}
+	}
 
 	public void setDefault(DataSource dataSource) {
 		put(dataSource);

+ 9 - 0
src/main/java/org/ssssssss/magicapi/dialect/ClickhouseDialect.java

@@ -0,0 +1,9 @@
+package org.ssssssss.magicapi.dialect;
+
+public class ClickhouseDialect extends MySQLDialect{
+
+	@Override
+	public boolean match(String jdbcUrl) {
+		return jdbcUrl.contains(":clickhouse:");
+	}
+}

+ 5 - 0
src/main/java/org/ssssssss/magicapi/dialect/DB2Dialect.java

@@ -4,6 +4,11 @@ package org.ssssssss.magicapi.dialect;
 import org.ssssssss.magicapi.functions.BoundSql;
 
 public class DB2Dialect implements Dialect {
+    @Override
+    public boolean match(String jdbcUrl) {
+        return jdbcUrl.contains(":db2:");
+    }
+
     @Override
     public String getPageSql(String sql, BoundSql boundSql, long offset, long limit) {
         boundSql.addParameter(offset + 1);

+ 5 - 0
src/main/java/org/ssssssss/magicapi/dialect/Dialect.java

@@ -5,6 +5,11 @@ import org.ssssssss.magicapi.functions.BoundSql;
 
 public interface Dialect {
 
+    /**
+     * 根据jdbcUrl匹配
+     */
+    boolean match(String jdbcUrl);
+
     /**
      * 获取查总数的sql
      */

+ 0 - 43
src/main/java/org/ssssssss/magicapi/dialect/DialectUtils.java

@@ -1,43 +0,0 @@
-package org.ssssssss.magicapi.dialect;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-public class DialectUtils {
-
-    private static Logger logger = LoggerFactory.getLogger(DialectUtils.class);
-
-    /**
-     * 缓存已解析的方言
-     */
-    private static Map<String, Dialect> dialectMap = new ConcurrentHashMap<>();
-
-    /**
-     * 获取数据库方言
-     */
-    public static Dialect getDialectFromUrl(String fromUrl) {
-        Dialect dialect = dialectMap.get(fromUrl);
-        if (dialect == null && !dialectMap.containsKey(fromUrl)) {
-            if (fromUrl.contains(":mysql:") || fromUrl.contains(":cobar:") || fromUrl.contains("jdbc:mariadb:") || fromUrl.contains(":clickhouse:")) {
-                dialect = new MySQLDialect();
-            } else if (fromUrl.contains(":oracle:")) {
-                dialect = new OracleDialect();
-            } else if (fromUrl.contains(":sqlserver:")) {
-                dialect = new SQLServer2005Dialect();
-            } else if (fromUrl.contains(":sqlserver2012:")) {
-                dialect = new SQLServerDialect();
-            } else if (fromUrl.contains(":postgresql:")) {
-                dialect = new PostgreSQLDialect();
-            } else if (fromUrl.contains(":db2:")) {
-                dialect = new DB2Dialect();
-            } else {
-                logger.warn(String.format("magic-api在%s中无法获取dialect", fromUrl));
-            }
-            dialectMap.put(fromUrl, dialect);
-        }
-        return dialect;
-    }
-}

+ 5 - 0
src/main/java/org/ssssssss/magicapi/dialect/MySQLDialect.java

@@ -5,6 +5,11 @@ import org.ssssssss.magicapi.functions.BoundSql;
 
 public class MySQLDialect implements Dialect {
 
+    @Override
+    public boolean match(String jdbcUrl) {
+        return jdbcUrl.contains(":mysql:") || jdbcUrl.contains(":mariadb:") || jdbcUrl.contains(":cobar:");
+    }
+
     @Override
     public String getPageSql(String sql, BoundSql boundSql, long offset, long limit) {
         boundSql.addParameter(offset);

+ 5 - 0
src/main/java/org/ssssssss/magicapi/dialect/OracleDialect.java

@@ -5,6 +5,11 @@ import org.ssssssss.magicapi.functions.BoundSql;
 
 public class OracleDialect implements Dialect {
 
+    @Override
+    public boolean match(String jdbcUrl) {
+        return jdbcUrl.contains(":oracle:");
+    }
+
     @Override
     public String getPageSql(String sql, BoundSql boundSql, long offset, long limit) {
         limit = (offset >= 1) ? (offset + limit) : limit;

+ 5 - 0
src/main/java/org/ssssssss/magicapi/dialect/PostgreSQLDialect.java

@@ -4,6 +4,11 @@ package org.ssssssss.magicapi.dialect;
 import org.ssssssss.magicapi.functions.BoundSql;
 
 public class PostgreSQLDialect implements Dialect {
+    @Override
+    public boolean match(String jdbcUrl) {
+        return jdbcUrl.contains(":postgresql:");
+    }
+
     @Override
     public String getPageSql(String sql, BoundSql boundSql, long offset, long limit) {
         boundSql.addParameter(limit);

+ 5 - 0
src/main/java/org/ssssssss/magicapi/dialect/SQLServer2005Dialect.java

@@ -4,6 +4,11 @@ import org.apache.commons.lang3.StringUtils;
 import org.ssssssss.magicapi.functions.BoundSql;
 
 public class SQLServer2005Dialect implements Dialect {
+    @Override
+    public boolean match(String jdbcUrl) {
+        return jdbcUrl.contains(":sqlserver:");
+    }
+
     @Override
     public String getPageSql(String sql, BoundSql boundSql, long offset, long limit) {
         StringBuilder pagingBuilder = new StringBuilder();

+ 5 - 0
src/main/java/org/ssssssss/magicapi/dialect/SQLServerDialect.java

@@ -4,6 +4,11 @@ package org.ssssssss.magicapi.dialect;
 import org.ssssssss.magicapi.functions.BoundSql;
 
 public class SQLServerDialect implements Dialect {
+    @Override
+    public boolean match(String jdbcUrl) {
+        return jdbcUrl.contains(":sqlserver2012:");
+    }
+
     @Override
     public String getPageSql(String sql, BoundSql boundSql, long offset, long limit) {
         boundSql.addParameter(offset);

+ 59 - 12
src/main/java/org/ssssssss/magicapi/functions/SQLExecutor.java

@@ -5,12 +5,13 @@ import org.springframework.jdbc.core.RowMapper;
 import org.springframework.jdbc.datasource.DataSourceUtils;
 import org.springframework.jdbc.support.GeneratedKeyHolder;
 import org.springframework.jdbc.support.KeyHolder;
+import org.ssssssss.magicapi.adapter.ColumnMapperAdapter;
+import org.ssssssss.magicapi.adapter.DialectAdapter;
 import org.ssssssss.magicapi.cache.SqlCache;
-import org.ssssssss.magicapi.config.DynamicDataSource.DataSourceNode;
 import org.ssssssss.magicapi.config.MagicDynamicDataSource;
+import org.ssssssss.magicapi.config.MagicDynamicDataSource.DataSourceNode;
 import org.ssssssss.magicapi.config.MagicModule;
 import org.ssssssss.magicapi.dialect.Dialect;
-import org.ssssssss.magicapi.dialect.DialectUtils;
 import org.ssssssss.magicapi.exception.MagicAPIException;
 import org.ssssssss.magicapi.model.Page;
 import org.ssssssss.magicapi.provider.PageProvider;
@@ -44,6 +45,12 @@ public class SQLExecutor extends HashMap<String, SQLExecutor> implements MagicMo
 	@UnableCall
 	private ResultProvider resultProvider;
 
+	@UnableCall
+	private ColumnMapperAdapter columnMapperAdapter;
+
+	@UnableCall
+	private DialectAdapter dialectAdapter;
+
 	@UnableCall
 	private RowMapper<Map<String, Object>> rowMapper;
 
@@ -75,13 +82,22 @@ public class SQLExecutor extends HashMap<String, SQLExecutor> implements MagicMo
 		this.resultProvider = resultProvider;
 	}
 
+	@UnableCall
+	public void setColumnMapperProvider(ColumnMapperAdapter columnMapperAdapter) {
+		this.columnMapperAdapter = columnMapperAdapter;
+	}
+
+	@UnableCall
+	public void setDialectAdapter(DialectAdapter dialectAdapter) {
+		this.dialectAdapter = dialectAdapter;
+	}
+
 	@UnableCall
 	public void setRowMapper(RowMapper<Map<String, Object>> rowMapper) {
 		this.rowMapper = rowMapper;
 	}
 
-	@UnableCall
-	public void setDynamicDataSource(MagicDynamicDataSource dynamicDataSource) {
+	private void setDynamicDataSource(MagicDynamicDataSource dynamicDataSource) {
 		this.dynamicDataSource = dynamicDataSource;
 	}
 
@@ -90,31 +106,30 @@ public class SQLExecutor extends HashMap<String, SQLExecutor> implements MagicMo
 		this.sqlCache = sqlCache;
 	}
 
-	@UnableCall
-	public void setDataSourceNode(DataSourceNode dataSourceNode) {
+	private void setDataSourceNode(DataSourceNode dataSourceNode) {
 		this.dataSourceNode = dataSourceNode;
 	}
 
-	@UnableCall
-	public void setCacheName(String cacheName) {
+	private void setCacheName(String cacheName) {
 		this.cacheName = cacheName;
 	}
 
-	@UnableCall
-	public void setTtl(long ttl) {
+	private void setTtl(long ttl) {
 		this.ttl = ttl;
 	}
 
 	@UnableCall
-	public SQLExecutor cloneSQLExecutor() {
+	private SQLExecutor cloneSQLExecutor() {
 		SQLExecutor sqlExecutor = new SQLExecutor();
 		sqlExecutor.setDynamicDataSource(this.dynamicDataSource);
 		sqlExecutor.setDataSourceNode(this.dataSourceNode);
 		sqlExecutor.setPageProvider(this.pageProvider);
+		sqlExecutor.setColumnMapperProvider(this.columnMapperAdapter);
 		sqlExecutor.setRowMapper(this.rowMapper);
 		sqlExecutor.setSqlCache(this.sqlCache);
 		sqlExecutor.setTtl(this.ttl);
 		sqlExecutor.setResultProvider(this.resultProvider);
+		sqlExecutor.setDialectAdapter(this.dialectAdapter);
 		return sqlExecutor;
 	}
 
@@ -189,6 +204,38 @@ public class SQLExecutor extends HashMap<String, SQLExecutor> implements MagicMo
 		return cache(cacheName, 0);
 	}
 
+	@Comment("采用驼峰列名")
+	public SQLExecutor camel() {
+		return columnCase("camel");
+	}
+
+	@Comment("采用帕斯卡列名")
+	public SQLExecutor pascal() {
+		return columnCase("pascal");
+	}
+
+	@Comment("采用全小写列名")
+	public SQLExecutor lower() {
+		return columnCase("lower");
+	}
+
+	@Comment("采用全大写列名")
+	public SQLExecutor upper() {
+		return columnCase("upper");
+	}
+
+	@Comment("列名保持原样")
+	public SQLExecutor normal() {
+		return columnCase("default");
+	}
+
+	@Comment("指定列名转换")
+	public SQLExecutor columnCase(String name) {
+		SQLExecutor sqlExecutor = cloneSQLExecutor();
+		sqlExecutor.setRowMapper(this.columnMapperAdapter.get(name));
+		return sqlExecutor;
+	}
+
 	/**
 	 * 数据源切换
 	 */
@@ -332,7 +379,7 @@ public class SQLExecutor extends HashMap<String, SQLExecutor> implements MagicMo
 		Dialect dialect;
 		try {
 			connection = dataSourceNode.getJdbcTemplate().getDataSource().getConnection();
-			dialect = DialectUtils.getDialectFromUrl(connection.getMetaData().getURL());
+			dialect = dialectAdapter.getDialectFromUrl(connection.getMetaData().getURL());
 		} catch (Exception e) {
 			throw new MagicAPIException("自动获取数据库方言失败", e);
 		} finally {

+ 28 - 0
src/main/java/org/ssssssss/magicapi/provider/ColumnMapperProvider.java

@@ -0,0 +1,28 @@
+package org.ssssssss.magicapi.provider;
+
+import org.springframework.jdbc.core.ColumnMapRowMapper;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+public interface ColumnMapperProvider {
+
+	String name();
+
+	String mapping(String columnName);
+
+	default ColumnMapRowMapper getColumnMapRowMapper(){
+		return new ColumnMapRowMapper(){
+			@Override
+			protected Map<String, Object> createColumnMap(int columnCount) {
+				return new LinkedHashMap<>(columnCount);
+			}
+
+			@Override
+			protected String getColumnKey(String columnName) {
+				return mapping(columnName);
+			}
+		};
+	}
+
+}

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

@@ -0,0 +1,36 @@
+package org.ssssssss.magicapi.provider.impl;
+
+import org.ssssssss.magicapi.provider.ColumnMapperProvider;
+
+/**
+ * 驼峰命名转换
+ */
+public class CamelColumnMapperProvider implements ColumnMapperProvider {
+
+	@Override
+	public String name() {
+		return "camel";
+	}
+
+	@Override
+	public String mapping(String columnName) {
+		if (columnName == null || !columnName.contains("_")) {
+			return columnName;
+		}
+		columnName = columnName.toLowerCase();
+		boolean upperCase = false;
+		StringBuilder sb = new StringBuilder();
+		for (int i = 0; i < columnName.length(); i++) {
+			char ch = columnName.charAt(i);
+			if (ch == '_') {
+				upperCase = true;
+			} else if (upperCase) {
+				sb.append(Character.toUpperCase(ch));
+				upperCase = false;
+			} else {
+				sb.append(ch);
+			}
+		}
+		return sb.toString();
+	}
+}

+ 19 - 0
src/main/java/org/ssssssss/magicapi/provider/impl/DefaultColumnMapperProvider.java

@@ -0,0 +1,19 @@
+package org.ssssssss.magicapi.provider.impl;
+
+import org.ssssssss.magicapi.provider.ColumnMapperProvider;
+
+/**
+ * 默认命名(保持原样)
+ */
+public class DefaultColumnMapperProvider implements ColumnMapperProvider {
+
+	@Override
+	public String name() {
+		return "default";
+	}
+
+	@Override
+	public String mapping(String columnName) {
+		return columnName;
+	}
+}

+ 19 - 0
src/main/java/org/ssssssss/magicapi/provider/impl/LowerColumnMapperProvider.java

@@ -0,0 +1,19 @@
+package org.ssssssss.magicapi.provider.impl;
+
+import org.ssssssss.magicapi.provider.ColumnMapperProvider;
+
+/**
+ * 全小写命名
+ */
+public class LowerColumnMapperProvider implements ColumnMapperProvider {
+
+	@Override
+	public String name() {
+		return "lower";
+	}
+
+	@Override
+	public String mapping(String columnName) {
+		return columnName.toLowerCase();
+	}
+}

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

@@ -0,0 +1,36 @@
+package org.ssssssss.magicapi.provider.impl;
+
+import org.ssssssss.magicapi.provider.ColumnMapperProvider;
+
+/**
+ * 帕斯卡命名转换
+ */
+public class PascalColumnMapperProvider implements ColumnMapperProvider {
+
+	@Override
+	public String name() {
+		return "pascal";
+	}
+
+	@Override
+	public String mapping(String columnName) {
+		if (columnName == null || !columnName.contains("_")) {
+			return columnName;
+		}
+		columnName = columnName.toLowerCase();
+		boolean upperCase = false;
+		StringBuilder sb = new StringBuilder();
+		for (int i = 0; i < columnName.length(); i++) {
+			char ch = columnName.charAt(i);
+			if (ch == '_') {
+				upperCase = true;
+			} else if (upperCase || i == 0) {
+				sb.append(Character.toUpperCase(ch));
+				upperCase = false;
+			} else {
+				sb.append(ch);
+			}
+		}
+		return sb.toString();
+	}
+}

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

@@ -0,0 +1,19 @@
+package org.ssssssss.magicapi.provider.impl;
+
+import org.ssssssss.magicapi.provider.ColumnMapperProvider;
+
+/**
+ * 全大写命名
+ */
+public class UpperColumnMapperProvider implements ColumnMapperProvider {
+
+	@Override
+	public String name() {
+		return "upper";
+	}
+
+	@Override
+	public String mapping(String columnName) {
+		return columnName.toUpperCase();
+	}
+}