3

私は現在、次の問題に直面しています。

XMLデータを解析してデータベースに配置するJavaプログラムを作成しました。私はMyBatisを使用しているので、データベースは既存のほぼすべてのデータベースである可能性があります。コードの一部を示してから、問題について説明します。

public void insert(SourceContent content){    
    SqlSession session = sqlSessionFactory.openSession();           
        try {
            session.insert("SourceDocument.insert", content);
            session.commit();
        }   catch (Exception e){
            e.printStackTrace();
        } finally {
            session.close();
        }           
    }

これは、MyBatisマッパーファイルのSQLステートメントを呼び出すための私のDAOクラスです。MyBatisのマッピング構成が正しく行われていれば、コンテンツ(Java Beanのインスタンス)の挿入は問題ありません。しかし、データベース内のテーブルの名前を変更すると、構成が間違っているために接続が失敗することを想像してみてください。今、私は次のエラーをキャッチしたいと思います。上記のようなステートメントを使用する場合:

catch (Exception e){
            e.printStackTrace();
        } 

プログラムは正しい例外を出力します:###原因:java.sql.SQLSyntaxErrorException:ORA-00942:Tabelle oder View nicht vorhandenしかし、すべての例外をキャッチしたくはありません。SQLSyntaxErrorExceptionをキャッチしたいだけです。ユーザー、データベース内の彼のテーブルが利用できないこと。しかし、上記のような通常の例外を除いて、他の例外をキャッチすることはできません。はっきりとわかっていたらいいのにと思います。誰か助けてくれませんか?

4

2 に答える 2

6

あなたの例外は別の例外にラップされています。その他の例外をキャッチして、その原因を分析します。例えば:

try {
   ....
} catch (PersistenceException e) {
  try { throw e.getCause(); }
  catch (SQLSyntaxException e) {
    // handle the exception
  }
}

それでも不十分な場合は、instanceof代わりに次の原因を調べることができます。

try {
   ....
} catch (PersistenceException e) {
  final Throwable cause = e.getCause();
  if (cause instanceof SQLSyntaxException) {
    // handle the exception
  }
}
于 2012-07-26T12:58:24.993 に答える
0

Markoが言ったことをやっていたのですが、mybatisでsql例外をキャッチするよりエレガントな方法を見つけました。

Javaクラスでマッパーを定義している場合は、たとえば、すべてのメソッドがMySQLIntegrityConstraintViolationExceptionをスローするようにすることができます。次に、マッパー関数を呼び出すときに、MySQLIntegrityConstraintViolationException例外タイプのcatchブロックのみを挿入します。

マッパー上:

@Select({
    "SELECT * FROM device WHERE id = #{id} AND deleted=0"
})
public Device getDeviceById(@Param("id") int id)  throws MySQLIntegrityConstraintViolationException;

マッパーを使用する場所:

try{
        mapper.registerAndroidDevice(newDevice);
        return newDevice.getId();
    }catch(MySQLIntegrityConstraintViolationException sql){
        logger.error("Constraint violation",sql);
        return -1;
    }catch(Exception e){
        logger.error("Error inserting Android device into Database", e);
        return -1;
    }

もちろん、mybatisが内部で使用しているライブラリであるため、他のSQLjdbc4例外を使用してこれを行うことができます。

于 2013-09-19T06:32:08.450 に答える