気軽に楽しくプログラムと遊ぶ

自分が興味があってためになるかもって思う情報を提供しています。

達人に学ぶSQL徹底指南書の振り返るための要点

以下を読了しました。定期的に振り返る際のインデックスになる情報を纏めます。 詳細なSQLや内容は本を読んで確認してみて下さい。

達人に学ぶ SQL徹底指南書 (CodeZine BOOKS) https://amzn.to/2IwwYWj

1 CASE式

記述時の注意点

  • 各分岐が返すデータ型を統一する
  • ELSE、ENDは必ず書く。ELSEなしは、暗黙でELSE NULL

機能

  • CASE式の結果は値。SELECT、WHERE、GROUP BY句などどこでも記述できる
  • 値の張替え。条件に応じて値を変更し、振り分けられる。
  • SUMと組み合わせると特定条件レコードのカウントアップができる

※ 随時追記

Mavenで取得したJarのソースコードをEclipseにを添付する

Mavenで取得したJarのソースコードが参照できなかったので、 ソースコードのダウンロードを行う設定をMavenEclipseプラグインで設定しました。

pom.xmlへの設定

buildタグ内に「maven-eclipse-plugin」の設定を追記。

<build>
    ・
    ・
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-eclipse-plugin</artifactId>
      <configuration>
        <downloadSources>true</downloadSources>
        <downloadJavadocs>true</downloadJavadocs>
      </configuration>
    </plugin>
  </plugins>
</build>

プロジェクト右クリックで表示されるメニューの実行で「7 Maven ビルド]
を選択し、Mavenビルドの実行構成を開く。

ゴールに以下の設定を追加。eclipseプロジェクトに変更するコマンドですが、
この際にpomにおける「downloadSources」の設定を適用し、ソースコードをダウンロードします。

eclipse:eclipse

f:id:tamata78:20190623111423p:plain

ただ、これだけでは、ソースコードをダウンロードしただけなので、以下を行います。

jarのソースを開く、ソース添付でsourceのjarを添付。
jar内のソースも参照できるようになる。

見たかったopen csvのソースがやっと見れるようになりました。

f:id:tamata78:20190623111507p:plain

TomcatのCatalinaってなんだろう

Tomcatインストールディレクトリ内にCatalinaという用語はいくつか出てくるが
その意味について少し整理しておく。

Catalinaとは

サーブレットコンテナ。
Tomcat自体も広義ではサーブレットコンテナらしいが、
紛らわしいので、Webコンテナと呼ばれているらしい。

CATALINA_HOME

Tomcatのインストールディレクトリ。
昔は、TOMCAT_HOMEだったよう。同じサーブレットコンテナだったから?

CATALINA_HOMEとCATALINA_BASE

CATALINA_BASEは、基本CATALINA_HOMEと同じパスが設定される。
別パスを設定するとこでエンジン部分(CATALINA_HOME)とデータ部分(CATALINA_BASE)を分けられるらしい。

CATALINA_HOME/conf/Catalina/localhost

CATALINA_HOME/conf/Catalina/localhostは、
context.xml(アプリケーション登録情報)が配置されるディレクトリです。
eclipseでサーバー追加(アプリデプロイ設定)をするとcontext.xmlが生成されます。

ここでのCatalinaのディレクトリは、サーブレットコンテナの設定ファイルを格納しているとの意味で命名されていると思われる。

context.xml

<Context path="/hello"
docBase="c:/sampleApp/helloworld"/>

Tomcatについて理解を深めたい方は、以下の記事もあります。Tomcatディレクトリ構成とその意味など書いています。
tamata78.hatenablog.com

Tomcatに関連して、WebサーバーのApacheについて
tamata78.hatenablog.com

MySQL Supser権限を付与する

Supser権限を付与

テーブル定義+データインポートの際に、Super権限が必要との事だったので、付与

Super権限が付与されていないことを確認

SELECT host, user, Super_priv FROM mysql.user WHERE user='hoge';
+-----------+---------------+------------+
| host      | user          | Super_priv |
+-----------+---------------+------------+
| localhost | root          | Y          |
| localhost | mysql.session | Y          |
| localhost | mysql.sys     | N          |
| localhost | hoge          | N          |
+-----------+---------------+------------+

Super権限を付与する

UPDATE mysql.user SET Super_priv='Y' WHERE user='hoge';
SELECT host, user, Super_priv FROM mysql.user WHERE user='hoge';
+-----------+---------------+------------+
| host      | user          | Super_priv |
+-----------+---------------+------------+
| localhost | root          | Y          |
| localhost | mysql.session | Y          |
| localhost | mysql.sys     | N          |
| localhost | hoge          | Y          |
+-----------+---------------+------------+

DBアクセス MyBatisの各種ファイルを自動生成するための設定

公式の下記ページをGoogle翻訳した手順を貼っておく。

MyBatis各種ファイル自動設定 http://www.mybatis.org/generator/index.html

MyBatis各種ファイル自動生成する

以下、翻訳したものを引用

eclipseマーケットプレイスで、プラグイン「MyBatis Generator」を検索して、インストール

②構成ファイルを作成します。 ファイル>新規>その他 [MyBatis]カテゴリから[MyBatis Generator構成ファイル]を選択し、[次へ]をクリックします。 ファイルの場所とファイルの名前を指定します(デフォルトはgeneratorConfig.xml)。 ウィザードを終了する

③設定ファイルを書く 少なくとも、以下を指定する必要があります。 ・ターゲットデータベースへの接続方法を指定するjdbcConnection情報 ・javaModelGeneratorのターゲットパッケージとターゲットプロジェクト ・sqlMapGeneratorのターゲットパッケージとターゲットプロジェクト ・ターゲットパッケージ、ターゲットプロジェクト、およびjavaClientGeneratorのタイプ(またはJavaクライアントを生成したくない場合は、javaClientGenerator要素を削除できます) ・少なくとも1つのデータベーステーブル

ファイルを保存する

Eclipseのナビゲーター、またはパッケージ・エクスプローラーの構成ファイルを右クリックして、メニュー・オプション「Run As> Run MyBatis Generator」を表示してください。

自動生成コマンド実行時に発生したエラー

C:\work\workspace\.metadata\.plugins\org.mybatis.generator.eclipse.ui\.generatedAntScripts\sample-generationConfig.xml.xml:4:
The server time zone value ' (W)' is unrecognized or represents more than one time zone. 
You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
    <!-- スキーマ情報を取得する DB への接続設定 -->
    <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
        connectionURL="jdbc:mysql://localhost:3306/db_name"

接続先URLに「?serverTimezone=JST」とパラメータを付与して回避。

  javax.net.ssl.SSLException

  MESSAGE: closing inbound before receiving peer's close_notify

自動生成時のコンソールに上記エラー発生。「useSSL=false」もURLに付与してみたりしたが、今度は自動生成できなくなったので。一旦、放置。。

DBコネクションクローズ時のエラーのため、ファイル自体は生成できていた。

MySQLでちょっと動作確認するときに使えるTableとData

この程度のものなら、さっと自分で書いてもよいのかもしれないけど。 時間がないときにさっと作れるように残しておく。

データベースを作成していない場合は、以下の記事を参考にしてみてください。 http://tamata78.hatenablog.com/entry/2019/05/26/111113

サンプルテーブル

create table staff
(
id integer,
name char(16),
branch char(20),
age integer
);

サンプルデータ

INSERT INTO staff (id, name, branch, age) VALUES (1 ,'Tanaka','Tokyo',29);
INSERT INTO staff (id, name, branch, age) VALUES (2 ,'Yamada','Yokohama',31);
INSERT INTO staff (id, name, branch, age) VALUES (3 ,'Sugiura','Chiba',34);
INSERT INTO staff (id, name, branch, age) VALUES (4 ,'Yamano','Osaka',25);
INSERT INTO staff (id, name, branch, age) VALUES (5 ,'Nakajima','Yokohama',38);
INSERT INTO staff (id, name, branch, age) VALUES (6 ,'Suzuki','Tokyo',24);

MySQL公式のサンプルデータベースSakila

もう少し大規模なサンプルが欲しいときに使えるデータベース。 https://masayuki14.hatenablog.com/entry/sakila

テーブルに加え、ビュー、ストアドプロシージャ、トリガが含まれており、学習用に使える。

MySQL DBとUser作成して、テーブル作成できる状態にする

ローカルのMySQLで、SQL実行環境を作る際の一連の流れを以下に記載します。

前提条件

OS: macOS 10
SQLは、ターミナル上のコマンドラインで実行

MySQLのインストールが済んでいない方は以下を参考にしてみて下さい。

HomebrewでMySQLをインストールする

Windows版をインストールしたい方こちらから、インストーラーをダウンロードして、実行して下さい。

新しくデータベースを作成する

mysql> mysql -u root -pmypass;

mysql> create database db_name;
Query OK, 1 row affected (0.08 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db_name              |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

新しくユーザーを作成する

mysql> create user user@localhost IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.12 sec)

ユーザー一覧を表示する

mysql> SELECT host, user FROM mysql.user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| localhost | mysql.user    |
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
+-----------+------------------+

作成したユーザーに作成したデータベースの操作権限を付与する

Gmysql> grant all privileges on db_name.* TO user@localhost;
Query OK, 0 rows affected (0.10 sec)

設定権限を確認する

mysql> show grants for user_name@localhost;
+------------------------------------------------------------+
| Grants for user_name@localhost                                 |
+------------------------------------------------------------+
| GRANT USAGE ON *.* TO `user_name`@`localhost`                  |
| GRANT ALL PRIVILEGES ON `db_name`.* TO `user_name`@`localhost` |
+------------------------------------------------------------+

もし間違った場合は、以下コマンドで権限変更できます。

mysql> revoke all privileges on studydb.* from user_name@localhost;
+------------------------------------------------------------+
| Grants for user_name@localhost                                 |
+------------------------------------------------------------+
| GRANT USAGE ON *.* TO `user_name`@`localhost`                  |
+------------------------------------------------------------+

「all privileges」の箇所に削除したい権限を指定。

権限はこちらを参照

設定を反映する

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

新しいデータベースに切り替える

mysql> use db_name;

新しいテーブルを作成する

mysql> create table dbname.product (name varchar(30), price int(5));
Query OK, 0 rows affected (0.02 sec)

mysql> show tables;
+-------------------+
| Tables_in_db_name |
+-------------------+
| product       |
+-------------------+
1 row in set (0.00 sec)

mysql> desc product;
+--------------------------+------------------+------+-----+---------+-------+
| Field                    | Type             | Null | Key | Default | Extra |
+--------------------------+------------------+------+-----+---------+-------+
| name                     | varchar(3)       | YES  |     | NULL    |       |
| price                    | smallint(5)      | YES  |     | NULL    |       |
+--------------------------+------------------+------+-----+---------+-------+

DB作成、ユーザー作成・権限付与、テーブル作成まで、できました。 お疲れ様でした。