对sql文件进行读取并通过JDBC批量执行

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SpiderManSun/article/details/84941882
public class MySQLHandle {
    //mysql驱动包名
    private static final String DRIVER_NAME = "com.mysql.jdbc.Driver";
    //数据库连接地址
    private static final String URL = "jdbc:mysql://localhost:3306/test";
    //用户名
    private static final String USER_NAME = "root";
    //密码
    private static final String PASSWORD = "rootroot";
    //数据库连接对象
    private static Connection connection;


    public static void main(String[] args) {

    }
    static {
        try {
            //加载mysql的驱动类
            Class.forName(DRIVER_NAME);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //构造函数,包括连接数据库等操作
    public MySQLHandle(){
        try {
            //加载mysql的驱动类
            Class.forName(DRIVER_NAME);
            //获取数据库连接
            connection = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
        } catch (Exception e) {
            e.printStackTrace();
            connection = null;
        }
    }
    //带参数构造函数,用于指定参数连接数据库
    public MySQLHandle(String Database,String User,String Password){
        try {
            //获取数据库连接
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/"+Database, User, Password);
        } catch (Exception e) {
            e.printStackTrace();
            connection = null;
        }
    }

    public Connection getConnection(){
        return connection;
    }

    public static void ReleaseConnect(){
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }


    /**
     * @方法描述:批量执行SQL语句
     * @param sql 包含待执行的SQL语句的ArrayList集合
     * @return int 影响的函数
     */
    public int batchDate(ArrayList<String> sql){
        try {
            Statement st = connection.createStatement();
            for(String subsql :sql){
                st.addBatch(subsql);
            }
            st.executeBatch();
            return 1;
        }catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }

    /**
     * 以行为单位读取文件,并将文件的每一行格式化到ArrayList中,常用于读面向行的格式化文件
     */
    private static ArrayList<String> readFileByLines(String filePath) throws Exception {
        ArrayList<String> listStr=new ArrayList<>();
        StringBuffer sb=new StringBuffer();
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new InputStreamReader(
                    new FileInputStream(filePath), "UTF-8"));
            String tempString = null;
            int flag=0;
            // 一次读入一行,直到读入null为文件结束
            while ((tempString = reader.readLine()) != null) {
                // 显示行号
                // System.out.println("line " + line + ": " + tempString);
                if(tempString.trim().equals(""))
                    continue;
                if(tempString.substring(tempString.length()-1).equals(";")){
                    if(flag==1){
                        sb.append(tempString);
                        listStr.add(sb.toString());
                        sb.delete(0,sb.length());
                        flag=0;
                    }
                    else
                        listStr.add(tempString);
                }else{
                    flag=1;
                    sb.append(tempString);
                }
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
            throw e;
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e1) {
                }
            }
        }

        return listStr;
    }

    /**
     * 读取文件内容到SQL中执行
     * @param sqlPath SQL文件的路径:如:D:/TestProject/web/sql/脚本.Sql
     */
    public void runSqlByReadFileContent(String sqlPath){
        try {
            ArrayList<String> sqlStr = readFileByLines(sqlPath);
            if (sqlStr.size() > 0) {
                int num=batchDate(sqlStr);
                if(num>0)
                    System.out.println("执行成功");
                else
                    System.out.println("未有执行的SQL语句");
            }
            else{
                System.out.println("没有需要执行的SQL语句");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/SpiderManSun/article/details/84941882