首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在java中运行MySQL脚本?

如何在java中运行MySQL脚本?
EN

Stack Overflow用户
提问于 2018-06-10 21:11:43
回答 1查看 89关注 0票数 0

我有一个MySQL脚本,当我连接它时,所有的工作都正常,但它给出了一个错误,即'testDB.users‘不存在。由此,我得出结论,我没有将MySQL脚本连接到类。怎样才能正确地做到这一点?这是我的类,在这里我得到了连接。

代码语言:javascript
复制
private static DBManager instance;

    public static synchronized DBManager getInstance() throws DBException {
        if (instance == null) {
            instance = new DBManager();
        }
        return instance;
    }

    private DBManager() throws DBException {
        try {
            Context initContext = new InitialContext();
            Context envContext = (Context) initContext.lookup("java:/comp/env");
            // ST4DB - the name of data source
            ds = (DataSource) envContext.lookup("jdbc/testDB_MySQL");
            LOG.trace("Data source ==> " + 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);
        }
    }

    private DataSource ds;
public Connection getConnection() throws DBException {
        Connection con = null;
        try {
            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);
        }
        return con;
    }

public User findUserByLogin(String login) throws DBException {
        User user = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        Connection con = null;
        try {
            con = getConnection();
            pstmt = con.prepareStatement(SQL_FIND_USER_BY_LOGIN);
            pstmt.setString(1, login);
            rs = pstmt.executeQuery();
            if (rs.next()) {
                user = extractUser(rs);
            }
            con.commit();
        } catch (SQLException ex) {
            rollback(con);
            ex.printStackTrace();
            throw new DBException(Messages.ERR_CANNOT_OBTAIN_USER_BY_LOGIN, ex);
        } finally {
            close(con, pstmt, rs);
        }
        return user;
    }

MySQL脚本:

代码语言:javascript
复制
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属性文件

我需要使用数据源。如何在我的类中运行MySQL脚本?或者,还有什么其他方法可以做到这一点?

EN

回答 1

Stack Overflow用户

发布于 2018-06-10 22:06:48

可以为此使用配置文件,就像在Derby DB中使用的一样?

ant-derby.xml

代码语言:javascript
复制
<project name="Derby">
<!--
 Derby home (we use the internal JavaDB of JDK (= Apache Derby) 
-->
    <property name="derby.home" value="C:\Program Files\Java\jdk1.7.0_67\db" />
    <!--  Derby libraries  -->
    <path id="derby.classpath">
        <fileset dir="${derby.home}/lib">
            <include name="*.jar" />
        </fileset>
    </path>
    <!--  To start/stop derby server script (macros)  -->
    <macrodef name="server">
        <attribute name="arg" />
        <sequential>
            <java classname="org.apache.derby.drda.NetworkServerControl">
                <arg value="@{arg}" />
                <classpath refid="derby.classpath" />
            </java>
        </sequential>
    </macrodef>
    <!--  To start the Derby server  -->
    <target name="server-start">
        <server arg="start" />
    </target>
    <!--  To stop the Derby server  -->
    <target name="server-stop">
        <server arg="shutdown" />
    </target>
    <!--  To run script (macros)  -->
    <macrodef name="run">
        <attribute name="script" />
        <sequential>
            <java classname="org.apache.derby.tools.ij" fork="on">
                <arg value="@{script}" />
                <classpath refid="derby.classpath" />
            </java>
        </sequential>
    </macrodef>
    <!--  To run db-create.sql script  -->
    <target name="run-testing">
        <run script="sql/Testing.sql" />
    </target>
    <!--  To select run select.sql script  -->
    <target name="run-select">
        <run script="sql/select.sql" />
    </target>
</project>

这应该有助于我控制连接池。还有别的办法吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50784049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档