从cmd行运行JDBC oracle java程序

问题描述 投票:-2回答:2

从命令行运行JDBC oracle时出现以下问题。当我在IntelliJ中运行以下代码时,它就像一个魅力,但当我尝试通过命令行运行它时

java UserInterface filldb

我收到以下错误:

发生错误:oracle.jdbc.driver.OracleDriver

如何从命令行运行此程序?

import java.sql.*;
import java.util.List;

import oracle.jdbc.driver.*;

import javax.security.auth.callback.ConfirmationCallback;


final public class DatabaseDAO implements DAO {

    private String database;
    private String user;
    private String pass;

    // establish connection to database
    private Connection con;
    private Statement stmt;

    DatabaseDAO() throws ClassNotFoundException, SQLException{
        // load drivers and save user data
        Class.forName("oracle.jdbc.driver.OracleDriver");
        database = "jdbc:oracle:thin:@oracle-lab.cs.univie.ac.at:1521:lab";
        user = "*****";
        pass = "*****";
    }

    public void openConnection(String user, String database, String pass) throws SQLException{
            con = DriverManager.getConnection(database, user, pass);
            stmt = con.createStatement();
    }

    public void openConnection() throws SQLException{
        openConnection(user, database, pass);
    }

    public void closeConnection() { //local exception handling so method can be called in finally block, seems safer
        try {
            stmt.close();
            con.close();
        }
        catch (Exception e) {
            System.err.println("Fehler beim Verbindungsabbau in DatabaseDAO.closeConnection(): " + e.getMessage());
            System.exit(1);
        }

    }

    private void printTableSize(String tablename) throws SQLException {
        ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM " + tablename);
        if (rs.next()) {
            int count = rs.getInt(1);
            System.out.println("Number of datasets in table " + tablename + ": "+ count);
        }
        rs.close();
    }

    private boolean insertSQL (String values, String tablename) throws SQLException {
        String insertSql = "INSERT INTO " + tablename + " VALUES " + values;
        stmt.executeUpdate(insertSql);
        return true;
    }

    public void flushTable(String tablename) throws SQLException{
        stmt.executeQuery("DELETE FROM " + tablename);
    }

    public void flushDatabase() throws  SQLException {
        for ( Relation r : Relation.values())
            flushTable(r.toString());
    }
/*
    public ArrayList<String> getDatabaseEntry(int type, List<String> key) throws ClassNotFoundException, SQLException, IllegalArgumentException {

    }
*/
/*
    public boolean deleteDatabaseEntry(List<String> key) throws ClassNotFoundException, SQLException, IllegalArgumentException{}
 */
    public boolean saveDatabaseEntry(Relation type, DatabaseObject entry){
        boolean success = false;
        try{
            switch (type) {
                case Firma: {
                    Firma e = (Firma)entry;
                    String values = "(" + e.getSteuerbuchummer() + "," + e.getName() + "," + e.getFirmenbuchnummer() + ")";
                    printTableSize(Relation.Firma.toString());
                    success = insertSQL(values, Relation.Firma.toString());
                } break;
                case Template: {
                    Template e = (Template) entry;
                    String values = "(" + e.getUrl() + "," + e.getSprache() + "," + e.getIp() + ")";
                    printTableSize(Relation.Template.toString());
                    success = insertSQL(values, Relation.Template.toString());
                } break;
                case verwendet: {
                    verwendet e = (verwendet) entry;
                    String values = "(" + e.getSteuerbuchummer() + "," + e.getUrl() + ")";
                    printTableSize(Relation.verwendet.toString());
                    success = insertSQL(values, Relation.verwendet.toString());
                } break;
                case Unterseite: {
                    Unterseite e = (Unterseite) entry;
                    String values = "(" + e.getUrl() + "," + e.getPfad() + ")";
                    printTableSize(Relation.Unterseite.toString());
                    success = insertSQL(values, Relation.Unterseite.toString());
                } break;
                case Verkaufsseite: {
                    Verkaufsseite e = (Verkaufsseite) entry;
                    String values = "(" + e.getUrl() + "," + e.getPfad() + ", " + e.getTitel() + ")";
                    printTableSize(Relation.Verkaufsseite.toString());
                    success = insertSQL(values, Relation.Verkaufsseite.toString());
                } break;
                case UserAccount: {
                    UserAccount e = (UserAccount) entry;
                    String values = "(" + e.getEmail() + "," + e.getUserID() + ", " + e.getBankdaten() + ", " + e.getAdresse() + ")";
                    printTableSize(Relation.UserAccount.toString());
                    success = insertSQL(values, Relation.UserAccount.toString());
                } break;
                case befreundet: {
                    befreundet e = (befreundet) entry;
                    String values = "(" + e.getUserID1() + "," + e.getUserID2() + ")";
                    printTableSize(Relation.befreundet.toString());
                    success = insertSQL(values, Relation.befreundet.toString());
                } break;
                case Produkt: {
                    Produkt e = (Produkt) entry;
                    String values = "(" + e.getProduktID() + "," + e.getPreis() + "," + e.getProduktname() + ")";
                    printTableSize(Relation.Produkt.toString());
                    success = insertSQL(values, Relation.Produkt.toString());
                } break;
                case kauftEin: {
                    kauftEin e = (kauftEin) entry;
                    String values = "(" + e.getUrl() + "," + e.getUserID() + "," + e.getPfad() + "," + e.getProduktID() + "," + e.getAnzahl() + ")";
                    printTableSize(Relation.kauftEin.toString());
                    success = insertSQL(values, Relation.kauftEin.toString());
                } break;
                default:
                    throw new IllegalArgumentException("Parameter ungueltig in DatabaseDAO.saveDatabaseEntry(Relation type, DatabaseObject entry).");
            }
        }
        catch (Exception e)
        {
            System.err.println("Fehler beim Einfuegen des Datensatzes in DatabaseDAO.saveDatabaseEntry(Relation type, DatabaseObject entry): " + e.getMessage());
            success = false;
        }
        return success;
    }

    public Connection getCon() {
        return con;
    }

    public Statement getStmt() {
        return stmt;
    }
}

这是主要类:

import java.sql.SQLException;

public class UserInterface {
    private enum Command {
        filldb, flushdb
    }

    private static final Command checkInput(String s){
        Command[] command = Command.values();
        for(int i = 0; i < command.length; i++) if (command[i].toString().equals(s)) return command[i];
        throw new IllegalArgumentException("Commandline Parameter nicht erkannt. Kommandos: filldb, flushdb");
    }

    public static void main(String args[]) {
        DatabaseDAO db = null;
        try {
            Command command = checkInput(args[0]);
            switch(command){
                case filldb: {
                    System.out.println("Initializing DB.");

                    db = new DatabaseDAO();
                    db.openConnection();

                    System.out.println("Done.\nGenerating data and filling DB (this may take a few minutes).");
                    TestDataGenerator tdg =  new TestDataGenerator(db);
                    tdg.testData(Relation.Firma, 2000);
                    tdg.testData(Relation.Template, 2000);
                    tdg.testData(Relation.verwendet, 500);
                    tdg.testData(Relation.Unterseite, 1000);
                    tdg.testData(Relation.Verkaufsseite, 1000);
                    tdg.testData(Relation.UserAccount, 3000);
                    tdg.testData(Relation.Produkt, 4000);
                    tdg.testData(Relation.befreundet, 500);
                    tdg.testData(Relation.kauftEin, 1000);

                    System.out.println("Done. DB is now filled with several thousand entries.");
                } break;
                case flushdb: {
                    System.out.println("Flushing DB");
                    db.flushDatabase();
                }
            }
        }
        catch (SQLException e) {
            System.err.println("Ein Fehler ist bei der Kommunikation mit der Datenbank aufgetreten: "+ e.getMessage());
            System.exit(1);
        }
        catch (ClassNotFoundException e) {
            System.out.println("Klasse nicht gefunden: " + e.getMessage());
            System.exit(1);
        }
        catch (Exception e) {
            System.err.println("Ein Fehler ist aufgetreten: "+ e.getMessage());
            System.exit(1);
        }
        finally{
            if (!db.equals(null)) db.closeConnection();
            System.exit(0);
        }
    }
}
java oracle jdbc command-line
2个回答
1
投票

您需要指定包含Oracle驱动程序的类路径,Java当前只查看当前目录及其自己的类运行时。

对于窗户

java -cp .;C:\dummypath\ojdbc8.jar UserInterface filldb

对于Linux

java -cp .:/dummypath/ojdbc8.jar UserInterface filldb

.指定确保当前目录仍在类路径中,并且C:\dummypath\/dummypath/需要替换为Oracle驱动程序jar的实际位置。

旁注:我注意到你的班级UserInterface不在一个软件包中,这对于琐碎的程序来说已经足够了,但你应该养成使用软件包的习惯。


0
投票

该问题的解决方案是在执行主类时指定类路径:

java -cp。:/ home / lorenz / Code / dbs_java_l / dbs_java_l / ojdbc14.jar UserInterface filldb

谢谢大家的帮助。

© www.soinside.com 2019 - 2024. All rights reserved.