Mybatis Generatorでimmutableなクラスとなるように、コード生成をするやり方です。
コンストラクタによるマッピング + setterなし
公式サイトでやり方はでていますが、constructorBasedにし、immutableにすると、コンストラクタのみがフィールドの値を設定できるようなクラスを生成するようになります。
generatorConfig.xml
<javaModelGenerator targetPackage="entity" targetProject="src\main\java">
<property name="constructorBased" value="true"/>
<property name="immutable" value="true"/>
</javaModelGenerator>
<table tableName="">
<property name="modelOnly" value="true"/> // モデルクラスと対応するxmlファイルだけ生成
<property name="useActualColumnNames" value="false"/> //snake_caseのカラム名をcamelCaseのフィールド名にマッピング
</table>
サンプル
例えば、id,nameというカラムを持つUserテーブルに対しては、次のようなxmlファイルとjavaファイルが生成されます。
UserMapper.xml
<resultMap id="BaseResultMap" type="entity.User" >
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
-->
<constructor >
<arg column="id" jdbcType="INTEGER" javaType="java.lang.Integer" />
<arg column="name" jdbcType="NVARCHAR" javaType="java.lang.String" />
</constructor>
</resultMap>
User.java
public class User{
/**
* This field was generated by MyBatis Generator.
* This field corresponds to the database column User.id
*
* @mbggenerated
*/
private Integer id;
/**
* This field was generated by MyBatis Generator.
* This field corresponds to the database column User.name
*
* @mbggenerated
*/
private String name;
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table FUNCTION_CODE_MASTER
*
* @mbggenerated
*/
public FunctionCodeMaster(Integer id, String name) {
this.id= id;
this.name= name;
}
/**
* This method was generated by MyBatis Generator.
* This method returns the value of the database column User.id
*
* @return the value of User.id
*
* @mbggenerated
*/
public String getId() {
return id;
}
/**
* This method was generated by MyBatis Generator.
* This method returns the value of the database column User.name
*
* @return the value of User.name
*
* @mbggenerated
*/
public String getName() {
return name;
}
どういうときに使う?
コード値のテーブルやマスタ系など、いわゆる参照にしか使わないテーブルです。
意図しないタイミングで編集されたくないので、最初からimmutableにしておくて便利です。
表示させるときに何かしらの整形する場合は、そのためのDTOを用意するか、SQLで整形した結果をビューにして、そのビューからコード生成をさせるなどをしています。