欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java执行SQL脚本文件到数据库详解

程序员文章站 2023-12-09 17:36:03
本文实例为大家分享了java执行sql脚本文件到数据库的具体方式,供大家参考,具体内容如下 方式一:直接读取sql脚本文件的内容,然后传递到sql中。 代码:runsq...

本文实例为大家分享了java执行sql脚本文件到数据库的具体方式,供大家参考,具体内容如下

方式一:直接读取sql脚本文件的内容,然后传递到sql中。

代码:runsqlservice:

  @autowired
  private runsqldao runsqldao;
  
  /**
   * 读取文件内容到sql中执行
   * @param sqlpath sql文件的路径:如:d:/testproject/web/sql/脚本.sql
   */
  public void runsqlbyreadfilecontent(string sqlpath) throws exception {
    try {
       
      string sqlstr = readfilebylines(sqlpath);
      // system.out.println("获得的文本:" + sqlstr);
      if (sqlstr.length() > 0) {
        runsqldao.runsqlbysqlstr(sqlstr);
      }
    } catch (exception e) {
      e.printstacktrace();
      throw e;
    }
  }
  
  /**
   * 以行为单位读取文件,常用于读面向行的格式化文件
   */
  private string readfilebylines(string filepath) throws exception {
    stringbuffer str = new stringbuffer();
    bufferedreader reader = null;
    try {
      reader = new bufferedreader(new inputstreamreader(
          new fileinputstream(filepath), "utf-8"));
      string tempstring = null;
      int line = 1;
      // 一次读入一行,直到读入null为文件结束
      while ((tempstring = reader.readline()) != null) {
        // 显示行号
        // system.out.println("line " + line + ": " + tempstring);

        str = str.append(" " + tempstring);
        line++;
      }
      reader.close();
    } catch (ioexception e) {
      e.printstacktrace();
      throw e;
    } finally {
      if (reader != null) {
        try {
          reader.close();
        } catch (ioexception e1) {
        }
      }
    }

    return str.tostring();
  }

runsqldao : 

  /**
   * @param sqlstr
   */
  public void runsqlbysqlstr(string sqlstr) {
    map<string,object> map=new hashmap<string,object>();
    map.put("sqlstr", sqlstr);
    sqlsessiontemplate.selectlist("runsql.runsqlbysqlstr", map);
  }

sqlmap:

<mapper namespace="runsql">

<select id="runsqlbysqlstr" parametertype="map">
<![cdata[ ${sqlstr}]]>
</select>

</mapper>

这种写法:只支持数据的变化(新增、修改、删除),且sql文件内容以begin开始,以end结束。无法更新表字段修改等操作。

方式二;使用scriptrunner

代码:runsqlservice:

  /**
   * 执行sql脚本文件 使用scriptrunner
   * @param sqlpath sql文件的路径:如:d:/testproject/web/sql/脚本.sql
   */
  public void runsqlbyscriptrunner(string sqlpath) throws exception {
    try {
      sqlsession sqlsession = sqlsessionfactory.opensession();
      connection conn = sqlsession.getconnection();
      scriptrunner runner = new scriptrunner(conn);
      runner.setescapeprocessing(false);
      runner.setsendfullscript(true);      
      runner.runscript(new inputstreamreader(new fileinputstream(sqlpath), "utf-8"));
    } catch (exception e) {
      e.printstacktrace();
      throw e;
    }
  }


这种写法:只能有一行sql,即一次执行一个sql语句,否则就会报错。

方式三:使用scriptutils

代码:runsqlservice:(以下两种方式:脚本.sql 和runsqlservice 在同一目录下)

方法(1)

  /**
   * 执行sql脚本文件 使用spring工具类
   */
  public void runsqlbyspringutils() throws exception {
    try {
      sqlsession sqlsession = sqlsessionfactory.opensession();
      connection conn = sqlsession.getconnection();
      classpathresource rc = new classpathresource("脚本.sql", runsqldao.class);
      scriptutils.executesqlscript(conn, rc);
    } catch (exception e) {
      e.printstacktrace();
      throw e;
    }
  }

方法(2)

  /**
   * 执行sql脚本文件 使用spring工具类
   */
  public void runsqlbyspringutils() throws exception {
    try {
      sqlsession sqlsession = sqlsessionfactory.opensession();
      connection conn = sqlsession.getconnection();
      classpathresource rc = new classpathresource("脚本.sql", runsqldao.class);
      encodedresource er = new encodedresource(rc, "utf-8");
      scriptutils.executesqlscript(conn, er);
    } catch (exception e) {
      e.printstacktrace();
      throw e;
    }
  }

方法(1),脚本.sql文件必须是ansi的,否则执行到数据中汉字是乱码。

方法(2)解决了方法(1)的问题,完美了,喜欢的小伙伴们快拿去享用吧。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。