如何在Java中运行MySQL脚本?
如何在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脚本?还有其他的方法吗?
问题出现的原因:
这段代码中的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语句的方法,可以灵活地控制连接池,同时也能实现更多的数据库操作。
问题原因:需要在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上的相关代码。