Java导入SQL文件并执行,结合Mybatis使用

1 篇文章 0 订阅
1 篇文章 0 订阅

前端代码

略,比较简单的文件上传,这里就不写了

Java代码

由于要结合Mybatis使用所以就需要创建Mapper文件了

RunSqlMapper.java

和你的其他Mapper文件放一起就行了,要被扫描到

public interface RunSqlMapper extends BaseMapper<T> {
	//执行sql语句
    public void runSqlBySqlStr(String sqlStr);
}
RunSqlMapper.xml

我这里执行的sql语句是新增语句,如果是查询语句的话情况略微不同,需要加上resultMap返回查询的格式

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="RunSqlMapper的位置">
	//执行sql语句
	<select id="runSqlBySqlStr" parameterType="java.lang.String">
		<![CDATA[${sqlStr}]]>
	</select>
</mapper>
Controller文件
	 /**
	  * 导入sql数据
	  *
	  * @param request
	  * @param response
	  * @return
	  */
	 @RequestMapping(value = "/importSql", method = RequestMethod.POST)
	 public Result<?> importSql(HttpServletRequest request, HttpServletResponse response) {
		 return 调用service的方法(request, response);
	 }
ServiceImpl文件
	@Resource
    private RunSqlMapper runSqlMapper;
    
   /**
     * 导入sql文件
     *
     * @param request
     * @param response
     * @return
     */
    protected Result<?> importSql(HttpServletRequest request, HttpServletResponse response) {
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
            MultipartFile file = entity.getValue();// 获取上传文件对象
            List<String> sqlList = new ArrayList<String>();
            InputStream sqlFileIn = null;
            try {
                sqlFileIn = file.getInputStream();
                int available = sqlFileIn.available();
                if (available == 0){
                    throw new RuntimeException("文件内容为空,请检查后再进行导入");
                }
                StringBuffer sqlSb = new StringBuffer();
                byte[] buff = new byte[1024];
                int byteRead = 0;
                while ((byteRead = sqlFileIn.read(buff)) != -1) {
                    sqlSb.append(new String(buff, 0, byteRead));
                }
                // Windows 下换行是 \r\n, Linux 下是 \n
                String[] sqlArr = sqlSb.toString()
                        .split("(;\\s*\\r\\n)|(;\\s*\\n)");
                for (int i = 0; i < sqlArr.length; i++) {
                    String sql = sqlArr[i].replaceAll("--.*", "").trim();
                    if (!sql.equals("")) {
                        sqlList.add(sql);
                    }
                }
                for (String sql:sqlList){
                    Boolean b = sql != null && (sql.contains("insert") || sql.contains("INSERT"));
                    if (b){
                        runSqlMapper.runSqlBySqlStr(sql);
                    }else {
                        throw new JeecgBootException(sql + " sql语句错误");
                    }
                }
                return Result.ok("文件导入成功!数据行数:" + sqlList.size());
            } catch (Exception e) {
                log.error(e.getMessage(), e);
                return Result.error("文件导入失败:" + e.getMessage());
            } finally {
                try {
                    sqlFileIn.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return Result.error("文件导入失败!");
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值