DBを利用するだけなのに、DAO、entity、XMLを3セット書かなくちゃ!
フレームワークは面倒くさいと思いつつ、今回のライブラリを作成した。
#1.メリット
・XML不要(sql文を記述する設定ファイル)
・DAO不要(sqlを実行するクラス)
・フレーム不要
・・・・・・・
Q:なにも不要?ちゃんとしている機能はないじゃない??
A:いえいえ、sql及びentityによるDB操作はしっかりサポートしているし、かつ一つクラスで完結!
#2.ライブラリ紹介
##sqlの作成を手助ける
早速サンプルコードを見ましょう!
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不要のメリットを見てみよう。
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はもう不要だ!
下記のコードを追加して、実行結果を見てみよう。
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は無事に結果を戻しれくれた。
##エンティティによる検索
フレームのように、エンティティによる検索も可能!
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:はい、ライブラリだけど、機能は半端ない!
#3.ライブラリ共有
ライブラリを使ってみたい方は、下記のリンクからソースをダウンロードすることができる。
https://github.com/chaofanzheng/leadinge
わからない時があれば、下記の仕様を参考すれば助けになる!!
#4.ライブラリを使用するための仕様
##システムプロパティ
#mysqlのユーザID(各自の設定に従う)
USER_ID = root
#mysqlのパスワード(各自の設定に従う)
USER_PASSWORD = MySql
#mysqlへアクセスのURL(各自の設定に従う)
DB_URL = jdbc:mysql://localhost:3306/speech_recognition?useSSL=false&&allowPublicKeyRetrieval=true
##エンティティ
//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を操作するためには
//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);
}
//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);
}
#5.ソースコードについて
現状ではinsertとselectしかサポートしていないので、
更新や削除でもできるようにしたい場合は...各自がコードを改修してください。
実際にDBへアクセスするときに使っていただくか、またはソースが参考になれば、
うれしいと思います。