JavaからMySQLにSELECT文を投げるコードサンプル
MySQLサーバからJavaでデータを取得するためのサンプルを載せます。
まずはDBの情報。
以下のようなDBのデータをJavaを使って取得したい。
mysql> desc test1; +----------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | title | varchar(100) | YES | | NULL | | | author | varchar(100) | YES | | NULL | | | sentence | text | YES | | NULL | | +----------+--------------+------+-----+---------+----------------+ 4 rows in set (0.03 sec)
中に入れるデータはこの通り。
insert into test1 values(1,'ONE PIECE','尾田栄一郎','海賊王に おれはなる!'); insert into test1 values(2,'HUNTER HUNTER','冨樫義博','カイトは生きてる!'); insert into test1 values(3,'ドラゴンボール','鳥山明','オラわくわくすっぞ!');
中を見てみよう。
mysql> select * from test1; +----+----------------+------------+------------------------+ | id | title | author | sentence | +----+----------------+------------+------------------------+ | 1 | ONE PIECE | 尾田栄一郎 | 海賊王に おれはなる! | | 2 | HUNTER HUNTER | 冨樫義博 | カイトは生きてる! | | 3 | ドラゴンボール | 鳥山明 | オラわくわくすっぞ! | +----+----------------+------------+------------------------+ 3 rows in set (0.00 sec)
参考にしたのは下記のサイトだ。
http://dev.mysql.com/doc/refman/5.1/ja/connector-j-usagenotes-basic.html
properties.txt
jdbc=mysql host=localhost db=db1 user=test1 pass=test1 sql=select * from test1
MySQLSelect.java
package jdbc; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; import java.sql.*; import com.mysql.jdbc.Connection; import com.mysql.jdbc.Statement; public class MySQLSelect { private static String jdbc = null; private static String db = null; private static String host = null; private static String user = null; private static String pass = null; private static String driver = null; private static String sql = null; public static void main(String[] args){ Properties prop = new Properties(); FileInputStream fis = null; try { fis = new FileInputStream("properties.txt"); } catch (FileNotFoundException e) { e.printStackTrace(); System.err.println("プロパティファイルが見つかりません"); } try { prop.load(fis); } catch (IOException e) { e.printStackTrace(); System.out.println("プロパティファイルを開けません"); } //プロパティの読み込み jdbc = prop.getProperty("jdbc"); db = prop.getProperty("db"); host = prop.getProperty("host"); user = prop.getProperty("user"); pass = prop.getProperty("pass"); sql = prop.getProperty("sql"); //ドライバの作成 //jdbc:mysql://localhost/db1?user=test1&password=test1 driver = "jdbc:"+jdbc+"://"+host+"/"+db+"?user="+user+"&"+"password="+pass; Connection con = null; try{ con = (Connection) DriverManager.getConnection(driver); Statement stmt = (Statement) con.createStatement(); ResultSet rs = stmt.executeQuery(sql); while(rs.next()){ int id = rs.getInt("id"); String title = rs.getString("title"); String author = rs.getString("author"); String sentence = rs.getString("sentence"); System.out.println(id+":【"+ title +"】\n" + author + "\n"+ sentence+"\n"); } }catch(SQLException ex){ System.out.println("SQLException: " + ex.getMessage()); System.out.println("SQLState: " + ex.getSQLState()); System.out.println("VendorError: " + ex.getErrorCode()); }finally{ if(con != null){ try{ con.close(); }catch(SQLException e){ e.printStackTrace(); } } } } }
実行すると変なエラーが出たので、修正を試みる。
SQLException: Access denied for user 'test1'@'localhost' (using password: YES) SQLState: 28000 VendorError: 1045
以下の2つのサイトを参考に、パスワードや権限を再設定した。
http://sasuke.main.jp/useri.html
GRANT ALL PRIVILEGES ON *.* TO 'test1'@'localhost' IDENTIFIED BY 'test1' or GRANT ALL PRIVILEGES ON *.* TO 'test1'@'%' IDENTIFIED BY 'test1';
無事に実行ができるようになった。<実行結果>
1:【ONE PIECE】 尾田栄一郎 海賊王に おれはなる! 2:【HUNTER HUNTER】 冨樫義博 カイトは生きてる! 3:【ドラゴンボール】 鳥山明 オラわくわくすっぞ!
JavaEE,Tomcatの設定等の周辺知識のまとめ
Javaを使ってWebアプリを作りたいときに、ぶち当たる壁。
それは環境構築の壁である。
URLを指定しても404エラーが出る。なぜ。
そもそもTomcatが起動しない。なぜだ。
weeb.xml,server.xml色々あって意味がわからない・・・。なんなんだ。
そんなとき、いつものようにgoogleを使って検索を試みるけれど、
基礎知識もないのに断片的な情報をネットで拾っても問題は解決しない。
webをさまよった後、僕は悟る。
googleは万能ではないと。
基礎に立ち戻り、本を読んだ。
その結果をまとめたのがこの記事である。
以下、書籍のまとめです。
詳しく知りたい人はこちらの本を読みましょう。
webアプリケーションとは
サーバ側で動作するアプリケーションのこと。
Javaの仕様書によれば、Webアプリケーションとは、サーブレット、JSP、HTMLドキュメント、その他イメージファイル、圧縮されたアーカイブなどを含むリソース全体を集めてきたもの。
JavaEEとは
サーバ再度アプリケーションを実現する包括的な仕様のこと。
Enterprise Editionの略。
ちなみにJavaSEとは、Java Standard Editionのことであり、
JVM,JNDI,JDBC,Swingなど、JVM、標準API、デスクトップ環境APIを含むエディションのこと。
コンテナとは
サーバー側でWebアプリケーションを動作させるための実行環境のこと。
サーブレットの実行環境はWebコンテナ、JSPの実行環境はJSPコンテナという。
Webコンテナ、JSPコンテナを総称してWebコンテナということもある。
Tomcatとは
サーブレット/JSPの仕様に基づいて実装されたWebコンテナのこと。
Http通信処理機能もあるため、Webサーバとしても利用できる。
CATALINA_HOMEとは
Tomcatのルートのこと。
Tomcatでは、%CATALINA_HOME%\webapps以下にコンテキストルートを置くことが決められている。
コンテキストルートについては後述する。
Tomcatのインストール手順
・linuxにインストールする場合
手順書.comが一番わかりやすかったです。
http://tejunsho.com/tomcat/20110331000102.html
ただし、この手順書の通り実行しても下記のエラーが出るため、
5のパッケージがなかったので「6」に変更。
(誤)#yum install tomcat5 tomcat5-webapps
エラーメッセージ
Loaded plugins: fastestmirror, security Loading mirror speeds from cached hostfile * epel: ftp.kddilabs.jp Setting up Install Process No package tomcat5 available. No package tomcat5-webapps available. Error: Nothing to do
正しいバージョン
(正)yum install tomcat6 tomcat6-webapps
JavaEE仕様の標準ディレクトリ構成(重要)
コンテキストルート │ ├WEB-INF │ │ │ ├classes HTML ├src JSP ├web.xml ├lib │ ├JAR │ ├tags
繰り返しになるが、ディレクトリ構成は仕様として決められている。
コンテキストルート
→Webアプリケーションを構成するすべてのコンテンツを格納するディレクトリのこと。
webapps直下のディレクトリ。
WEB-INF
→コンテキストルート以下に必ず配置しなければいけないディレクトリ。
Javaファイルや設定ファイルを格納する。このディレクトリ以下はインターネットでは公開されない。
必ず大文字半角で記述する。
classes
→Javaのクラスファイルを格納するディレクトリ。コンテキストルート\WEB-INF以下に配置する。
パッケージ化したクラスはパッケージに対応したディレクトリで格納する。
例)jp.co.hoge.Testクラスなら
WEB-INF/classes/jp/co/hoge/Test.classの階層で格納する。
lib
→JARファイルを格納する。ここに格納されたファイルは、Webコンテナ起動時に自動的にクラスパスが設定される。
JDBCなどはここに配置する。
src
→意外にも、これは任意のフォルダ。あってもなくてもいい。一般にソースファイルを置く。
web.xmlとは
webアプリケーションの設定ファイルのこと。配備記述子(デプロイメントディスクリプタ)と呼ばれる。
/WEB-INF/web.xml
に置く。繰り返すが、ディレクトリ構造はあらかじめサーブレットAPI仕様書によって決められている。
サーブレットの登録
web.xmlに登録されたサーブレットの呼び出しのための構文。
以下のURL構文で呼び出す。
http://<ホスト名>:<ポート番号>/<コンテキストルート名>/
web.xmlの記述が下記の場合・・・
<servlet> <description></description> <display-name>Sample1_1</display-name> <servlet-name>Sample1_1</servlet-name> <servlet-class>servlet.Sample1_1</servlet-class> ★サーブレットクラス名 </servlet> <servlet-mapping> <servlet-name>Sample1_1</servlet-name> ★マッピングするURLパターン <url-pattern>/Sample1_1</url-pattern> </servlet-mapping>
サーブレット呼び出しの構文は以下の通り
http://localhost:8082/webComp/Sample1_1
※tomcatのデフォルトのポートは8080なので注意が必要。
※ポートはserver.xmlで設定可能です。
マッピングするパターンを変更すると・・・
<servlet> <description></description> <display-name>Sample1_1</display-name> <servlet-name>Sample1_1</servlet-name> <servlet-class>servlet.Sample1_1</servlet-class> ★サーブレットクラス名 </servlet> <servlet-mapping> <servlet-name>Sample1_1</servlet-name> <url-pattern>/hoge</url-pattern> ★マッピングするパターンを変更すると・・・・ </servlet-mapping>
呼び出しURLは下記のようになる。
http://localhost:8082/webComp/hoge
ウェルカムページの設定
<welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list>
http://localhost:8082/webComp/
のようにコンテキストルートまでしかURLで指定しないとき、上から順番に
HTTPのステータスコードによってファイルを指定する場合
<error-page> <error-code>404</error-code> <location>/sorry.html</location> </error-page>
このように記述しておくと、404(ファイルが見つからない)ときは、コンテキストルート以下のsorry.htmlが表示される。
web.xmlのルートとなるタグ
tomcat上で「コンテキストルート」とは、webapps直下のディレクトリである。
とりあえずのまとめでした。
随時、追記します。
いやほんと、tomcatの設定って訳わからんかったし、検索してもなかなか解決しなくて大変だった。
基本過ぎていまさら聞けないJavaの盲点集
インターフェースは多重継承ができる
Javaではクラスの多重継承は禁止されているが、インターフェースの多重継承は可能である。
インターフェース内で変数の宣言はできない。フィールドは全て定数になる。
(例)
package test; interface Man{ public static final String He = "男"; public abstract void Tinko(); } interface Woman{ //interface内の変数は暗黙的にpublic static finalとなる。定数の初期化は必須である。 String She = "女"; //インターフェースのメソッドは暗黙的にpublic abstraceで就職される void Manko(); } interface Okama extends Man, Woman{ } /** おかまの能力を継承した新人類クラス */ public class Shinjinrui implements Okama{ public void Tinko(){ System.out.println("男性のもの"); } //このメソッドのアクセス修飾子はpublic じゃないとエラーになる。 //なぜならインターフェースのメソッドが暗黙的にpublic abstractで修飾されているから //アクセス修飾子を厳しくすることはできない。 public void Manko(){ System.out.println("女性のもの"); } }
package test; public class Main { public static void main(String[] args){ Shinjinrui kami = new Shinjinrui(); kami.Tinko(); kami.Manko(); System.out.println(kami.He); System.out.println(kami.She); } }
<結果>
男性のもの 女性のもの 男 女
Stringクラス(不変)とStringBuilderクラス(可変)の違い
Stringクラスは不変として設計されているため、Stringオブジェクトがラップする文字列の変更するためのメソッドは聴許されていない。
変更可能な文字列を作成したい場合は、StringBufferクラスを使う必要がある。
Stringクラスで提供されている文字列連結のためのメソッドはconcat
StringBuilderクラスの場合はappendメソッドを使う。
public class StringTest { public static void main(String[] args){ String str = "original"; String strTmp = null; //こうすると新しいオブジェクトが生成されるが、ここでこのオブジェクトを参照する変数がないからガーベジコレクションの対象になる str.concat(" addStr"); strTmp = str.concat(" addStr"); //結果は「strTmp:original addStr」 System.out.println("strTmp:" +strTmp); //結果は「str.concat():original」 System.out.println("str.concat():"+str); //新たにできた「original addStr2」のオブジェクトを参照する str = str.concat(" addStr2"); //結果は「str.concat():originaladdStr」 System.out.println("str.concat():"+str); StringBuffer strb = new StringBuffer("originalBuff"); strb.append("addBuff"); System.out.println(strb); } }
「equals」と「==」の違いについて
以下のようにString型の変数を宣言する。
String str = "hoge";
これを宣言したとき、同じ"hoge"のリテラル文字列が既にメモリ上にあれば、
そのリテラル文字列が変数に割り当てられる。
str2 = "hoge"とした場合
以下の図のように、同じオブジェクトを参照することになる。
「==」は同じオブジェクトを参照するかを比較する。
「equals」はオブジェクトが保持する文字列を比較する。
以下の例を見ればよりわかりやすいと思う。
public class StringTest2 { public static void main(String[] args){ String str1 = "hoge"; String str2 = "hoge"; //結果はTRUE if (str1 == str2){ System.out.println("str1とstr2は同じオブジェクトを参照している"); }else{ System.out.println("str1とstr2は違うオブジェクトを参照している"); } //新たにnewでオブジェクトを作った場合 String str3 = "hoge"; String str4 = new String("hoge"); //結果はFALSE if (str3 == str4){ System.out.println("str3とstr4は同じオブジェクトを参照している"); }else{ System.out.println("str3とstr4は違うオブジェクトを参照している"); } //equalsの場合、結果はTRUE if (str3.equals(str4)){ System.out.println("str3とstr4のオブジェクトは同じ文字列を保持している"); }else{ System.out.println("str3とstr4のオブジェクトは同じ文字列を保持している"); } } }
<結果>
str1とstr2は同じオブジェクトを参照している str3とstr4は違うオブジェクトを参照している str3とstr4のオブジェクトは同じ文字列を保持している
ちゃんと詳しく勉強したい人がいたら、この本を参考にするといいです。
「成金」それはホリエモンの成り上がりを追体験できるもの
ご存知「ホリエ本」。
本作は「拝金」に続くホリエモンの二作目の小説である。
文章自体はケータイ小説のように軽い。
話の展開も村上春樹のようにファンタスティックでもなく、
伊坂幸太郎のように張り巡らされた伏線が気持よく回収される訳でもない。
それでも、面白い。
それはなぜか。
堀江貴文という男の人生が魅力的だからだ。
文章は軽くても、堀江の人生が濃く重いからだ。
そして、実在する人物(それは容易に想像できる)とのやりとり。
フィクションの中の圧倒的なリアリティこそが、この小説の魅力だ。
人の人生を形容する言葉として、
「ジェットコースター」
という言葉がこれほど似合う男はいないだろう。
IT業界の寵児ともてはやされた2000年代前半。
それが一転し、2006年ライブドア事件での逮捕。
釈放されてからは、出版やブログ、メルマガを通じて活動を再開。
ひと月840円のメルマガの読者数は1万人を超えた。
東日本大震災時には50万人を超えるフォロワーに対し、行方不明者の情報をリツイートし、それによって救われた人も現れた。
そして2011年4月26日、2年の実刑判決が下された。
まさにジェットコースターではないか。
面白い。不謹慎かもしれないが、本当に面白い人だと思う。
この「成金」という小説の中には、堀江貴文からのメッセージが所々に散りばめられている。
小説の展開も所々現実とリンクしているが、ここでは堀江貴文からのメッセージを小説の中の言葉のままに紹介したい。
「金で動かされる人間はダメだ。価値のあるのは、ま、使える人間って言い換えてもいいけど、金でしか動かない本当のプロフェッショナルか、金では動かないアマチュアなんだよ」 IT業界はスピードが全てだ。 堀井は確信している。 構想しているアイデアは間違いなく画期的だが、いま、この瞬間、まったく同じアイデアを持った人間が必ずどこかにいる。競争相手はインターネットで網羅された全世界なのだ。ライバルは見たことも聞いたこともないどこかの国の、小さな街角の、ぼろいガレージの中にいる。 自由な意思がなければ、ITの世界を勝ち抜くのは不可能だ。 「信じ切ることだ。僕たちならできる、その先には必ず未来が開かれている。絶対に世界で勝てる。僕たちが最も優れている」 (パソコンを指して)この小さな箱には無限の世界が広がっている。 起業は傍目にはかっこよく映るかもしれない。でもその資格は、死ぬほど寒い真冬の夜に、室外機のぬくもりを頼りに平然と寝る覚悟があるやつだけに与えられる。 値段をつけられることではなく、値段をつける側になるほうが、ずいぶんましなことだし、もっと言えば、本当の価値とは誰からも値段をつけられないことだと、僕はそう思うけどね。 国内のみならず、世界の主要なIT企業はぼろくて狭い空間(ガレージ)で産声を上げてきた。 ビル・ゲイツのマイクロソフト、スティーブ・ジョブズのアップル。世界に冠絶するIT企業のトップたちはその風景を知っている。ほかならず彼ら自身がほんの数十年前にガレージで立ち上げたのだから。 堀井は、それがITの可能性だと思っている。 「すべてはガレージから----」 このぼろい事務所こそがITの持つ可能性だった。夢そのものなのだ。
この本は、堀江貴文が駆け上がって行く時の、当時の息吹を感じさせてくれる。
私達は、成功した後の彼しか知らないが、彼の雌伏の時期にこそ、彼の魅力が詰まっているのではないだろうか。
そして、稀代の起業家である堀江の雌伏の時期を追体験できる最も有効な方法は、この小説を読むことだったのだ。
いまさら聞けない基本過ぎて見逃しがちなJavaの基礎の基礎
Javaプログラマの勉強をしていて、実は基礎の基礎の部分の知識が曖昧だったことに気付いた。
ここで、今まで曖昧にしていた知識を一旦まとめてみようと思う。
■データ型について
データ型は、「基本データ型」と「参照型」に分かれている。
数値や文字などを意味するデータ型のことを基本データ型またはプリミティブ型という。
リテラルとは、ソースファイル内に直接記述した値のこと。
文字リテラル:文字1文字分。文字の前後を(')で囲む。
文字列リテラル:複数の文字をデータとして持つリテラルのこと。(")で囲まれたもの。
エスケープシーケンスとは、改行やタブなどを文字リテラルで表すときの文字のことをいう。
主なエスケープシーケンス一覧
\b バックスペース \f フォームフィード \n 改行 \r 復帰 \' シングルクオテーション \" ダブルクオテーション \\ バックスラッシュ
javaのコードでディレクトリを指定するときに「C:\\temp\\hoge」のように「\」を連続で書くのは、
エスケープシーケンスでバックスラッシュ(\)を表す表記が「\\」であるためである。
■変数について
メンバ変数とローカル変数
変数は記述する場所によってメンバ変数とローカル変数に分けることができる。
メンバ変数は「フィールド」や「プロパティ」と呼ばれる。
class Foo{ メンバ変数の記述場所 ・インスタンス変数 ・static変数 戻り値の型 メソッド(引数){ } }
インスタンス変数とは、インスタンスを生成して初めて利用できる変数のこと。
一旦生成されたインスタンス変数はそのオブジェクトが消去されるまで利用することができる。
static変数とは、プログラムの実行を開始した時点ですぐに利用することができる。
つまり、オブジェクトを作成することなく使うことができる。
static変数はメソッド内で宣言することはできない。
つまり、static変数はメンバ変数としてしか宣言できない。
一つのクラスから複数のオブジェクトを生成するとしても、static変数は1つしか生成されない。
class ClassA{ //メンバ変数 static int a = 20; //static変数 int b = 10; //インスタンス変数 }
ローカル変数とは、メソッド内で局所的に利用される変数のこと。
メソッド内で利用するので、メソッドローカル変数ともいう。
メソッド内の特定のブロック内で宣言された変数をブロック変数という。
ブロックとは「{}」で囲まれたまとまりのことである。
引数もローカル変数の一種である.
class Foo{ メンバ変数の記述場所 ・インスタンス変数 ・static変数 戻り値の型 メソッド(引数){ //ローカル変数の記述場所 ・メソッドローカル変数 ・ブロック変数 } }
メソッドローカル変数はメンバ変数と同じ名前にすることも可能だが、同じ名前にしたらメソッドローカル変数が優先される。
メソッド内で同じ名前のメンバ変数を使いたい時はthisキーワードを使う。
public void setX(int x){ this.x = x; }
このようにセッターを書くときに「this」と書くのは、メソッドローカル変数xを、同じ名前のメンバ変数xに代入するという意味。
thisを付けないと、xはメソッドローカル変数を指すことになる。
メンバ変数は自動的にデフォルト値に初期化されるが、ローカル変数は自動的に初期化されない。
なので、ローカル変数は明示的に初期化しないとコンパイルエラーが起こる。
メンバ変数のデフォルト値は以下の通り.
boolean false byte 0 short 0 char '\u0000' int 0 long 0L float 0f double 0.0D 参照型 null
■equalsメソッド
Objectクラスで定義されているメソッドである。
参照型変数1.equals(参照型変数2)
デフォルトでは参照型変数1に格納されているアドレス情報と参照型変数2に格納されいるアドレス情報が等しいかどうかを判断する。つまり、2つの参照変数が同じインスタンスを参照しているかどうかを判断する。
ちゃんと勉強したい人は以下の書籍を参照してください。
インプレスジャパン
売り上げランキング: 177788
eclipseを使っていると忘れがちなjavaのコマンドライン操作周辺知識のまとめ
javaを実行する際に依存関係のあるクラスは、JVMから検索可能である必要がある。
JVMの検索対象は%JAVA_HOME%/jre/lib/extや標準ライブラリに配置されたモジュールである。
/jre/lib/extディレクトリは拡張ディレクトリと呼ばれ、自動的にCLASSPATHに追加される仕組みである。
具体的には、
C:\Program Files (x86)\Java\jdk1.6.0_31\jre\lib\ext
に配置されたjarファイルならば、JVM(=javaの実行環境)から検索可能であるということである。
それ以外のクラスを利用する場合には、明示的にクラスパスを指定する必要がある。
ちなみにjarファイル内のクラスを利用する場合は、クラス名ではなく、jarファイル名を指定する必要がある。
javacコマンドでクラスファイルの出力先を指定する
tempフォルダ以下にTest.javaがある。
C:\temp\java>dir 2012/07/14 17:28 <DIR> test 2012/07/14 17:28 100 Test.java
javacコマンドを使ってコンパイルして、classファイルを作成する。
デフォルトではカレントフォルダにclassファイルが作成される。
C:\temp\java>javac Test.java C:\temp\java>dir 2012/07/14 17:28 <DIR> test 2012/07/14 17:30 413 Test.class 2012/07/14 17:28 100 Test.java
ディレクトリを指定してclassファイルを出力させたい時
C:\temp\java\classes以下にclassファイルを出力させたい時はオプションに「-d フォルダ名]を指定する。
C:\temp\java>javac -d C:\temp\java\classes Test.java C:\temp\java\classes>dir 2012/07/14 17:34 413 Test.class
このようにclasses以下にclassファイルが作成された。
注意点
javacの-dで指定するディレクトリは、指定したディレクトリが既に作成済みである必要がある。
オプション | 意味 |
---|---|
-cp | -classpathオプションの省略形であり、クラスパスを設定するために使用する |
-D | システムプロパティを設定するために使う |