我有一個(Java)類與許多實例字段(其中許多是可選的)。我希望所有的領域(因此類)都是不可變的。所以,我想用Builder模式來構建類的實例。我可以配置myBatis以使用Builder模式創建類的實例嗎?
我可以配置myBatis以使用Builder模式創建類的實例嗎?我知道我可以讓myBatis返回一張地圖並使用該地圖在我的代碼中構建實例。但是,我正在尋找一種配置此映射(或使用某種約定)的方法,類似於如何通過使用Java Bean和構造函數來創建實例。
編輯(包括一個例子)
下面是一個例子:
package com.example.model;
// domain model class with builder
public final class CarFacts {
private final double price;
private final double numDoors;
private final String make;
private final String model;
private final String previousOwner;
private final String description;
public static class Builder {
// required params
private final double price;
private final String make;
private final String model;
// optional params
private final String previousOwner;
private final String description;
private final double numDoors;
public Builder(double price, String make, String model) {
this.price = price;
this.make = make;
this.model = model;
}
public Builder previousOwner(String previousOwner) {
this.previousOwner = previousOwner;
return this;
}
// other methods for optional param
public CarFacts build() {
return new CarFacts(this);
}
}
private CarFacts(Builder builder) {
this.price = builder.price;
//etc.
}
}
然後,我有一個映射器爲:
<!-- this doesn't work but I think h3adache suggest that I could have the resultType
be com.example.model.CarFacts.Builder and use the Builder constructor. But I'm not sure how
I would call the methods (such previousOwner(String)) to populate optional params -->
<mapper namespace="com.example.persistence.CarFactsMapper">
<select id="selectCarFacts" resultType="com.example.model.CarFacts">
select *
from CarFacts
</select>
</mapper>
最後,我映射器接口:
package com.example.persistence.CarFactsMapper;
public interface CarFactsMapper{
List<CarFacts> selectCarFacts();
}
我也想通過myBatis使用靜態工廠方法創建實例。例如:
public final class Person {
private final String lastName;
private final String firstName;
private Person(String lastName, String firstName) {
this.lastName = lastName;
this.firstName = firstName;
}
public Person newInstance(String lastName, String firstName) {
return new Person(lastName, firstName);
}
}
具體來說,我怎麼能有MyBatis的調用的newInstance(字符串,字符串)?
這不回答這個問題。 –