如何在Java中运行MySQL脚本?

13 浏览
0 Comments

如何在Java中运行MySQL脚本?

我有一个MySQL脚本,当我连接时一切正常,但是它会报错说'testDB.users'不存在。因此我得出结论,我没有将MySQL脚本连接到类中。这应该如何正确完成?这是我获取连接的类。

私有静态DBManager实例;

public static synchronized DBManager getInstance() throws DBException {

if (instance == null) {

instance = new DBManager();

}

return instance;

}

私有DBManager() throws DBException {

尝试 {

Context initContext = new InitialContext();

Context envContext = (Context) initContext.lookup("java:/comp/env");

ds = (DataSource) envContext.lookup("jdbc/testDB_MySQL"); //数据源的名称为ST4DB

LOG.trace("数据源 ==> " + ds);

} catch (NamingException ex) {

ex.printStackTrace();

LOG.error(Messages.ERR_CANNOT_OBTAIN_DATA_SOURCE, ex);

throw new DBException(Messages.ERR_CANNOT_OBTAIN_DATA_SOURCE, ex);

}

}

私有数据源ds;

public Connection getConnection() throws DBException {

Connection con = null;

尝试 {

con = ds.getConnection();

} catch (SQLException ex) {

ex.printStackTrace();

LOG.error(Messages.ERR_CANNOT_OBTAIN_CONNECTION, ex);

throw new DBException(Messages.ERR_CANNOT_OBTAIN_CONNECTION, ex);

}

返回con;

}

public User findUserByLogin(String login) throws DBException {

User user = null;

PreparedStatement pstmt = null;

ResultSet rs = null;

Connection con = null;

尝试 {

con = getConnection();

pstmt = con.prepareStatement(SQL_FIND_USER_BY_LOGIN);

pstmt.setString(1, login);

rs = pstmt.executeQuery();

如果(rs.next()) {

user = extractUser(rs);

}

con.commit();

} catch (SQLException ex) {

回滚(con);

ex.printStackTrace();

throw new DBException(Messages.ERR_CANNOT_OBTAIN_USER_BY_LOGIN, ex);

} finally {

close(con, pstmt, rs);

}

返回user;

}

MySQL脚本:

CREATE TABLE roles(

id INTEGER NOT NULL PRIMARY KEY,

name VARCHAR(10) NOT NULL UNIQUE

);

INSERT INTO roles VALUES(0, 'admin');

INSERT INTO roles VALUES(1, 'client');

CREATE TABLE users(

id INTEGER NOT NULL generated always AS identity PRIMARY KEY,

login VARCHAR(10) NOT NULL UNIQUE,

password VARCHAR(10) NOT NULL,

first_name VARCHAR(20) NOT NULL,

last_name VARCHAR(20) NOT NULL,

ON DELETE CASCADE

ON UPDATE RESTRICT

);

INSERT INTO users VALUES(DEFAULT, 'admin', 'admin', 'Harry', 'Potter', 0);

INSERT INTO users VALUES(DEFAULT, 'client', 'client', 'Peter', 'Parker', 1);

context.xml属性文件:

https://i.stack.imgur.com/E7KzL.png

我需要使用DataSource。我如何在我的类中运行MySQL脚本?还有其他的方法吗?

0
0 Comments

问题出现的原因:

这段代码中的ant-derby.xml文件是用来运行MySQL脚本的配置文件,可以在其中指定脚本的路径和运行方式。然而,这段代码中只是展示了如何使用ant来运行MySQL脚本,而没有具体提到如何在Java中运行MySQL脚本的方法。

问题的解决方法:

要在Java中运行MySQL脚本,可以使用JDBC连接数据库并执行SQL语句的方式来实现。以下是一个示例代码:

import java.sql.*;
public class RunMySQLScript {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        try {
            // 连接到数据库
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "username", "password");
            // 创建Statement对象
            stmt = conn.createStatement();
            // 执行SQL语句
            String sql = "SELECT * FROM mytable";
            ResultSet rs = stmt.executeQuery(sql);
            // 处理结果集
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                // 输出结果
                System.out.println("id: " + id + ", name: " + name);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 关闭连接和Statement对象
            try {
                if (stmt != null)
                    stmt.close();
                if (conn != null)
                    conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

使用JDBC连接数据库并执行SQL语句的方法,可以灵活地控制连接池,同时也能实现更多的数据库操作。

0
0 Comments

问题原因:需要在Java中运行MySQL脚本,但是Java本身没有直接提供运行MySQL脚本的方法。

解决方法:需要解析脚本并逐行运行。可以参考stackoverflow上的相关问题,有人推荐使用工具来逐条执行SQL脚本。也可以自己编写Java代码来实现。有一个开发者已经自己编写了Java代码来运行MySQL脚本,并将其发布在Github上。

以下是相关的解决方法的代码示例:

// 导入所需的包
import java.io.BufferedReader;
import java.io.FileReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class MySQLScriptRunner {
    public static void main(String[] args) {
        // 设置数据库连接信息
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String username = "root";
        String password = "123456";
        try {
            // 加载MySQL驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 建立数据库连接
            Connection conn = DriverManager.getConnection(url, username, password);
            // 创建Statement对象
            Statement stmt = conn.createStatement();
            // 读取脚本文件
            BufferedReader reader = new BufferedReader(new FileReader("script.sql"));
            String line;
            StringBuilder sb = new StringBuilder();
            // 逐行读取脚本并执行
            while ((line = reader.readLine()) != null) {
                sb.append(line);
                // 如果遇到分号,表示一条SQL语句结束,执行该语句
                if (line.endsWith(";")) {
                    String sql = sb.toString();
                    stmt.executeUpdate(sql);
                    sb.setLength(0);
                }
            }
            // 关闭资源
            reader.close();
            stmt.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

以上代码可以解析并逐行执行MySQL脚本文件`script.sql`中的SQL语句。需要注意的是,脚本文件中的每条SQL语句必须以分号结尾。

使用这个代码示例,你可以在Java中运行MySQL脚本。如果你想了解更多关于这个的问题和其他解决方法,可以参考上面提到的stackoverflow链接和Github上的相关代码。

0