david 2 years ago
parent
commit
aa4ceb48bd

BIN
out/artifacts/roma_api_jar/roma-api.jar


+ 15 - 8
src/main/java/com/roma/romaapi/dao/DbApiDao.java

@@ -4,6 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.dao.EmptyResultDataAccessException;
 import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
 import org.springframework.stereotype.Repository;
+import com.roma.romaapi.facade.MultipleDb;
 
 import java.util.HashMap;
 import java.util.List;
@@ -16,6 +17,8 @@ public class DbApiDao {
 
     @Autowired
     private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
+    @Autowired
+    private MultipleDb multipleDb;
     // 通过code,获取要执行的sql
     public Map<String, Object> dbQueryForMap(String sqlCode) {
         try {
@@ -33,16 +36,18 @@ public class DbApiDao {
     }
 
     // 获取sql总数,需要完整的sql和要绑定的参数
-    public Integer dbCountQueryForObject(String sql, Map bindValue) {
-        Integer count = namedParameterJdbcTemplate.queryForObject(sql, bindValue, Integer.class);
+    public Integer dbCountQueryForObject(String datasource, String sql, Map bindValue) {
+        NamedParameterJdbcTemplate execNamedParameterJdbcTemplate = multipleDb.getMultipleDatasourceByDbCode(datasource);
+        Integer count = execNamedParameterJdbcTemplate.queryForObject(sql, bindValue, Integer.class);
 
         return  count;
     }
 
     // 获取查询数据--单条数据使用
-    public Map dbCustomQueryForMap(String sql, Map bindValue) {
+    public Map dbCustomQueryForMap(String datasource, String sql, Map bindValue) {
         try {
-            Map<String, Object> resMap2 = namedParameterJdbcTemplate.queryForMap(sql, bindValue);
+            NamedParameterJdbcTemplate execNamedParameterJdbcTemplate = multipleDb.getMultipleDatasourceByDbCode(datasource);
+            Map<String, Object> resMap2 = execNamedParameterJdbcTemplate.queryForMap(sql, bindValue);
             return  resMap2;
         } catch (EmptyResultDataAccessException e) {
             Map<String, Object> resultMap = new HashMap<>();
@@ -53,14 +58,16 @@ public class DbApiDao {
     }
 
     // 查询数据--多条数据使用
-    public List<Map<String, Object>> dbCustomQueryForList(String sql, Map<String, Object> bindValue){
-        List<Map<String, Object>> resMap2 = namedParameterJdbcTemplate.queryForList(sql, bindValue);
+    public List<Map<String, Object>> dbCustomQueryForList(String datasource, String sql, Map<String, Object> bindValue){
+        NamedParameterJdbcTemplate execNamedParameterJdbcTemplate = multipleDb.getMultipleDatasourceByDbCode(datasource);
+        List<Map<String, Object>> resMap2 = execNamedParameterJdbcTemplate.queryForList(sql, bindValue);
         return  resMap2;
     }
 
     // 执行增删改语句
-    public Integer dbUpdate(String sql, Map<String, Object> bindValue){
-        Integer row = namedParameterJdbcTemplate.update(sql, bindValue);
+    public Integer dbUpdate(String datasource, String sql, Map<String, Object> bindValue){
+        NamedParameterJdbcTemplate execNamedParameterJdbcTemplate = multipleDb.getMultipleDatasourceByDbCode(datasource);
+        Integer row = execNamedParameterJdbcTemplate.update(sql, bindValue);
         return  row;
     }
 }

+ 63 - 0
src/main/java/com/roma/romaapi/facade/MultipleDb.java

@@ -0,0 +1,63 @@
+package com.roma.romaapi.facade;
+
+import com.zaxxer.hikari.HikariDataSource;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.dao.EmptyResultDataAccessException;
+import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Component
+public class MultipleDb {
+    @Autowired
+    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
+
+//    @Value("${spring.datasource.demo.user.url}")
+    @Value("${spring.datasource.driver-class-name}")
+    private String driverClassName;
+    @Value("${spring.datasource.url}")
+    private String datasourceUrl;
+    @Value("${spring.datasource.username}")
+    private String datasourceUsername;
+    @Value("${spring.datasource.password}")
+    private String datasourcePassword;
+
+    // 传入db配置的code,返回对应数据库实例
+    public NamedParameterJdbcTemplate getMultipleDatasourceByDbCode(String dbCode) {
+        Map dbConfigParams = new HashMap<>();
+        dbConfigParams.put("dbCode", dbCode);
+        Map<String, Object> dbConfigInfoByDbCode = new HashMap<>();
+        // 获取此sql要执行的数据库源
+        try {
+            String dbSourceInfoStringSql = " SELECT * FROM `datasource_config` WHERE `datasource_code`=:dbCode ";
+            dbConfigInfoByDbCode = namedParameterJdbcTemplate.queryForMap(
+                    dbSourceInfoStringSql, dbConfigParams);
+        } catch (EmptyResultDataAccessException e) {
+        }
+
+        // 创建链接信息
+        final HikariDataSource customDataConfig = new HikariDataSource();
+        customDataConfig.setDriverClassName(driverClassName); // mysql驱动
+
+        // 判断是否使用默认源 dbcode不存在或者没有找到数据库配置,则使用默认源
+        if(dbCode == null || dbCode.equals("") || dbConfigInfoByDbCode.isEmpty()) {
+            customDataConfig.setJdbcUrl(datasourceUrl);
+            customDataConfig.setUsername(datasourceUsername);
+            customDataConfig.setPassword(datasourcePassword);
+        } else {
+            customDataConfig.setJdbcUrl(dbConfigInfoByDbCode.get("datasource_url").toString());
+            customDataConfig.setUsername(dbConfigInfoByDbCode.get("datasource_username").toString());
+            customDataConfig.setPassword(dbConfigInfoByDbCode.get("datasource_password").toString());
+//            customDataConfig.setJdbcUrl("jdbc:mysql://ibs-cn.elken.com:8016/roma?serverTimezone=UTC&tinyInt1isBit=false&transformedBitIsBoolean=false");
+//            customDataConfig.setUsername("bi");
+//            customDataConfig.setPassword("WxlmPxXuI9sQWvkE");
+        }
+
+        NamedParameterJdbcTemplate mulNamedParameterJdbcTemplate = new NamedParameterJdbcTemplate(customDataConfig);
+
+        return mulNamedParameterJdbcTemplate;
+    }
+}

+ 6 - 4
src/main/java/com/roma/romaapi/service/DbApiService.java

@@ -67,17 +67,18 @@ public class DbApiService {
         Map res = new HashMap<>();
         Object sql = sqlData.get("sql_string");// 获取sql语句
         Object isList = sqlData.get("is_list");// 是否查单条数据
+        String datasource = sqlData.get("datasource_code").toString();
         if(isList.equals(2)) {
             // 如果查询单条数据
             String selectSql = sql.toString();
-            res = dbApiDao.dbCustomQueryForMap(selectSql, bindData);
+            res = dbApiDao.dbCustomQueryForMap(datasource, selectSql, bindData);
 
         } else if(isList.equals(1)) {
             // 如果是查询列表
             Integer nowPage = Integer.parseInt(page);  // 当前第几页
             Integer nowPerPage = Integer.parseInt(perPage); // 每页多少条
             String countSql = "SELECT COUNT(*) AS `totalData` FROM ( " + sql + " ) AS ROMA";
-            Integer count = dbApiDao.dbCountQueryForObject(countSql, bindData);
+            Integer count = dbApiDao.dbCountQueryForObject(datasource, countSql, bindData);
             Integer maxPage = count / nowPerPage + (count % nowPerPage != 0 ? 1 : 0);// 总数/每页多少条=最多多少页
             if (nowPage <= 1) {
                 nowPage = 1;
@@ -86,7 +87,7 @@ public class DbApiService {
             }
             Integer startNum = (nowPage - 1) * nowPerPage;
             String selectSql = sql + " LIMIT " + startNum + "," + nowPerPage;
-            List info = dbApiDao.dbCustomQueryForList(selectSql, bindData);
+            List info = dbApiDao.dbCustomQueryForList(datasource, selectSql, bindData);
             res.put("count", count);
             res.put("rows", info);
         }
@@ -97,7 +98,8 @@ public class DbApiService {
     // 执行增删改
     public Integer transferUpdate(Map sqlData, Map bindData){
         Object sql = sqlData.get("sql_string");// 获取sql语句
-        Integer ret = dbApiDao.dbUpdate(sql.toString(), bindData);
+        String datasource = sqlData.get("datasource_code").toString();
+        Integer ret = dbApiDao.dbUpdate(datasource, sql.toString(), bindData);
 
         return  ret;
     }