Browse Source

查询列表分页,排序功能。
增加SqlRunner 实现 原生SQL执行功能

周壕 1 year ago
parent
commit
76819fccaf

+ 4 - 0
pom.xml

@@ -46,6 +46,10 @@
             <artifactId>mysql-connector-java</artifactId>
             <scope>runtime</scope>
         </dependency>
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+        </dependency>
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>druid-spring-boot-starter</artifactId>

+ 9 - 3
src/main/java/com/bowintek/practice/controller/TempController.java

@@ -13,6 +13,7 @@ import com.bowintek.practice.services.service.system.RoleService;
 import com.bowintek.practice.vo.system.FunctionCodeModel;
 import com.bowintek.practice.vo.system.RoleFunctionCodeModel;
 import com.bowintek.practice.vo.system.RoleModel;
+import com.bowintek.practice.vo.temp.GenSqlStringResult;
 import com.bowintek.practice.vo.temp.TempObjectModel;
 import com.bowintek.practice.vo.user.UserInfoModel;
 import com.github.pagehelper.PageInfo;
@@ -63,14 +64,19 @@ public class TempController {
     public BaseResponse<TempObjectModel> genTest(@RequestBody TempObjectModel data) {
         HashMap<String, Object> rtnObject = new HashMap<>();
         try {
-            String sqlString = genSqlStringService.Generation(data, accountService.getLoginUserID());
-            rtnObject.put("sqlString", sqlString);
+            GenSqlStringResult sqlStringResult = genSqlStringService.Generation(data,data.page, data.rows, accountService.getLoginUserID());
+            rtnObject.put("sqlString", sqlStringResult.getMainSqlString());
+            rtnObject.put("cntString", sqlStringResult.getCountSqlStrimg());
 
-            List<Map<String,Object>> rows = genSqlStringService.getListBySqlString(sqlString);
+            List<Map<String,Object>> rows = genSqlStringService.getListBySqlString(sqlStringResult.getMainSqlString());
             rtnObject.put("rows", rows);
+            int total = genSqlStringService.getIntBySqlString(sqlStringResult.getCountSqlStrimg(), "CNT");
+            rtnObject.put("total", total);
+            rtnObject.put("code", 0);
         }
         catch (Exception ex){
             rtnObject.put("errString", "生成查询语句错误:" + ex.getMessage());
+            rtnObject.put("code", -1);
             ex.printStackTrace();
         }
         return RespGenerstor.success(rtnObject);

+ 44 - 14
src/main/java/com/bowintek/practice/services/impl/GenSqlStringServiceImpl.java

@@ -10,10 +10,7 @@ import com.bowintek.practice.services.service.GenSqlStringService;
 import com.bowintek.practice.services.service.TempService;
 import com.bowintek.practice.util.multipdb.DBTypeEnum;
 import com.bowintek.practice.util.multipdb.SwitchDataSource;
-import com.bowintek.practice.vo.temp.SqlColumnModel;
-import com.bowintek.practice.vo.temp.SqlFieldModel;
-import com.bowintek.practice.vo.temp.TempObjectModel;
-import com.bowintek.practice.vo.temp.TempSaveResult;
+import com.bowintek.practice.vo.temp.*;
 import org.apache.ibatis.jdbc.SqlRunner;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -60,6 +57,27 @@ public class GenSqlStringServiceImpl implements GenSqlStringService {
         }
     }
 
+    @Override
+    public Map<String,Object> getMapBySqlString(String sqlString){
+        try {
+            //加载数据库驱动
+            Class.forName(postgreDriver);
+            Connection connection = DriverManager.getConnection(postgreUrl, postgreUsername, postgrePassword);
+            SqlRunner sqlRunner = new SqlRunner(connection);
+            return sqlRunner.selectOne(sqlString);
+        }
+        catch (Exception ex){
+            ex.printStackTrace();
+            return null;
+        }
+    }
+
+    @Override
+    public int getIntBySqlString(String sqlString, String colName) {
+        Map<String, Object> map = getMapBySqlString(sqlString);
+        return Integer.parseInt(map.get(colName).toString());
+    }
+
     //查询语句生成,要素点:查询主表、关联子表、查询字段、查询条件
     //查询主表:FROM (sr_subject.execSql) AS T
     //查询字段-维度:sr_tempdimension.fieldAlias
@@ -68,7 +86,7 @@ public class GenSqlStringServiceImpl implements GenSqlStringService {
     //输出字段 AS:ReFieldName0,1,2...;依据维度度量排序来
     //表名 AS:T 主表,T0,1,2...;子表,依据维度度量子表排序来
     @Override
-    public String Generation(TempObjectModel data, String userID){
+    public GenSqlStringResult Generation(TempObjectModel data, int page, int rows, String userID){
         //取得字段原本定义
         data.sub = srSubjectMapper.selectByPrimaryKey(data.temp.getSubId());
         List<SrSubjectfield> fileds = getSubjectfieldsBySubId(data.temp.getSubId());
@@ -103,6 +121,7 @@ public class GenSqlStringServiceImpl implements GenSqlStringService {
             colString += MessageFormat.format("{0} {1} AS {2}\n\t",
                     getCommaString(fieldIndex), cm.getDisplayColumn(), getFieldName(fieldIndex));
             groupString += MessageFormat.format("{0} {1}\n\t",getCommaString(fieldIndex), cm.getDisplayColumn());
+            cm.setMeasureColumn(cm.getDisplayColumn());
             fieldIndex++;
         }
 
@@ -115,6 +134,7 @@ public class GenSqlStringServiceImpl implements GenSqlStringService {
                     getCommaString(fieldIndex),
                     getMeasurString(msr.getOperation(), cm.getDisplayColumn()),
                     getFieldName(fieldIndex));
+            cm.setMeasureColumn(getMeasurString(msr.getOperation(), cm.getDisplayColumn()));
             fieldIndex++;
         }
 
@@ -130,21 +150,31 @@ public class GenSqlStringServiceImpl implements GenSqlStringService {
 
         //生成排序字段
         String orderByString = "";
-        if(IsNullEmpty(data.orderBy) || !aliasMap.containsKey(data.orderBy)) data.orderBy = aliasMap.keySet().stream().findFirst().get();
+        if(IsNullEmpty(data.orderBy) || !aliasMap.containsKey(data.orderBy))
+            data.orderBy = aliasMap.keySet().stream().findFirst().get();
         System.out.println("data.orderBy:"+data.orderBy);
 
         if(aliasMap.containsKey(data.orderBy)){
             if(IsNullEmpty(data.orderByString)) data.orderByString = "asc";
             SqlColumnModel cmOrder = aliasMap.get(data.orderBy);
-            orderByString = MessageFormat.format("ORDER BY {0} {1}", cmOrder.getDisplayColumn(), data.orderByString);
+            orderByString = MessageFormat.format("ORDER BY {0} {1}", cmOrder.getMeasureColumn(), data.orderByString);
         }
 
-        String mainSqlStrimg = MessageFormat.format("SELECT {0} \nFROM {1} AS T {2} \nWHERE 1=1 {3} \nGROUP BY {4} \n\n{5}",
-                colString, data.sub.getExecSql(), leftTableString, whereString, groupString, orderByString);
-        System.out.println(mainSqlStrimg);
-        return mainSqlStrimg;
-    }
+        String limitString = MessageFormat.format("LIMIT {0} OFFSET {1}", rows, (page-1) * rows);
+
+        GenSqlStringResult result = new GenSqlStringResult();
+        String mainSqlString = MessageFormat.format("SELECT {0} \nFROM {1} AS T {2} \nWHERE 1=1 {3} \nGROUP BY {4} \n{5} \n{6}",
+                colString, data.sub.getExecSql(), leftTableString, whereString, groupString, orderByString, limitString);
+        result.setMainSqlString(mainSqlString);
 
+        String countSqlString = MessageFormat.format("SELECT COUNT(*) CNT FROM (SELECT {0} \nFROM {1} AS T {2} \nWHERE 1=1 {3} \nGROUP BY {4})",
+                colString, data.sub.getExecSql(), leftTableString, whereString, groupString);
+        result.setCountSqlStrimg(countSqlString);
+
+        System.out.println(mainSqlString);
+        System.out.println(countSqlString);
+        return result;
+    }
 
 
     public int getDataType(String typeString){
@@ -165,7 +195,7 @@ public class GenSqlStringServiceImpl implements GenSqlStringService {
             return genRemark("genWhereString", stf.getTempFeildId());
 
         if(stf.getOperation().equals("="))
-            return MessageFormat.format("\n\tAND T.{0}='{1}'", stf.getFieldAlias(),
+            return MessageFormat.format("\n\tAND T.{0}={1}", stf.getFieldAlias(),
                     "'"+stf.getValue1()+"'");
         else if(stf.getOperation().equals("like"))
             return MessageFormat.format("\n\tAND T.{0} like {1}", stf.getFieldAlias(),
@@ -239,7 +269,7 @@ public class GenSqlStringServiceImpl implements GenSqlStringService {
     }
 
     public String getFieldName(int index){
-        return "ReFieldName"+index;
+        return "RENAME"+index;
     }
 
     public String getCommaString(boolean is){

+ 4 - 1
src/main/java/com/bowintek/practice/services/service/GenSqlStringService.java

@@ -1,5 +1,6 @@
 package com.bowintek.practice.services.service;
 
+import com.bowintek.practice.vo.temp.GenSqlStringResult;
 import com.bowintek.practice.vo.temp.TempObjectModel;
 import com.bowintek.practice.vo.temp.TempSaveResult;
 
@@ -8,6 +9,8 @@ import java.util.List;
 import java.util.Map;
 
 public interface GenSqlStringService {
-    String Generation(TempObjectModel data, String userID);
+    GenSqlStringResult Generation(TempObjectModel data, int page, int rows, String userID);
     List<Map<String,Object>> getListBySqlString(String sqlString);
+    Map<String,Object> getMapBySqlString(String sqlString);
+    int getIntBySqlString(String sqlString, String colName);
 }

+ 10 - 0
src/main/java/com/bowintek/practice/vo/temp/GenSqlStringResult.java

@@ -0,0 +1,10 @@
+package com.bowintek.practice.vo.temp;
+
+import lombok.Data;
+
+@Data
+public class GenSqlStringResult {
+    private String mainSqlString;
+
+    private String countSqlStrimg;
+}

+ 2 - 0
src/main/java/com/bowintek/practice/vo/temp/SqlColumnModel.java

@@ -13,4 +13,6 @@ public class SqlColumnModel {
     private String displayColumn;
 
     private String leftJoinString;
+
+    private String measureColumn;
 }

+ 3 - 0
src/main/java/com/bowintek/practice/vo/temp/TempObjectModel.java

@@ -16,4 +16,7 @@ public class TempObjectModel {
 
     public String orderBy;
     public String orderByString;
+
+    public int page;
+    public int rows;
 }

+ 3 - 3
src/main/resources/application.yml

@@ -25,11 +25,11 @@ spring:
       driver-class-name: com.mysql.jdbc.Driver
     postgre:
       # 数据源基本配置
-      username: root
+      username: postgres
       password: bowin123
-      url: jdbc:mysql://office.bowintek.com:3306/practicedb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
+      url: jdbc:postgresql://office.bowintek.com:5432/postgres
       # driver-class需要注意mysql驱动的版本(com.mysql.cj.jdbc.Driver 或 com.mysql.jdbc.Driver)
-      driver-class-name: com.mysql.jdbc.Driver
+      driver-class-name: org.postgresql.Driver
     druid:
       #监控统计拦截的filters
       filters: stat

+ 3 - 0
src/main/resources/mapping/cquery/TempCQuery.xml

@@ -34,6 +34,7 @@
         <foreach collection="tempIdList" item="tempId" index="index" open="(" close=")" separator=",">
             #{tempId}
         </foreach>
+        order by disOrder
     </select>
 
     <select id="selectFieldByTempId" resultType="com.bowintek.practice.model.SrTempfield">
@@ -42,6 +43,7 @@
         <foreach collection="tempIdList" item="tempId" index="index" open="(" close=")" separator=",">
             #{tempId}
         </foreach>
+        order by disOrder
     </select>
 
     <select id="selectMeasureByTempId" resultType="com.bowintek.practice.model.SrTempmeasure">
@@ -50,6 +52,7 @@
         <foreach collection="tempIdList" item="tempId" index="index" open="(" close=")" separator=",">
             #{tempId}
         </foreach>
+        order by disOrder
     </select>
 
     <delete id="deletesDimensionByTempId">

+ 62 - 15
vue/src/views/query/index.vue

@@ -104,6 +104,9 @@
       </div>
       <div class="query-index-table">
         <a-table :columns="columns" :data-source="dataList" :scroll="{ x:'100%', y: 500 }"
+                 :pagination="pagination"
+                 :loading="modal.loading"
+                 @change="pageChange"
                  bordered>
         </a-table>
       </div>
@@ -118,15 +121,16 @@
 </template>
 
 <script lang="ts">
-import {ref, defineComponent} from 'vue';
+import {ref, defineComponent, computed} from 'vue';
 import type {FormInstance} from 'ant-design-vue';
 import {useRoute} from 'vue-router';
 import DragWhere from '@/components/basic/query/drag-where.vue'
 import DragBase from '@/components/basic/query/drag-base.vue'
 import DragMeasure from '@/components/basic/query/drag-measure.vue'
 import {save, get} from "@/api/common";
-import type {TableColumnsType} from 'ant-design-vue';
+import type {TableColumnsType, TableProps} from 'ant-design-vue';
 import type { TreeProps } from 'ant-design-vue';
+import {getPaginationTotalTitle} from "@/utils/common";
 
 export default defineComponent({
   name: 'queryindex',
@@ -158,14 +162,38 @@ export default defineComponent({
       },
       measures : [],
       wheres : [],
-      bases : []
+      bases : [],
+      page: 0, rows: 10, total: 0,
+      orderBy : null,
+      orderByString : null
     });
 
     const modal = ref({
       open : false,
-      sqlString : null
+      sqlString : null,
+      loading : false
     });
 
+    const pagination = computed(() => ({
+      total: formState.value.total,
+      current: formState.value.page,
+      pageSize: formState.value.rows,
+      showSizeChanger: true,
+      showTotal: total => getPaginationTotalTitle(total)
+    }));
+
+    const pageChange: TableProps['onChange'] = (
+      pag: { pageSize: number; current: number } , filters: any, sorter: any
+    ) => {
+      formState.value.page = pag.current;
+      formState.value.rows = pag.pageSize;
+      console.log("sorter",sorter, filters);
+
+      formState.value.orderBy = sorter.column ? sorter.columnKey : null;
+      formState.value.orderByString = sorter.column ? sorter.order.replace("end","") : null;
+      onSelect();
+    };
+
     const onFinish = () => {
       if(formRef.value == undefined){
         return;
@@ -188,11 +216,19 @@ export default defineComponent({
     };
 
     const onSelect= () =>{
+      modal.value.loading = true;
+
       save('temp/genQuery', formStateGet()).then(result => {
         console.log(result);
-        if(result["sqlString"]){
+        if(result["code"]!=0){
           modal.value.open = true;
           modal.value.sqlString = result["sqlString"];
+          dataList.value = [];
+        }
+        else{
+          dataList.value = result["rows"];
+          formState.value.total = result["total"];
+          modal.value.loading = false;
         }
       });
     }
@@ -226,7 +262,7 @@ export default defineComponent({
       formState.value.bases = rtn.bases;
       formState.value.wheres = rtn.wheres;
       formState.value.measures = rtn.measures;
-      readerTable();
+      readerTable(true);
 
       (measure.value as any).setTagList(rtn.measures);
       (where.value as any).setTagList(rtn.wheres);
@@ -236,19 +272,19 @@ export default defineComponent({
     const onChangeMeasure = (list, obj) => {
       console.log("onChangeMeasure", arguments, list, obj);
       formState.value.measures = list;
-      readerTable();
+      readerTable(true);
       checkSubjectId(obj);
     }
     const onChangeWhere = (list, obj) => {
       console.log("onChangeWhere", arguments, list, obj);
       formState.value.wheres = list;
-      readerTable();
+      readerTable(true);
       checkSubjectId(obj);
     }
     const onChangeBase = (list, obj) => {
       console.log("onChangeBase", arguments, list, obj);
       formState.value.bases = list;
-      readerTable();
+      readerTable(true);
       checkSubjectId(obj);
     }
 
@@ -268,18 +304,27 @@ export default defineComponent({
 
     const dataList = ref([]);
     const columns : any= ref([]);
-    const readerTable = () =>{
+    const readerTable = (isClearData : boolean) =>{
       columns.value = getTableColumns(formState.value.bases, formState.value.measures);
+      if(isClearData) {
+        dataList.value = [];
+        formState.value.page = 1;
+      }
     }
     const getTableColumns = (bases, measures) =>{
       let rtns: TableColumnsType = [];
-      bases.concat(measures).forEach((it)=>{
+      let cols = bases.concat(measures);
+      for(let i=0;i<cols.length; i++){
+        let it = cols[i];
+        console.log("getTableColumns",it);
         rtns.push({
           title: it.displayName?it.displayName:it.fieldName,
-          dataIndex: it.fieldId + it.disOrder,
-          key: it.fieldId + it.disOrder,
+          dataIndex: "RENAME" + i,
+          key: it.tempFeildId,
+          sorter: true,
           align:"center"});
-      });
+      }
+      console.log("getTableColumns", rtns);
       return rtns;
     }
 
@@ -306,7 +351,9 @@ export default defineComponent({
       columns,
       subjectTrees,
       getSubjectTree,
-      modal
+      modal,
+      pagination,
+      pageChange
     };
   },
   created() {

+ 2 - 1
vue/src/views/query/table.vue

@@ -41,7 +41,8 @@
       </a-row>
     </a-form>
     <div class="search-result-list">
-      <a-table :columns="columns" :data-source="data" :scroll="{ x:'100%', y: 500 }" :pagination="pagination"
+      <a-table :columns="columns" :data-source="data" :scroll="{ x:'100%', y: 500 }"
+               :pagination="pagination"
                :loading="loading"
                :row-selection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
                @change="handleTableChange" :row-key="record=>record.positionID"