S-JIS[2009-04-20/2009-12-26] 変更履歴
HtJavaDBツールは、JavaDBのテーブルのデータを操作(照会・更新)する為のツールです。
htjavadb.jar | (229kB) | [2009-12-26] | JDK1.6以降 |
htjavadb.src.zip | (105kB) | [2009-12-26] | ←ソースはEclipseで添付できる |
Javadoc | [2009-04-26] |
|
自作クラスの使用方法 | |
|
HtJavaDBツールは、JavaDBのテーブルのデータを操作(照会・更新)する為のツールです。
JavaDBはJDK1.6(JRE1.6でなく)に付いている機能なので、JDK1.6以降がインストールされている必要があります。
Windows以外でも動くはずですが、試していません。設定内のデフォルトのパスはWindows向けになっています^^;
直感的なGUIで操作できるつもりですが、当ツールはJavaDBとSwingの勉強の為に作ったものなので、冗長だったり機能が足りなかったりする部分もあります。
HtJavaDBの「Ht」は「ひしだまが試しに作った」の略です(笑)
htjavadb.jarは実行可能jarファイルですので、Windowsではダブルクリックすれば実行できます。
また、コンソールからクラスパスを指定して実行する事も可能です。
jdk1.6.0_02以降の場合 > java -cp "htjavadb.jar;C:\Program Files\Sun\JavaDB\lib\derby.jar;C:\Program Files\Sun\JavaDB\lib\derbyclient.jar" jp.hishidama.javadb.tool.HtJavaDB jdk1.6.0の場合 > java -cp "htjavadb.jar;C:\Program Files\Java\jdk1.6.0\db\lib\derby.jar;C:\Program Files\Java\jdk1.6.0\db\lib\derbyclient.jar" jp.hishidama.javadb.tool.HtJavaDB
コンソールから起動すると、例外が起きたときはコンソールにスタックトレースが出力されるので便利です。
起動したら、まず、ドライバーの使用方法を設定する必要があります。
メニューバーの「ヘルプ(H)」→「設定(S)」で設定ダイアログを開きます。
設定ダイアログでは、その他の設定もすることが出来ます。
「設定ファイルの場所」は、プロパティーファイルとDB一覧を保存するファイルの場所を示しています(変更不可)。
「書式」は、DateやTime型の値を表示・入力する際のフォーマットを指定します。指定する文字はSimpleDateFormatで使えるものです。
設定ダイアログで保存した内容は当ツール終了時に設定ファイル(MS932のプロパティーファイル)に書き込まれます。
画面上部のコンボボックス欄にDBのURLを入力し、「DB読み込み」ボタンを押すか、メニューバーの「接続(C)」→「DB読み込み(C)」を選択します。
ここで内部的にはDB接続(connect)します。
設定ダイアログでDriverManagerが選択されていた場合、JDBCの通常の接続方法である、DriverManager#getConnection()を使用します。
Driverが選択されていた場合、指定されたjarファイルを読み込むためのURLClassLoaderを作り、そこからDriverインスタンスを生成してそれに対してconnect()を実行します。
接続が成功すると、下のツリー欄にスキーマとテーブルの一覧が表示されます。
(ビューや他のオブジェクトは対象外です)
接続を行うと、画面上部に入力していたURLがコンボボックスの選択肢一覧に追加されます。
選択肢一覧をカーソルで選択してCtrl+Dを押すと一覧から削除できます。(マウスで選ぶとダメ)
DB一覧用設定ファイルの中にこのコンボボックスの一覧がそのまま入っているので、そちらを編集することもOKです。
DBへの接続中に再度接続すると、一旦切断(Connection#rollback()およびConnection#close())およびシャットダウンしてから再度接続します。[/2009-12-26]
コネクションは、当ツール内で1つしか保持しません。
テーブルやフリーSQLのウィンドウをいくつか開いていても、コネクションは全て共通です。
なので、(特にフリーSQLで)複数の更新をしていた場合、どれか1つでコミットすると、全更新がコミットされます。
DB接続後、ツリーの中でテーブル名をダブルクリックすると、テーブル用のウィンドウが開きます。
タブ名 | 説明 |
---|---|
定義 | テーブル定義、すなわち項目名や型を表示します。 |
キー | プライマリキーおよびDatabaseMetaData#getBestRowIdentifier()による一意キーを表示します。 |
データ | テーブルのデータの表示および更新を行います。 |
「データ」タブでは、データの入力が行えます。
値を変更したいセルでキーを押せば、新しい入力が出来ます。
また、入力時に右端に出るボタンをクリックすれば、入力用ダイアログが開きます。
入力用ダイアログには選択肢がいくつかあります。
選択肢 | 説明 | SQL実行時の違い |
---|---|---|
値 | データに入れる値を書きます。 | SQL実行方法としては、PreparedStatementの「?」を使って入力されます。 |
null | 「null」です。 | 組込関数で「null」と入力したのと同じです。 |
default | 「default」です。 | 組込関数で「default」と入力したのと同じです。 |
組込関数 | 項目に指定する関数を書きます。 | SQL実行方法としては、PreparedStatementに渡すSQL文内に直接書かれます。 |
つまり「組込関数」は、current_timestampのような関数を使いたい場合を想定しています。
「null」を選択した場合、実際のSQLは、「update テーブル set 項目=null where 〜」という形になります。
もし「値」で「null」という文字列を指定していた場合、SQLは「update テーブル set 項目=? where
〜」となり、パラメーターに「null」という文字列が指定されます。
データが変更された場合、そのセルの背景は黄色くなります。(UPDATE)
行が新しく追加された場合、そのセルの背景は青くなります。(INSERT)
行が削除される場合はセルの背景が赤くなります。(DELETE)
この状態でメニューバーの「編集(E)」→「更新SQL実行」を選ぶと、SQL実行が行われます。全SQLが正常終了するとコミットも行われます。ひとつでも実行に失敗すると、その時点で処理を中断し
てロールバックします。
SQL実行をしない状態で「編集(E)」→「更新キャンセル」を選ぶと、変更前の状態に戻ります。(イメージとしてはロールバックですが、変更を行ってもSQL実行して待っている訳ではないので、DB操作としては何も行いません。表示を、ツール内で保持している古い値に戻しているだけです)
SQL文を自由に入力して実行する為のウィンドウです。
本体ウィンドウのメニューバーの「接続(C)」→「FreeSQL」で開きます。
SQL文を入力して、メニューバーの「実行(E)」から「executeQuery」「executeUpdate」「execute」のいずれかを選択すると実行します。
選択肢は、それぞれStatementのメソッドを表しています。(PreparedStatementではありません)
executeQueryはSELECT文、executeUpdateはINSERT文やUPDATE文などでしか実行できないので、違うものを実行してエラーになることが確認できます(笑)
executeは全てに対応しているようです。
コミットとロールバックは別途メニューから行って下さい。
SQL文はセミコロンで終了している想定で、末尾のセミコロン1個は削除して実行します。
(もしセミコロンが2個以上付いていた場合、1個は削除されますが残りはそのままStatementに渡され、エラーになります^^;)
SQL文が選択されていない場合、入力されている全ての文字列を1つのSQLとして実行します(この辺りは手抜き…)。
文字列の一部が選択されている場合、そこをSQLとして実行します。
SELECT文を実行した場合、上部にデータ取得結果の表が表示されます。(この表からは更新は出来ませんが、コピー&ペーストでテーブルウィンドウへ貼り付ける事は出来ます)
メニューの「データ再読込(R)」は、最後に実行されたSELECT文を再度実行するものです。
htjavadb.jarと、設定ファイルだけ消せばOKです。
設定ダイアログでDriverを選択した場合、注意点があります。[2009-04-23]
Driverを選択した後にDB接続をする際、当ツールでは、ライブラリー(jarファイル)のパスが以前と1文字でも異なっていた場合、クラスローダー(インスタンス)を再作成し、それを使ってDriverインスタンスも再生成します。
この方法を採ると、なぜか、以前接続していたDBには接続できません。以下のようなエラーになります。
XJ040: データベース 'C:/temp/javadb/sample1' を始動できません。詳しくは、次の例外を参照してください。 XSDB6: Derby の別のインスタンスがすでにデータベース C:\temp\javadb\sample1 をブートしている可能性があります。
これは別のアプリケーションがDBに接続していた場合と同じエラーメッセージなので、原因の区別がつきません。
この場合、当ツール自身を再起動しないと正常に接続できません。(設定ダイアログの内容は保存されるので、再起動後から有効です)
→原因の推測
ライブラリーのパスの変更前後で別DB(接続URLが異なるもの)へアクセスする場合は問題無いようです。
以前は、設定ダイアログでDriverを選択した場合、接続していたDBに再接続できませんでした。[2009-12-26]
接続していたDBをシャットダウンすることにより、ドライバーの指定を変更した後も問題なく接続できるようになりました。
HtJavaDBツールはSwingの勉強も兼ねて作っています。
Swingのコンポーネントを使うに当たって作ったクラスの使用方法を備忘として書いておきます。
遅延展開をするJTree。
HtJavaDBツールではスキーマのツリーで使用している。
枝ノードを開こうとした時点で、その子ノード一覧を作成する為のJTree。
(今回のツールでは、まずDB名をルートノードに登録している。
ルートノードを開こうとした時に初めてスキーマ一覧を取得している。
また、そのスキーマのノードを開こうとした時点でテーブル一覧を取得している)
ツリーはTreeNodeで構成されているが、遅延展開用にLazyTreeNodeクラスを作った。
これをLazyTreeに登録していると、ノードを開こうとした時にLazyTreeNode#addChildNodes()を呼ぶようになっている。
class MyTreeNode extends LazyTreeNode { /** コンストラクター */ public MyTreeNode() { super("ノード名"); } // ノードが開かれる際に呼ばれる @Override protected void addChildNodesImpl() { //子ノードを作成し、ツリーに追加する for (int i = 1; i < 10; i++) { MutableTreeNode node = new DefaultMutableTreeNode("子ノード名" + i); add(node); } } }
行ヘッダー(左側の見出し)を出す為のJTable。
HtJavaDBツールではテーブルウィンドウ等で使用している。
// データ本体のJTable
JTable table = new JTable();
〜
JScrollPane scroll = new JScrollPane(table);
new RowHeaderTable(table, "見出し", 48).installTo(scroll);
RowHeaderTableのコンストラクターでは、データ本体となるJTableと行ヘッダーの上部に表示される見出し、および行ヘッダーの幅を指定する。
その後、installTo()によってJScrollPaneにRowHeaderTableを登録する。(JScrollPaneの行ヘッダー機能を使用している為)
見出し | tableの列ヘッダー | |||
---|---|---|---|---|
行 ヘ ッ ダ |
tableの本体 | △ | ||
□ □ □ |
||||
▽ | ||||
< | □□□□□□ | > |
JTableにちょっと機能追加しただけ。
コーディングとしては、普通にJTableの代わりに使うだけ。
遅延更新を行うJTable。つまり、セルに入力した更新を、後から「コミット」しないと実際に反映されない。
HtJavaDBツールではテーブルウィンドウで使用している。
コーディングとしては、JTableの代わりにLazyTableを使い、DefaultTableModelの代わりにLazyTableModelを使う。
値の変更や行追加・削除は普通のJTableと同様に操作できるが、LazyTableModel内部で変更前後の値を保持している。
LazyTableModel#commit()を実行すると更新を反映させ、rollback()を実行すると古い値に戻している。
HtJavaDBツールではcommit()・rollback()をオーバーライドし、DB更新の為のSQL実行も行っている。
拡張したテキスト系コンポーネント。
UNDO/REDO機能とポップアップメニューによるコピー&ペースト機能を実現している。
ExTextPaneでは、折り返し有無の設定等も出来るようにしている。
コーディングとしては、普通のコンポーネントの代わりに使うだけ。
内部的にはTextManagerというクラスを使ってUNDO/REDO機能とポップアップメニュー機能を追加している。
通常のJTextComponent系クラスでも、これを使えば機能追加できるはず。
JTextComponent tc = 〜; new TextManager().installTo(tc);
デフォルトのメニューを準備するJPopupMenu。
デフォルト以外のメニューにしたい場合は以下の様に拡張する。
JComponent c = 〜; JPopupMenu pmenu = new ExPopupMenu(c) { @Override protected void addMenus() { //以下の2つだけ登録する addCopy(); //コピーメニュー addSelectAll(); //全選択メニュー } }; c.setComponentPopupMenu(pmenu);
ポップアップのメニューが選択された時は、コンストラクターに渡したコンポーネントに対してのアクションが実行される。
したがって、同じポップアップメニューインスタンスを複数のコンポーネントに登録しても、常に1つのコンポーネントに対してアクション(処理)が実行される。
これは、データ用のJTableと、それに該当する行ヘッダーのJTableの両方に同一のポップアップメニューを登録して、アクションは最初のJTableに対して行いたくて作った。
ラジオボタンの選択肢をカーソルキーの上下左右によって移動できるButtonGroup。
コーディングとしては、普通のButtonGroupの代わりに使用するだけ。
ButtonGroup bg = new ExButtonGroup(); bg.add(r1); bg.add(r2); bg.add(r3);
new ExButtonGroup(r1, r2, r3);
更新日 | 変更内容 |
---|---|
2009-12-26 | コネクションのクローズ時にDBのシャットダウンも行うよう修正。 これにより、組込環境で接続していたDBを切断すれば、当ツールを終了させなくても他ツールからそのDBにアクセスできるようになった。 |