m_shige1979のときどきITブログ

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

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

https://github.com/mshige1979

Doma2のgenで自動生成を行う

Doma2

ORマッパーらしい
SQLファイルとか書いてなんかできるらしいよ

今回やること

Doma2でDBを参照していい感じのエンティティとかを作成できるらしいので準備して見る。

環境

eclipse
mysql

ライブラリ

doma2
doma2-gen
freemarker
mysl

設定

プロジェクトを作成する

f:id:m_shige1979:20161221001145p:plain

ライブラリを指定の場所へ配置しておく

f:id:m_shige1979:20161221001243p:plain

設定ファイル編集

doma-gen-build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="doma-gen-example" default="gen" basedir=".">
	<!-- javaDestDir -->
	<property name="javaDestDir" value="src"/>
	
	<!-- sqlDestDir -->
	<property name="sqlDestDir" value="src"/>
	
	<!-- dialectName -->
	<property name="dialectName" value="mysql"/>
	
	<!-- driverClassName -->
	<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
	<property name="url" value="jdbc:mysql://192.168.33.10:3306/myapp"/>
	<property name="user" value="app"/>
	<property name="password" value="Password123@"/>
	
	<!-- package -->
	<property name="entityPackageName" value="com.example.mshige1979.server.db.entity"/>
	<property name="daoPackageName" value="com.example.mshige1979.server.db.dao"/>
	
	
	<property name="configClassName" value="com.example.mshige1979.server.db.config.AppConfig"/>
	<property name="sqlTestClassName" value="com.example.mshige1979.server.db.SqlTest"/>
	<property name="sqlFilePattern" value="META-INF/**/*.sql"/>
	
	<path id="classpath">
		<fileset dir="WEB-INF/lib" includes="*.jar"/>
	</path>

	<taskdef name="gen" classname="org.seasar.doma.extension.gen.task.Gen" classpathref="classpath" loaderref="loader"/>
	<typedef name="entityConfig" classname="org.seasar.doma.extension.gen.task.EntityConfig" loaderref="loader"/>
	<typedef name="daoConfig" classname="org.seasar.doma.extension.gen.task.DaoConfig" loaderref="loader"/>
	<typedef name="sqlConfig" classname="org.seasar.doma.extension.gen.task.SqlConfig" loaderref="loader"/>
	
	<target name="gen">
		<gen
			dialectName="${dialectName}"
			driverClassName="${driverClassName}"
			url="${url}"
			user="${user}"
			password="${password}">
			<entityConfig
				destdir="${javaDestDir}"
				packageName="${entityPackageName}"
			/>
			<daoConfig
				destdir="${javaDestDir}"
				packageName="${daoPackageName}"
				configClassName="${configClassName}"
			/>
			<sqlConfig
				destdir="${sqlDestDir}"
			/>
		</gen>
	</target>

	<target name="genTest">
		<genTest
			dialectName="${dialectName}"
			driverClassName="${driverClassName}"
			url="${url}"
			user="${user}"
			password="${password}">
			<sqlTestConfig
				destdir="${javaDestDir}"
				testClassName="${sqlTestClassName}">
				<fileset dir="${sqlDestDir}">
					<include name="${sqlFilePattern}"/>
				</fileset>
			</sqlTestConfig>
		</genTest>
	</target>

</project>

実行する

f:id:m_shige1979:20161221001657p:plain

Buildfile: sample_spring_doma2a/doma-gen-build.xml
gen:
      [gen] [DOMAGEN0017] 方言にはクラス[org.seasar.doma.extension.gen.dialect.MysqlGenDialect]が使用されます。
      [gen] Wed Dec 21 00:17:40 JST 2016 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
      [gen] [DOMAGEN0020] ファイルを上書きしました。/Users/matsumotoshigeharu/Documents/workspace/sample_spring_doma2a/src/com/example/mshige1979/server/db/entity/Item.java
      [gen] [DOMAGEN0020] ファイルを上書きしました。/Users/matsumotoshigeharu/Documents/workspace/sample_spring_doma2a/src/META-INF/com/example/mshige1979/server/db/dao/ItemDao/selectById.sql
      [gen] [DOMAGEN0020] ファイルを上書きしました。/Users/matsumotoshigeharu/Documents/workspace/sample_spring_doma2a/src/com/example/mshige1979/server/db/entity/Memo.java
      [gen] [DOMAGEN0020] ファイルを上書きしました。/Users/matsumotoshigeharu/Documents/workspace/sample_spring_doma2a/src/META-INF/com/example/mshige1979/server/db/dao/MemoDao/selectById.sql
      [gen] [DOMAGEN0020] ファイルを上書きしました。/Users/matsumotoshigeharu/Documents/workspace/sample_spring_doma2a/src/com/example/mshige1979/server/db/entity/ObjData.java
      [gen] [DOMAGEN0020] ファイルを上書きしました。/Users/matsumotoshigeharu/Documents/workspace/sample_spring_doma2a/src/META-INF/com/example/mshige1979/server/db/dao/ObjDataDao/selectById.sql
BUILD SUCCESSFUL
Total time: 1 second

できたもの(一部)

ItemDao.java
package com.example.mshige1979.server.db.dao;

import com.example.mshige1979.server.db.config.AppConfig;
import com.example.mshige1979.server.db.entity.Item;
import org.seasar.doma.Dao;
import org.seasar.doma.Delete;
import org.seasar.doma.Insert;
import org.seasar.doma.Select;
import org.seasar.doma.Update;

/**
 */
@Dao(config = AppConfig.class)
public interface ItemDao {

    /**
     * @param id
     * @return the Item entity
     */
    @Select
    Item selectById(Integer id);

    /**
     * @param entity
     * @return affected rows
     */
    @Insert
    int insert(Item entity);

    /**
     * @param entity
     * @return affected rows
     */
    @Update
    int update(Item entity);

    /**
     * @param entity
     * @return affected rows
     */
    @Delete
    int delete(Item entity);
}
Item.java
package com.example.mshige1979.server.db.entity;

import java.time.LocalDateTime;
import org.seasar.doma.Column;
import org.seasar.doma.Entity;
import org.seasar.doma.GeneratedValue;
import org.seasar.doma.GenerationType;
import org.seasar.doma.Id;
import org.seasar.doma.Table;

/**
 * 
 */
@Entity(listener = ItemListener.class)
@Table(name = "item")
public class Item {

    /**  */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    Integer id;

    /**  */
    @Column(name = "name")
    String name;

    /**  */
    @Column(name = "price")
    Integer price;

    /**  */
    @Column(name = "create_at")
    LocalDateTime createAt;

    /**  */
    @Column(name = "update_at")
    LocalDateTime updateAt;

    /** 
     * Returns the id.
     * 
     * @return the id
     */
    public Integer getId() {
        return id;
    }

    /** 
     * Sets the id.
     * 
     * @param id the id
     */
    public void setId(Integer id) {
        this.id = id;
    }

    /** 
     * Returns the name.
     * 
     * @return the name
     */
    public String getName() {
        return name;
    }

    /** 
     * Sets the name.
     * 
     * @param name the name
     */
    public void setName(String name) {
        this.name = name;
    }

    /** 
     * Returns the price.
     * 
     * @return the price
     */
    public Integer getPrice() {
        return price;
    }

    /** 
     * Sets the price.
     * 
     * @param price the price
     */
    public void setPrice(Integer price) {
        this.price = price;
    }

    /** 
     * Returns the createAt.
     * 
     * @return the createAt
     */
    public LocalDateTime getCreateAt() {
        return createAt;
    }

    /** 
     * Sets the createAt.
     * 
     * @param createAt the createAt
     */
    public void setCreateAt(LocalDateTime createAt) {
        this.createAt = createAt;
    }

    /** 
     * Returns the updateAt.
     * 
     * @return the updateAt
     */
    public LocalDateTime getUpdateAt() {
        return updateAt;
    }

    /** 
     * Sets the updateAt.
     * 
     * @param updateAt the updateAt
     */
    public void setUpdateAt(LocalDateTime updateAt) {
        this.updateAt = updateAt;
    }
}
selectById.sql
select
  /*%expand*/*
from
  item
where
  id = /* id */1

今回はここまで
おわりです