Java代码执行SQL脚本和SQL查询

3 篇文章 1 订阅

1、Java 代码执行SQL脚本和SQL查询

package com.xxxxx.security.controller;


import com.xxxxx.security.vo.ExecScriptRunnerVo;
import org.apache.ibatis.jdbc.ScriptRunner;
import org.apache.ibatis.jdbc.SqlRunner;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author HanKeQi
 * @Date 2020/4/28 2:28 上午
 * @Version 1.0
 **/
@RestController
@RequestMapping(value = "/api/xxxxx")
public class ExecScriptRunnerController {

	//执行文件
    @PostMapping("/execFile")
    public String execFile(@RequestParam("file") MultipartFile multipartFile, ExecScriptRunnerVo execScriptRunnerVo) {
        ScriptRunner runner = null;
        Connection conn = null;
        try {
            InputStream inputStream = multipartFile.getInputStream();
            Class.forName(execScriptRunnerVo.getDriver());
            conn = DriverManager.getConnection(execScriptRunnerVo.getUrl(), execScriptRunnerVo.getUsername(), execScriptRunnerVo.getPassword());
            runner = new ScriptRunner(conn);
            runner.setFullLineDelimiter(false);
            runner.setSendFullScript(false);
            runner.setStopOnError(true);
            runner.runScript(new InputStreamReader(inputStream,"utf-8"));
            runner.setAutoCommit(true);//自动提交
            //这个设置为false是为了能够识别plsql的代码块,否则无法执行pl/sql的脚本,只能执行正常的sql语句。
            runner.setEscapeProcessing(false);
            runner.setSendFullScript(true); //这个是为了读取脚本所有语句,否则会按行读取进行执行,导致脚本解析错误,无法正常执行分行的begin end代码块。
        }catch (Exception e){
            if (conn != null){
                try {
                    conn.rollback();
                }catch (Exception e1){
                   e.printStackTrace();
                }
            }else {
                e.printStackTrace();
            }

        }finally {
            if (runner != null){
                runner.closeConnection();
            }
            if (conn != null){
                try {
                    conn.close();
                }catch (Exception e1){
                    e1.printStackTrace();
                }
            }
        }
        return "success";
    }

	//执行单条SQL
    @PostMapping("/execSql")
    public List<Map<String, Object>> execSql(@RequestBody ExecScriptRunnerVo execScriptRunnerVo) {
        List<Map<String, Object>> maps = new ArrayList<>();
        Connection conn = null;
        SqlRunner runner = null;
        int sqlInt = -1;
        try {
            String selectSql = execScriptRunnerVo.getSelectSql();

            if (StringUtils.isEmpty(selectSql)){
                return ResponseData.<List<Map<String, Object>>>builder().error(Constants.ERROR_CODE).msg("selectSql 不能为空").build();
            }
            selectSql = selectSql.trim();
            Object[] args = {};
            Class.forName(execScriptRunnerVo.getDriver());
            conn = DriverManager.getConnection(execScriptRunnerVo.getUrl(), execScriptRunnerVo.getUsername(), execScriptRunnerVo.getPassword());
            runner = new SqlRunner(conn);
            if (selectSql.matches("^S.*") ||  selectSql.matches("^s.*"))
                maps = runner.selectAll(selectSql, args);
            else if (selectSql.matches("^U.*") ||  selectSql.matches("^u.*"))
                sqlInt = runner.update(selectSql, args);
            else if (selectSql.matches("^D.*") ||  selectSql.matches("^d.*"))
                sqlInt = runner.delete(selectSql, args);
            else
                return ResponseData.<List<Map<String, Object>>>builder().error(Constants.ERROR_CODE).msg("请检查SQL").build();
            if (sqlInt != -1){
                Map<String, Object> map = new HashMap<>();
                map.put("count", sqlInt);
                maps.add(map);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if (runner != null){
                runner.closeConnection();
            }
            if (conn != null){
                try {
                    conn.close();
                }catch (Exception e1){
                    e1.printStackTrace();
                }
            }

        }
        return maps;
    }

对象类

package com.xxxxx.security.vo;

/**
 * @Author HanKeQi
 * @Date 2020/4/28 2:42 上午
 * @Version 1.0
 **/
public class ExecScriptRunnerVo {
	//默认MySQL
    private String driver = "com.mysql.jdbc.Driver";

    private String url;

    private String username;

    private String password;

    private String selectSql;

    public String getDriver() {
        return driver;
    }

    public void setDriver(String driver) {
        this.driver = driver;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getSelectSql() {
        return selectSql;
    }

    public void setSelectSql(String selectSql) {
        this.selectSql = selectSql;
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值