0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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.ライブラリを使用するための仕様
##システムプロパティ

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

##エンティティ

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を操作するためには

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);
	}
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);
	}

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

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

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?