m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

doma2によるデータの抽出を試す

この前は自動生成しかしていないので

自動生成なしで準備して見る

環境

Mac
eclipse

ライブラリ

doma2
mysql

準備

Javaプロジェクトを準備し、ライブラリを設定しておく

f:id:m_shige1979:20161224014909p:plain

プロジェクトのプロパティより注釈処理を有効にしておく

f:id:m_shige1979:20161224015143p:plain

ファクトリーパスにdoma2のjarを設定する

f:id:m_shige1979:20161224015313p:plain

※これらの設定を行わないとdoma2のアノテーションでDaoの実装クラスを生成できない

プロジェクト構成

.
├── bin
│   ├── META-INF
│   │   └── com
│   │       └── example
│   │           └── dao
│   │               └── ItemDao
│   │                   └── findAll.sql
│   ├── com
│   │   └── example
│   │       ├── Sample01$1.class
│   │       ├── Sample01.class
│   │       ├── config
│   │       │   └── AppConfig.class
│   │       ├── dao
│   │       │   ├── ItemDao.class
│   │       │   └── ItemDaoImpl.class
│   │       └── entity
│   │           ├── Item.class
│   │           └── _Item.class
│   ├── doma-2.0.1.jar
│   └── mysql-connector-java-5.1.40.jar
├── lib
│   ├── doma-2.0.1.jar
│   └── mysql-connector-java-5.1.40.jar
└── src
    ├── META-INF
    │   └── com
    │       └── example
    │           └── dao
    │               └── ItemDao
    │                   └── findAll.sql
    └── com
        └── example
            ├── Sample01.java
            ├── config
            │   └── AppConfig.java
            ├── dao
            │   └── ItemDao.java
            └── entity
                └── Item.java

設定情報クラス

AppConfig
package com.example.config;

import javax.sql.DataSource;

import org.seasar.doma.SingletonConfig;
import org.seasar.doma.jdbc.Config;
import org.seasar.doma.jdbc.dialect.Dialect;
import org.seasar.doma.jdbc.dialect.MysqlDialect;
import org.seasar.doma.jdbc.tx.LocalTransactionDataSource;
import org.seasar.doma.jdbc.tx.LocalTransactionManager;
import org.seasar.doma.jdbc.tx.TransactionManager;

@SingletonConfig
public class AppConfig implements Config {
	
	private static final AppConfig INSTANCE = new AppConfig();

    private final Dialect dialect;
    private final LocalTransactionDataSource dataSource;
    private final TransactionManager transactionManager;

    private AppConfig() {
        dialect = new MysqlDialect();
        dataSource = new LocalTransactionDataSource("jdbc:mysql://192.168.33.10:3306/myapp?useSSL=false", "app", "Password123@");
        transactionManager = new LocalTransactionManager(dataSource.getLocalTransaction(getJdbcLogger()));
    }
	
	@Override
	public DataSource getDataSource() {
		// TODO Auto-generated method stub
		return dataSource;
	}

	@Override
	public Dialect getDialect() {
		// TODO Auto-generated method stub
		return dialect;
	}
	
	@Override
    public TransactionManager getTransactionManager() {
        return transactionManager;
    }

    public static AppConfig singleton() {
        return INSTANCE;
    }

}

エンティティ

Item
package com.example.entity;

import java.time.LocalDateTime;

import org.seasar.doma.Column;
import org.seasar.doma.Entity;
import org.seasar.doma.Id;
import org.seasar.doma.Table;

@Entity
@Table(name = "item")
public class Item {
	
	@Id
	private Integer id;
	
	@Column(name = "name")
	private String name;
	
	@Column(name = "price")
	private Integer price;
	
	@Column(name = "create_at")
	private LocalDateTime createAt;
	
	@Column(name = "update_at")
	private LocalDateTime updateAt;

	
	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getPrice() {
		return price;
	}

	public void setPrice(Integer price) {
		this.price = price;
	}

	public LocalDateTime getCreateAt() {
		return createAt;
	}

	public void setCreateAt(LocalDateTime createAt) {
		this.createAt = createAt;
	}

	public LocalDateTime getUpdateAt() {
		return updateAt;
	}

	public void setUpdateAt(LocalDateTime updateAt) {
		this.updateAt = updateAt;
	}
	
	
	
}

Dao

ItemDao
package com.example.dao;

import java.util.List;

import org.seasar.doma.Dao;
import org.seasar.doma.Select;

import com.example.config.AppConfig;
import com.example.entity.Item;

@Dao(config = AppConfig.class)
public interface ItemDao {
	
	@Select
    List<Item> findAll();
	
}
findAll.sql
select
    /*%expand*/*
from
    item
order by 
	id asc

実行用クラス

Sample01.java
package com.example;

import java.util.List;

import org.seasar.doma.jdbc.tx.TransactionManager;

import com.example.config.AppConfig;
import com.example.dao.ItemDao;
import com.example.dao.ItemDaoImpl;
import com.example.entity.Item;

public class Sample01 {

	public static void main(String[] args) {
		
		TransactionManager tm = AppConfig.singleton().getTransactionManager();
		tm.required(new Runnable(){

			@Override
			public void run() {
				// TODO Auto-generated method stub
				ItemDao dao = new ItemDaoImpl();
				List<Item> list = dao.findAll();
				
				System.out.println(list.size());
			}
			
		});
		
		

	}

}

実行結果

12 24, 2016 1:40:25 午前 org.seasar.doma.jdbc.tx.LocalTransaction begin
情報: [DOMA2063] ローカルトランザクション[1190654826]を開始しました。
12 24, 2016 1:40:25 午前 com.example.dao.ItemDaoImpl findAll
情報: [DOMA2220] ENTER  : クラス=[com.example.dao.ItemDaoImpl], メソッド=[findAll]
12 24, 2016 1:40:25 午前 com.example.dao.ItemDaoImpl findAll
情報: [DOMA2076] SQLログ : SQLファイル=[META-INF/com/example/dao/ItemDao/findAll.sql],
select
    id, name, price, create_at, update_at
from
    item
order by 
	id asc
12 24, 2016 1:40:25 午前 com.example.dao.ItemDaoImpl findAll
情報: [DOMA2221] EXIT   : クラス=[com.example.dao.ItemDaoImpl], メソッド=[findAll]
6
12 24, 2016 1:40:25 午前 org.seasar.doma.jdbc.tx.LocalTransaction commit
情報: [DOMA2067] ローカルトランザクション[1190654826]をコミットしました。
12 24, 2016 1:40:25 午前 org.seasar.doma.jdbc.tx.LocalTransaction commit
情報: [DOMA2064] ローカルトランザクション[1190654826]を終了しました。

動きました(^^)
ログにsqlを表示する?

所感

たいていはフレームワーク内で使用されているような記載がほとんどで単体で動かすサンプルが少なかったので助かりました。
sqlを記載できるのでSQLが好きな人には使えるような感じ…
動的な条件をどのような感じで設定できるか試していないのでちょっとやってみる。