2014年5月6日火曜日

Tomcat + My SQL on Windows 初歩の初歩

My SQLインスール for Windows

世の中にはXAMPPという便利なツールがあるみたいですが、上記ですでにTomcatインストールしている ので、My SQLだけ単独でインストールします。ちなみに以下がXAMPPのサイト

https://www.apachefriends.org/jp/index.html

My SQLをインストールします。以下のサイトが参考になりますが、インストールの ところはかなり変わっています。

http://www.kkaneko.com/rinkou/mysql/mysqlinstall.html

Oracle eDelivery とかでMy SQLでSearchしてからインストールしなくてはいけません。 "MySQL Installer 5.6.18.0 Package"をダウンロードしましょう。

ダウンロードしたZIPを回答して、インストーラーを起動します。

途中にLogin/Password聞かれるところでなぜかエラーになるけどそのままインストール を続けます。

インストールが終わるとWindowsのプログラムにCommand Line Clientというのができる のでそれで操作できます

http://www.kkaneko.com/rinkou/mysql/command.html
mysql->mysql> CREATE DATABASE testdb DEFAULT CHARACTER SET cp932 COLLATE cp932_japanese_ci;
mysql> use testdb;
mysql> CREATE TABLE commodity (
    ->           type INTEGER primary key not null,
    ->           name VARCHAR(32) not null,
    ->           price INTEGER );
mysql> INSERT INTO commodity VALUES( 1, 'apple', 50 );
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO commodity VALUES( 2, 'orange', 20 );
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO commodity VALUES( 3, 'strawberry', 100 );
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM commodity;
+------+------------+-------+
| type | name       | price |
+------+------------+-------+
|    1 | apple      |    50 |
|    2 | orange     |    20 |
|    3 | strawberry |   100 |
+------+------------+-------+
3 rows in set (0.00 sec)

ServletとMySQLの接続

Databaseと接続するためにはコネクタをインストールする必要があります。 コネクタはそれぞれにデータベースによって異なります。ここでは、以下の ページより、My SQLのコネクタをインストールしてください。

http://www-jp.mysql.com/products/connector/
1. JDBC Driver for MySQL (Connector/J)を選択
2. platform independentを選択
3. mysql-connector-java-5.1.30.zipをダウンロード
4. 解凍したフォルダを適当な場所に置く C:\Program Files\Java\mysql-connector-java-5.1.30
5.jarファイルをTomcatのフォルダに置く C:\hoge\apache-tomcat-7.0.53\lib

Servletを以下のように記述すれば、先ほどのCommodityからデータを取得する ことが可能。

@WebServlet("/HelloMySQL")
public class HelloMySQL extends HttpServlet {
 private static final long serialVersionUID = 1L;

 final private static String DBNAME = "testdb"; // Database Name
 
 final private static String USER = "XXXXX"; // user name for DB.
 
 final private static String PASS = "XXXXX"; // password for DB.
 
 final private static String JDBCDriver = "com.mysql.jdbc.Driver";
 
 final private static String DBURL = "jdbc:mysql://localhost/" + DBNAME;

 /**
  * @see HttpServlet#HttpServlet()
  */
 public HelloMySQL() {
  super();
  // TODO Auto-generated constructor stub
 }

 /**
  * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
  *      response)
  */
 protected void doGet(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
  Connection conn = connect();
  if (conn != null) {
   Statement stmt = null;
   ResultSet rs = null;
   try {
    conn.setReadOnly(true);
    stmt = conn.createStatement();
    rs = stmt.executeQuery("select * from commodity");
    String resString = "commodity: ";
    while (rs.next()) {
     resString += rs.getString("name") + ", ";
    }
    response.getWriter().write(resString);
   } catch (SQLException e) {
    e.printStackTrace();
   } finally {
    if (rs != null) {
     try {
      rs.close();
     } catch (SQLException e) {
      e.printStackTrace();
     }
    }
    if (stmt != null) {
     try {
      stmt.close();
     } catch (SQLException e) {
      e.printStackTrace();
     }
    }
    disconnect(conn);
   }
  } else {
   response.getWriter().write("Hello, My SQL not connected!");
  }
 }
 
 private Connection connect() {
  Connection conn = null;
  try {
   Class.forName(JDBCDriver).newInstance();
   System.setProperty("jdbc.driver",JDBCDriver);
  }
  catch (Exception e) {
   e.printStackTrace();
   return null;
  }
  
  try {
   conn = DriverManager.getConnection(DBURL, USER, PASS);
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   return null;
  }
  return conn;  
 }
 
 private void disconnect(Connection conn) {
  try {
   conn.close();
  } catch (SQLException e) {
   e.printStackTrace();
  }
 }