<?xml version="1.0" encoding="UTF-8"?>
<document xmlns="http://maven.apache.org/XDOC/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/XDOC/2.0 http://maven.apache.org/xsd/xdoc-2.0.xsd">
	<properties>
		<title>挿入</title>
	</properties>
	<body>
		<section name="目次">
			<ul>
				<li><a href="#概要">概要</a></li>
				<li><a href="#SQLの自動生成による挿入">SQLの自動生成による挿入</a></li>
				<li><a href="#SQLファイルによる挿入">SQLファイルによる挿入</a></li>
			</ul>
		</section>
		<section name="概要">
			<p>
				SQLはすべてバインド変数（?）を使った準備された文に変換されて実行されますが、
				このドキュメントでは、発行されたSQLがどのようなものかわかりやすくするためにバインド変数を実際の値に置き換えたログ用のSQLを示します。
			</p>
		</section>
		<section name="SQLの自動生成による挿入">
			<p>
				<a href="https://www.seasar.org/svn/doma/trunk/doma-tutorial/src/test/java/tutorial/InsertTest.java">src/test/java/tutorial/InsertTest.java</a>のtestInsertメソッドを参照してください。
				SQLの自動生成による挿入です。
			</p>
			<p>
				使用するDaoのメソッド定義は次のとおりです。
			</p>
<source><![CDATA[@Insert
int insert(Employee employee);]]></source>
			<p>
				Daoのメソッドは次のように呼び出します。
			</p>
<source><![CDATA[Employee employee = new Employee();
employee.setName("test");
employee.setAge(50);
employee.setSalary(new Salary(300));
employee.setJobType(JobType.PRESIDENT);

dao.insert(employee);]]></source>
			<p>
				SQLのログは次のように出力されます（改行しています）。
			</p>
<source><![CDATA[insert into Employee (
  age, 
  DEPARTMENT_ID, 
  hiredate, 
  id, 
  insertTimestamp, 
  JOB_TYPE, 
  name, 
  salary, 
  updateTimestamp, 
  VERSION
) values (
  50, 
  null, 
  null, 
  100, 
  '2009-11-21 16:37:49.296', 
  'PRESIDENT', 
  'test', 
  300, 
  null, 
  1
)]]></source>
			<p>
				識別子のidプロパティは自動生成されるので設定する必要はありません。
			</p>
			<p>
				楽観的排他制御用バージョンのversionプロパティは自動生成されるので設定する必要はありません。
			</p>
			<p>
				insertTimestampプロパティはEmployeeListenerで自動設定されます。
				<a href="https://www.seasar.org/svn/doma/trunk/doma-tutorial/src/main/java/tutorial/entity/EmployeeListener.java">src/test/java/tutorial/EmployeeListener.java</a>を参照してください。
			</p>
		</section>
		<section name="SQLファイルによる挿入">
			<p>
				<a href="https://www.seasar.org/svn/doma/trunk/doma-tutorial/src/test/java/tutorial/InsertTest.java">src/test/java/tutorial/InsertTest.java</a>のtestInsertWithSqlFileメソッドを参照してください。
				SQLファイルによる挿入です。
			</p>
			<p>
				使用するDaoのメソッド定義は次のとおりです。
				@InsertのsqlFile要素にtrueを指定します。
			</p>
<source><![CDATA[@Insert(sqlFile = true)
int insertWithSqlFile(Employee employee);]]></source>
			<p>
				Daoのメソッドに対応するSQLファイルのパスはMETA-INF/tutorial/dao/EmployeeDao/insertWithSqlFile.sqlです。
				SQLファイルには次のように記述されています。
			</p>
<source><![CDATA[insert into Employee (
  ID, 
  NAME, 
  AGE, 
  DEPARTMENT_ID, 
  HIREDATE, 
  JOB_TYPE, 
  SALARY, 
  INSERTTIMESTAMP, 
  UPDATETIMESTAMP, 
  VERSION
) values (
  /* employee.id */1, 
  /* employee.name */'test', 
  /* employee.age */10, 
  /* employee.departmentId */1, 
  /* employee.hiredate */'2010-01-01', 
  /* employee.jobType */'SALESMAN', 
  /* employee.salary */300, 
  /* employee.insertTimestamp */'2010-01-01 12:34:56', 
  /* employee.updateTimestamp */'2010-01-01 12:34:56', 
  /* employee.version */1
)]]></source>
			<p>
				Daoのメソッドは次のように呼び出します。
			</p>
<source><![CDATA[Employee employee = new Employee();
employee.setId(100);
employee.setName("test");
employee.setAge(50);
employee.setSalary(new Salary(300));
employee.setJobType(JobType.PRESIDENT);
employee.setInsertTimestamp(new Timestamp(System.currentTimeMillis()));
employee.setVersion(1);

dao.insertWithSqlFile(employee);]]></source>
			<p>
				SQLのログは次のように出力されます。
			</p>
<source><![CDATA[insert into Employee (
  ID, 
  NAME, 
  AGE, 
  DEPARTMENT_ID, 
  HIREDATE, 
  JOB_TYPE, 
  SALARY, 
  INSERTTIMESTAMP, 
  UPDATETIMESTAMP, 
  VERSION
) values (
  100, 
  'test', 
  50, 
  null, 
  null, 
  'PRESIDENT', 
  300, 
  '2010-01-11 00:43:56.735', 
  null, 
  1
)]]></source>
			<p>
				SQLファイルによる挿入では、識別子の自動生成やバージョンの自動生成は行われません。
				また、エンティティリスナーも呼び出されません。
			</p>
		</section>
	</body>
</document>