© 2013
第16回 Alfresco勉強会
カスタムテーブルの使い方
2013.6.6
terashita
© 2013
自己紹介
 主にAlfrescoまわりの仕事をしています
 最近の関心事
 息子の成長(10ヶ月 2013年6月6日現在)
 Vファーレン長崎の健闘(J2 第3位 2013年6月6日現在)
 大宮アルディージャの躍進(J1 第1位 2013年6月6日現在)
 ふるさと納税が熱いらしい
© 2013
今回のテーマ:カスタムテーブルの使い方
 Alfrescoの標準にはないテーブルを作ってデータを記録したり抽出したりしたいが、Alfrescoが使用
しているiBATISの使い方がよくわからない・・・という時のために簡単なデモをまじえて説明しま
す
 デモの内容
 カスタムテーブル:id(AUTO INCREMENT), 実行日時, ユーザIDの3つのカラム
 上記のテーブルにAlfrescoからデータをINSERTまたはSELECTする
• INSERT:実行時刻とユーザIDを挿入
• SELECT:ユーザIDを指定して、そのユーザIDに一致する全ての行を取得
2
環境
 Alfresco Community Edition 4.2.c
 MySQL Community Server 5.5.31
© 2013
大まかな流れ
1. カスタムテーブルの作成
2. カスタムテーブルに対応するEntityクラスの作成
3. SQLマッピング
4. DAOクラスの作成
5. (おまけ)動作確認用のServiceの作成
3
© 20134
大まかなイメージ
SqlSessionFactory
SqlMapConfig.xml
DAO
SqlSessionTemplate
SqlMap.xml DB毎に作成
<insert id="insert_custom_entity" parameterType="CustomEntity"
useGeneratedKeys="true" keyProperty="id">
insert into aegif_custom_table (run_date, user_id)
values (#{runDate}, #{userId})
</insert>
Service
DB
コンストラクタ
インジェクション
insert / select
insert / select
Entity
© 2013
1. カスタムテーブルの作成
 SQL文を実行してカスタムテーブルを作成
5
CREATE TABLE aegif_custom_table
(
id BIGINT NOT NULL AUTO_INCREMENT,
run_date DATETIME NOT NULL,
user_id VARCHAR(255) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;
※Alfresco起動時に自動的にテーブルを作成する方法もあると思いますが、
今回は本筋から逸れるので割愛して手で作成します
Create-CustomTable.sql
© 2013
2. カスタムテーブルに対応するEntityクラスの作成
 カスタムテーブルのカラムに対応するフィールドとそれらのgetter, setterを持つEntitytクラス
を作成
6
package jp.aegif.alfresco.study.repo.domain;
import java.util.Date;
public class CustomEntity
{
private Long id; // internal DB-generated sequence id
private Date runDate;
private String userId;
public Long getId()
{
return id;
}
public void setId(Long id)
{
this.id = id;
}
...
jp.aegif.alfresco.study.repo.domain.CustomEntity
© 2013
3. SQLマッピング(1/2)
 SqlMapConfigの作成
7
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias alias="CustomEntity" type="jp.aegif.alfresco.study.repo.domain.CustomEntity"/>
</typeAliases>
<mappers>
<mapper resource="alfresco/extension/ibatis/#resource.dialect#/custom-SqlMap.xml"/>
</mappers>
</configuration>
<alf_dir>/tomcat/shared/classes/alfresco/extension/ibatis/custom-SqlMapConfig.xml
© 2013
3. SQLマッピング(2/2)
 SqlMapの作成
 ここで定義したnamespace, idをDAOで使用する
8
<alf_dir>/tomcat/shared/classes/alfresco/extension/ibatis/org.hibernate.dialect.Dialect/custom-SqlMap.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="alfresco.custom">
<insert id="insert_custom_entity" parameterType="CustomEntity" useGeneratedKeys="true" keyProperty="id">
insert into aegif_custom_table (run_date, user_id)
values (#{runDate}, #{userId})
</insert>
<select id="select_custom_entities_by_user" parameterType="CustomEntity" resultType="CustomEntity">
select id as id, run_date as runDate, user_id as userId
from aegif_custom_table
where user_id = #{userId}
</select>
</mapper>
© 2013
4. DAOクラスの作成(1/2)
 Bean定義
 先ほど定義したSqlMapConfigと紐付いたSqlSessionTemplateをインジェクト
9
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
<beans>
<!-- MyBatis config for custom table -->
<bean id="customSqlSessionFactory" class="org.alfresco.ibatis.HierarchicalSqlSessionFactoryBean">
<property name="useLocalCaches" value="${mybatis.useLocalCaches}"/>
<property name="resourceLoader" ref="dialectResourceLoader"/>
<property name="dataSource" ref="dataSource"/>
<property name="configLocation">
<value>classpath:alfresco/extension/ibatis/custom-SqlMapConfig.xml</value>
</property>
</bean>
<bean id="customSqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="customSqlSessionFactory"/>
</bean>
<bean id="customEntityDAO" class="jp.aegif.alfresco.study.repo.domain.CustomEntityDAOImpl">
<property name="sqlSessionTemplate" ref="customSqlSessionTemplate"/>
</bean>
</beans>
<alf_dir>/tomcat/shared/classes/alfresco/extension/custom-ibatis-context.xml
© 2013
4. DAOクラスの作成(2/2)
 SqlMapで定義したSQL文のnamespaceとidを繋げたキー、およびparameterTypeで指定した
Entityを渡してSqlSessionTemplateオブジェクトのinsertまたはselectメソッドを実行する
10
public class CustomEntityDAOImpl implements CustomEntityDAO
{
protected SqlSessionTemplate template;
public long insertCustomEntity(CustomEntity customEntity) throws SQLException
{
template.insert("alfresco.custom.insert_custom_entity",
customEntity);
Long id = customEntity.getId();
return (id != null ? id : -1);
}
public List<CustomEntity> selectCustomEntitiesByUser(CustomEntity customEntity) throws SQLException
{
if (customEntity.getUserId() != null)
{
return (List<CustomEntity>) template.selectList(
"alfresco.custom.select_custom_entities_by_user", customEntity);
} else
{
return new ArrayList<CustomEntity>(0);
}
}
}
jp.aegif.alfresco.study.repo.domain.CustomEntityDAOImpl
© 2013
5.(おまけ)動作確認用のServiceの作成
 DAOを介してデータをINSERT, SELECTするServiceを作成
11
public class CustomEntityServiceImpl implements CustomEntityService
{
private CustomEntityDAO customEntityDAO;
...
public void insertCustomEntity(String userId)
{
...
try
{
Date runDate = new Date();
CustomEntity customEntity = new CustomEntity();
customEntity.setUserId(userId);
customEntity.setRunDate(runDate);
try
{
long id = customEntityDAO.insertCustomEntity(customEntity);
...
jp.aegif.alfresco.study.repo.custom.CustomEntityServiceImpl
© 2013
5.(おまけ)動作確認用のServiceの作成
 JavaScriptからCustomEntityServiceにアクセスするためのクラスの作成とBean定義
12
public class ScriptCustomEntity extends BaseScopableProcessorExtension
{
private CustomEntityService customEntityService;
...
public void insert(String userId)
{
customEntityService.insertCustomEntity(userId);
}
public List<CustomEntity> selectByUser(String userId)
{
return customEntityService.selectCustomEntitiesByUser(userId);
}
}
<bean id="customEntityScript" parent="baseJavaScriptExtension" class="jp.aegif.alfresco.study.repo.custom.ScriptCustomEntity">
<property name="extensionName">
<value>customEntity</value>
</property>
<property name="customEntityService">
<ref bean="customEntityService" />
</property>
</bean>
jp.aegif.alfresco.study.repo.custom.ScriptCustomEntity
<alf_dir>/shared/classes/alfresco/extension/custom-script-services-context.xml
© 201313
(再掲)大まかなイメージ
SqlSessionFactory
SqlMapConfig.xml
DAO
SqlSessionTemplate
SqlMap.xml DB毎に作成
<insert id="insert_custom_entity" parameterType="CustomEntity"
useGeneratedKeys="true" keyProperty="id">
insert into aegif_custom_table (run_date, user_id)
values (#{runDate}, #{userId})
</insert>
Service
DB
コンストラクタ
インジェクション
insert / select
insert / select
Entity
© 2013
デモ
© 2013
今回使用したソースコード
 https://github.com/terajun/AlfrescoCustomTableSample
Alfrescoのカスタムテーブルの使い方

Alfrescoのカスタムテーブルの使い方

  • 1.
  • 2.
    © 2013 自己紹介  主にAlfrescoまわりの仕事をしています 最近の関心事  息子の成長(10ヶ月 2013年6月6日現在)  Vファーレン長崎の健闘(J2 第3位 2013年6月6日現在)  大宮アルディージャの躍進(J1 第1位 2013年6月6日現在)  ふるさと納税が熱いらしい
  • 3.
    © 2013 今回のテーマ:カスタムテーブルの使い方  Alfrescoの標準にはないテーブルを作ってデータを記録したり抽出したりしたいが、Alfrescoが使用 しているiBATISの使い方がよくわからない・・・という時のために簡単なデモをまじえて説明しま す デモの内容  カスタムテーブル:id(AUTO INCREMENT), 実行日時, ユーザIDの3つのカラム  上記のテーブルにAlfrescoからデータをINSERTまたはSELECTする • INSERT:実行時刻とユーザIDを挿入 • SELECT:ユーザIDを指定して、そのユーザIDに一致する全ての行を取得 2 環境  Alfresco Community Edition 4.2.c  MySQL Community Server 5.5.31
  • 4.
    © 2013 大まかな流れ 1. カスタムテーブルの作成 2.カスタムテーブルに対応するEntityクラスの作成 3. SQLマッピング 4. DAOクラスの作成 5. (おまけ)動作確認用のServiceの作成 3
  • 5.
    © 20134 大まかなイメージ SqlSessionFactory SqlMapConfig.xml DAO SqlSessionTemplate SqlMap.xml DB毎に作成 <insertid="insert_custom_entity" parameterType="CustomEntity" useGeneratedKeys="true" keyProperty="id"> insert into aegif_custom_table (run_date, user_id) values (#{runDate}, #{userId}) </insert> Service DB コンストラクタ インジェクション insert / select insert / select Entity
  • 6.
    © 2013 1. カスタムテーブルの作成 SQL文を実行してカスタムテーブルを作成 5 CREATE TABLE aegif_custom_table ( id BIGINT NOT NULL AUTO_INCREMENT, run_date DATETIME NOT NULL, user_id VARCHAR(255) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB; ※Alfresco起動時に自動的にテーブルを作成する方法もあると思いますが、 今回は本筋から逸れるので割愛して手で作成します Create-CustomTable.sql
  • 7.
    © 2013 2. カスタムテーブルに対応するEntityクラスの作成 カスタムテーブルのカラムに対応するフィールドとそれらのgetter, setterを持つEntitytクラス を作成 6 package jp.aegif.alfresco.study.repo.domain; import java.util.Date; public class CustomEntity { private Long id; // internal DB-generated sequence id private Date runDate; private String userId; public Long getId() { return id; } public void setId(Long id) { this.id = id; } ... jp.aegif.alfresco.study.repo.domain.CustomEntity
  • 8.
    © 2013 3. SQLマッピング(1/2) SqlMapConfigの作成 7 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <typeAliases> <typeAlias alias="CustomEntity" type="jp.aegif.alfresco.study.repo.domain.CustomEntity"/> </typeAliases> <mappers> <mapper resource="alfresco/extension/ibatis/#resource.dialect#/custom-SqlMap.xml"/> </mappers> </configuration> <alf_dir>/tomcat/shared/classes/alfresco/extension/ibatis/custom-SqlMapConfig.xml
  • 9.
    © 2013 3. SQLマッピング(2/2) SqlMapの作成  ここで定義したnamespace, idをDAOで使用する 8 <alf_dir>/tomcat/shared/classes/alfresco/extension/ibatis/org.hibernate.dialect.Dialect/custom-SqlMap.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="alfresco.custom"> <insert id="insert_custom_entity" parameterType="CustomEntity" useGeneratedKeys="true" keyProperty="id"> insert into aegif_custom_table (run_date, user_id) values (#{runDate}, #{userId}) </insert> <select id="select_custom_entities_by_user" parameterType="CustomEntity" resultType="CustomEntity"> select id as id, run_date as runDate, user_id as userId from aegif_custom_table where user_id = #{userId} </select> </mapper>
  • 10.
    © 2013 4. DAOクラスの作成(1/2) Bean定義  先ほど定義したSqlMapConfigと紐付いたSqlSessionTemplateをインジェクト 9 <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'> <beans> <!-- MyBatis config for custom table --> <bean id="customSqlSessionFactory" class="org.alfresco.ibatis.HierarchicalSqlSessionFactoryBean"> <property name="useLocalCaches" value="${mybatis.useLocalCaches}"/> <property name="resourceLoader" ref="dialectResourceLoader"/> <property name="dataSource" ref="dataSource"/> <property name="configLocation"> <value>classpath:alfresco/extension/ibatis/custom-SqlMapConfig.xml</value> </property> </bean> <bean id="customSqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="customSqlSessionFactory"/> </bean> <bean id="customEntityDAO" class="jp.aegif.alfresco.study.repo.domain.CustomEntityDAOImpl"> <property name="sqlSessionTemplate" ref="customSqlSessionTemplate"/> </bean> </beans> <alf_dir>/tomcat/shared/classes/alfresco/extension/custom-ibatis-context.xml
  • 11.
    © 2013 4. DAOクラスの作成(2/2) SqlMapで定義したSQL文のnamespaceとidを繋げたキー、およびparameterTypeで指定した Entityを渡してSqlSessionTemplateオブジェクトのinsertまたはselectメソッドを実行する 10 public class CustomEntityDAOImpl implements CustomEntityDAO { protected SqlSessionTemplate template; public long insertCustomEntity(CustomEntity customEntity) throws SQLException { template.insert("alfresco.custom.insert_custom_entity", customEntity); Long id = customEntity.getId(); return (id != null ? id : -1); } public List<CustomEntity> selectCustomEntitiesByUser(CustomEntity customEntity) throws SQLException { if (customEntity.getUserId() != null) { return (List<CustomEntity>) template.selectList( "alfresco.custom.select_custom_entities_by_user", customEntity); } else { return new ArrayList<CustomEntity>(0); } } } jp.aegif.alfresco.study.repo.domain.CustomEntityDAOImpl
  • 12.
    © 2013 5.(おまけ)動作確認用のServiceの作成  DAOを介してデータをINSERT,SELECTするServiceを作成 11 public class CustomEntityServiceImpl implements CustomEntityService { private CustomEntityDAO customEntityDAO; ... public void insertCustomEntity(String userId) { ... try { Date runDate = new Date(); CustomEntity customEntity = new CustomEntity(); customEntity.setUserId(userId); customEntity.setRunDate(runDate); try { long id = customEntityDAO.insertCustomEntity(customEntity); ... jp.aegif.alfresco.study.repo.custom.CustomEntityServiceImpl
  • 13.
    © 2013 5.(おまけ)動作確認用のServiceの作成  JavaScriptからCustomEntityServiceにアクセスするためのクラスの作成とBean定義 12 publicclass ScriptCustomEntity extends BaseScopableProcessorExtension { private CustomEntityService customEntityService; ... public void insert(String userId) { customEntityService.insertCustomEntity(userId); } public List<CustomEntity> selectByUser(String userId) { return customEntityService.selectCustomEntitiesByUser(userId); } } <bean id="customEntityScript" parent="baseJavaScriptExtension" class="jp.aegif.alfresco.study.repo.custom.ScriptCustomEntity"> <property name="extensionName"> <value>customEntity</value> </property> <property name="customEntityService"> <ref bean="customEntityService" /> </property> </bean> jp.aegif.alfresco.study.repo.custom.ScriptCustomEntity <alf_dir>/shared/classes/alfresco/extension/custom-script-services-context.xml
  • 14.
    © 201313 (再掲)大まかなイメージ SqlSessionFactory SqlMapConfig.xml DAO SqlSessionTemplate SqlMap.xml DB毎に作成 <insertid="insert_custom_entity" parameterType="CustomEntity" useGeneratedKeys="true" keyProperty="id"> insert into aegif_custom_table (run_date, user_id) values (#{runDate}, #{userId}) </insert> Service DB コンストラクタ インジェクション insert / select insert / select Entity
  • 15.
  • 16.