ライブラリ共有、JavaからMySqlへアクセス



DBを利用するだけなのに、DAO、entity、XMLを３セット書かなくちゃ！
フレームワークは面倒くさいと思いつつ、今回のライブラリを作成した。

#１．メリット
・XML不要（sql文を記述する設定ファイル）
・DAO不要（sqlを実行するクラス）
・フレーム不要

・・・・・・・

Q：なにも不要？ちゃんとしている機能はないじゃない？？
A：いえいえ、sql及びentityによるDB操作はしっかりサポートしているし、かつ一つクラスで完結！

#２．ライブラリ紹介
##sqlの作成を手助ける
早速サンプルコードを見ましょう！

```java

	SqlWritter writter = new SqlWritter();
	writter.select("*")
			.from("speech_data")
			.where("name")
			.like("新垣結衣 ニンゲン観察バラエティモニタリング");

	System.out.println(writter);
```
👇コンソール出力
>select
>*
>from
>speech_data
>where
>name LIKE '%新垣結衣 ニンゲン観察バラエティモニタリング%'

Q： ('ω') うわあああ！sql文を生成してくれたねといいたかったところ、どういうメリットがあるか？
A：確かにこれだけだと、メリットはあんまり実感できなさそうだね。しかし、以上の機能をコアとして、さらに便利な機能を提供できるんだって！

##sqlによる検索
生成したsqlを用いて、DAO不要のメリットを見てみよう。

```java

	List<SpeechData> entities;
	try (Accessor accessor = new Accessor()) {
		entities= accessor.selectBySql(writter, SpeechData.class);
	}
```

上記のコードを簡単に説明してみると、上記はsql文による検索操作だ。
　SpeechDataは事前作成したspeech_dataというテーブルのエンティティクラス
　entitiesは結果を格納するためのリスト
　Accessorはデータベースへアクセスするためのクラス
　writterは先ほど生成したSQL

Q：うんーーー、よくわからない！
A：大丈夫、覚えておいてほしいのはAccessorクラスはすべてのエンティティクラスに対応できるため、DAOはもう不要だ！

下記のコードを追加して、実行結果を見てみよう。

```java

	for (SpeechData entity : entities) {
		System.out.println(String.format("ファイル：%sの分析結果：", entity.getName()));
		System.out.print(String.format("喜び：%s,", entity.getJoy()));
		System.out.print(String.format("悲しみ：%s,", entity.getSorrow()));
		System.out.print(String.format("怒り：%s,", entity.getAnger()));
		System.out.print(String.format("エネルギー：%s,", entity.getEnergy()));
		System.out.println(String.format("穏やかさ：%s", entity.getCalm()));
		System.out.println();
	}
```

👇コンソール出力
>ファイル：新垣結衣 ニンゲン観察バラエティモニタリング_00.wavの分析結果：
>喜び：0,悲しみ：9,怒り：0,エネルギー：0,穏やかさ：40

>ファイル：新垣結衣 ニンゲン観察バラエティモニタリング_01.wavの分析結果：
>喜び：18,悲しみ：2,怒り：0,エネルギー：16,穏やかさ：29

>ファイル：新垣結衣 ニンゲン観察バラエティモニタリング_02.wavの分析結果：
>喜び：11,悲しみ：0,怒り：0,エネルギー：11,穏やかさ：38

>・
>・
>・

Q：怪しいデータが出てきた！
A：ごめんごめん、音声による感情識別データだ。データの中身はとりあえず無視して、実行したsqlは無事に結果を戻しれくれた。

##エンティティによる検索
フレームのように、エンティティによる検索も可能！

```java

	SpeechData speechData = new SpeechData();
	speechData.setName("新垣結衣 ニンゲン観察バラエティモニタリング_02.wav");

	List<SpeechData> entities;
	try (Accessor accessor = new Accessor()) {
		entities = accessor.selectByEntity(speechData);
	}

	for (SpeechData entity : entities) {
		System.out.println(String.format("ファイル：%sの分析結果：", entity.getName()));
		System.out.print(String.format("喜び：%s,", entity.getJoy()));
		System.out.print(String.format("悲しみ：%s,", entity.getSorrow()));
		System.out.print(String.format("怒り：%s,", entity.getAnger()));
		System.out.print(String.format("エネルギー：%s,", entity.getEnergy()));
		System.out.println(String.format("穏やかさ：%s", entity.getCalm()));
		System.out.println();
	}
```

👇コンソール出力
>ファイル：新垣結衣 ニンゲン観察バラエティモニタリング_02.wavの分析結果：
>喜び：11,悲しみ：0,怒り：0,エネルギー：11,穏やかさ：38

Q：エンティティによる検索だね
A：はい、ライブラリだけど、機能は半端ない！

#３．ライブラリ共有
ライブラリを使ってみたい方は、下記のリンクからソースをダウンロードすることができる。
https://github.com/chaofanzheng/leadinge

わからない時があれば、下記の仕様を参考すれば助けになる！！

#４．ライブラリを使用するための仕様
##システムプロパティ

```python:system.properties

	#mysqlのユーザID（各自の設定に従う）
	USER_ID = root

	#mysqlのパスワード（各自の設定に従う）
	USER_PASSWORD = MySql

	#mysqlへアクセスのURL（各自の設定に従う）
	DB_URL = jdbc:mysql://localhost:3306/speech_recognition?useSSL=false&&allowPublicKeyRetrieval=true
```

##エンティティ

```java:SpeechData.java

//CommonEntityを継承する必要がある
public class SpeechData extends CommonEntity {

	//コンストラクタ
	public  SpeechData() {
		//データタイプの初期化（テーブル情報に合わせて設定する）
		columnsType = new HashMap<String,Class<?>>();
		columnsType.put("id", int.class);
		columnsType.put("name", String.class);
		columnsType.put("wav", byte[].class);
		columnsType.put("error", int.class);
		columnsType.put("calm", int.class);
		columnsType.put("anger", int.class);
		columnsType.put("joy", int.class);
		columnsType.put("sorrow", int.class);
		columnsType.put("energy", int.class);
		//テーブル名を設定する（スネークケース）
		setTableName("speech_data");
	}

	public int getId() {
		return (int)columns.get("id");
	}

	public void setId(int value) {
		 columns.put("id",value);
	}

	public String getName() {
		return (String)columns.get("name");
	}

	public void setName(String value) {
		 columns.put("name",value);
	}

	public byte[] getWav() {
		return (byte[])columns.get("wav");
	}

	public void setWav(byte[] value) {
		 columns.put("wav",value);
	}

	public int getError() {
		return (int)columns.get("error");
	}

	public void setError(int value) {
		 columns.put("error",value);
	}

	public int getCalm() {
		return (int)columns.get("calm");
	}

	public void setCalm(int value) {
		 columns.put("calm",value);
	}
	public int getAnger() {
		return (int)columns.get("anger");
	}

	public void setAnger(int value) {
		 columns.put("anger",value);
	}

	public int getJoy() {
		return (int)columns.get("joy");
	}

	public void setJoy(int value) {
		 columns.put("joy",value);
	}

	public int getSorrow() {
		return (int)columns.get("sorrow");
	}

	public void setSorrow(int value) {
		 columns.put("sorrow",value);
	}

	public int getEnergy() {
		return (int)columns.get("energy");
	}

	public void setEnergy(int value) {
		 columns.put("energy",value);
	}
}
```

##DBを操作するためには

```java:Select.java

	//sqlを作成した場合は...もちろん、外部ファイルでも手書きでもオケ
	SqlWritter writter = new SqlWritter();
	writter.select("*")
			.from("speech_data")
			.where("name")
			.like("新垣結衣 ニンゲン観察バラエティモニタリング");

	List<SpeechData> entities;

	//DBアクセサの初期化
	try (Accessor accessor = new Accessor()) {
		//sqlによる選択
		entities = accessor.selectBySql(writter, SpeechData.class);

		//エンティティの初期化
		SpeechData speechData = new SpeechData();
		speechData.setName("新垣結衣 ニンゲン観察バラエティモニタリング_02.wav");
		//エンティティによる選択
		entities = accessor.selectByEntity(speechData);
	}
```

```java:Insert.java

	//sqlを作成した場合は...もちろん、外部ファイルでも手書きでもオケ
	SqlWritter writter = new SqlWritter();	
	writter.insertInto("speech_data")
			.colums("id","name")
			.values(999,"新垣結衣 ニンゲン観察バラエティモニタリング_999.wav");

	//DBアクセサの初期化
	try (Accessor accessor = new Accessor()) {
		//sqlによる選択操作
		accessor.insertBySql(writter);

		//エンティティの初期化
		SpeechData speechData = new SpeechData();
		speechData.setId(999);
		speechData.setName("新垣結衣 ニンゲン観察バラエティモニタリング_999.wav");
		//エンティティによるインサート操作
		accessor.insertByEntity(speechData);
	}
```

#５．ソースコードについて
現状ではinsertとselectしかサポートしていないので、
更新や削除でもできるようにしたい場合は...各自がコードを改修してください。

実際にDBへアクセスするときに使っていただくか、またはソースが参考になれば、
うれしいと思います。