web执行sql----vue mybatis

java

@ResponseBody
    @RequestMapping(value = "/sqlMap", method = RequestMethod.POST)
    public String executeSql(HttpServletRequest req) {
        JSONObject jsona = new JSONObject();
        try {

            Map<String, Object> params = HttpServiceUtils.getParamsFromReq(req);
            String sqlStr = null;
            if (!params.containsKey("sql")) {
                throw new Exception("不存在sql");
            }
            sqlStr = params.get("sql").toString();
            
            //不处理insert  update  delete drop alter create all_ user_避免动态注入
            if(sqlStr.indexOf("insert") > -1
                    || sqlStr.indexOf("update") >-1
                    || sqlStr.indexOf("delete") > -1 
                    || sqlStr.indexOf("drop") > -1
                    || sqlStr.indexOf("alter") >-1
                    || sqlStr.indexOf("create") >-1
                    || sqlStr.indexOf("all_") >-1
                    || sqlStr.indexOf("user_") >-1){
                throw new Exception("避免sql注入,不允许执行");
            }
            
            //处理特殊字符
            sqlStr = sqlStr.replaceAll(";","");

            List<LinkedHashMap<String, Object>> resultList = sqlMapper.executeSql(sqlStr);

            //clob处理
            Iterator<LinkedHashMap<String,Object>> itA = resultList.iterator();
            while(itA.hasNext()){
                LinkedHashMap jsonObj = itA.next();
                Iterator<String> it = jsonObj.keySet().iterator();  

                while(it.hasNext()){  
                    String key = it.next();
                    Object value = jsonObj.get(key);
                    if(value instanceof oracle.sql.CLOB){
                        value = ClobUtil.clobToString((CLOB)value);
                        jsonObj.put(key, value);
                    }else if(value instanceof java.sql.Timestamp){
                        value = value.toString();
                        jsonObj.put(key, value);
                    }
                }  
            }
            
            
            JSONArray resultJa = JSONArray.fromObject(resultList);
            jsona.accumulate("data", resultJa);
            jsona.accumulate("total", 0);
            
            return ResponseUtils.success(jsona);
        }  catch (Exception e) {
            log.error("执行脚本失败:{}", e);
            return ResponseUtils.failure(e.getMessage());
        }
    }

mapper.xml

 <select id="executeSql" parameterType="String" resultType="java.util.LinkedHashMap">  
        ${sqlStr}
    </select>

mapper.java

    public List<LinkedHashMap<String, Object>> executeSql(@Param(value="sqlStr") String sqlStr); 

html

<div class='sql-map'>
  <el-input v-model='sql'  type="textarea"  autosize></el-input>
  <el-button @click='executeSql' type="success">提交</el-button>
  <el-input v-model='result' type="textarea"></el-input>
  <el-table v-if='data.length>0' :data="data" :border=true :stripe=true :fit=true style="width: 100%" v-loading.body="loading">
       <el-table-column v-for='item in keys' :prop="item"  :label="item" show-overflow-tooltip sortable> 
       </el-table-column>
  </el-table>
</div>

js

Vue.component('sql-map',{
        template: '#sqlMap',
        mixins: [mixin_basic],
        created: function () {
            
        },
        mounted: function () {
        
        },
        beforeDestroy: function () {
        },
        data: function(){return{
            name:'sqlMap',
            title: "sqlMap",
            pageSize: GetPageSize(),
            loading: false,
            sql:'select * from component_inst a where rownum<5;',
            result:'',
            data:[],
            keys:[]
        }},
        methods: {

            executeSql: function (inParams, callBack) {
                //条数限制
                if(this.sql.indexOf('where') <= -1 || this.sql.length == 0){
                    this.$alert('请输入where子句', '服务异常');
                    return;
                }
                
                this.loading = true
                var vueThis = this;
                
                //重置
                vueThis.data = [];
                vueThis.keys =[];
                if(this.sql.indexOf('and rownum<20;') <= -1 ){
                    if(this.sql.indexOf(';') > -1 ){
                        this.sql = this.sql.replace(';',' and rownum<20;');
                    }else{
                        this.sql = this.sql + '  and rownum<20;';
                    }
                }
                
                //参数
                var params = {};
                Object.assign(params, { 'sql': this.sql });

                callServicePolyfill(this, 'executeSql', params, function (res) {
                    try {
                        vueThis.result = res;
                        res = JSON.parse(res);
                        if (!!res.statusCd && res.statusCd != '200') {
                            throw res.message;
                        } else {
                            vueThis.data = res.data;
                            for(var key in vueThis.data){
                                var item = vueThis.data[key];
                                for(var j in item){

                                    if(vueThis.keys.indexOf(j)<=-1){
                                        vueThis.keys.push(j);
                                    }
                                    
                                    if(vueThis.isJsonObj(item[j])){
                                        item[j] = JSON.stringify(item[j]);
                                    }else if(Array.isArray(item[j])){

                                        item[j] = item[j] +'';
                                    }
                                }
                            }
                        };
                    } catch (err) {
                        console.error(err)
                        console.error(res)
                        vueThis.info('执行sql失败,' + err);
                    } finally {
                        vueThis.loading = false;
                    }
                })
            },
            
            isJsonObj:function(obj){
                  var isjson = typeof(obj) == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length;   
                  return isjson; 
            }

        },
        computed: {

        }


    })

转载于:https://www.cnblogs.com/gloxing/p/9025003.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值