Java 我是否可以配置myBatis以使用生成器模式创建类的实例?

Java 我是否可以配置myBatis以使用生成器模式创建类的实例?,java,mybatis,builder-pattern,static-factory,Java,Mybatis,Builder Pattern,Static Factory,我有一个(Java)类,它有许多实例字段(其中许多是可选的)。我希望所有字段(因此类)都是不可变的。因此,我想使用Builder模式来构造类的实例 我是否可以配置myBatis以使用生成器模式创建类的实例?我知道我可以让myBatis返回一个映射,并使用该映射在代码中的实例中进行构建。然而,我正在寻找一种配置这种映射(或使用某种约定)的方法,类似于如何通过使用JavaBean和构造函数创建实例 编辑(包括示例) 下面是一个例子: package com.example.model; //带生成器

我有一个(Java)类,它有许多实例字段(其中许多是可选的)。我希望所有字段(因此类)都是不可变的。因此,我想使用Builder模式来构造类的实例

我是否可以配置myBatis以使用生成器模式创建类的实例?我知道我可以让myBatis返回一个映射,并使用该映射在代码中的实例中进行构建。然而,我正在寻找一种配置这种映射(或使用某种约定)的方法,类似于如何通过使用JavaBean和构造函数创建实例

编辑(包括示例)

下面是一个例子:

package com.example.model;
//带生成器的域模型类
公开期末成绩{
私人最终双倍价格;
私人最终双门;
私人最终字符串制作;
私有最终字符串模型;
私有最终字符串先前所有者;
私有最终字符串描述;
公共静态类生成器{
//必需参数
私人最终双倍价格;
私人最终字符串制作;
私有最终字符串模型;
//可选参数
私有最终字符串先前所有者;
私有最终字符串描述;
私人最终双门;
公共建筑商(双倍价格、字符串制造、字符串模型){
这个价格=价格;
make=make;
this.model=模型;
}
公共生成器previousOwner(字符串previousOwner){
this.previousOwner=previousOwner;
归还这个;
}
//可选参数的其他方法
公共交通设施建设(){
归还新的汽车(本);
}
}
私家车(建筑商){
this.price=builder.price;
//等等。
}
}
然后,我有一个映射器:

<!-- 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>

具体来说,如何让myBatis调用newInstance(String,String)?

您不需要使用生成器或静态工厂方法。是的,如果您试图保持不变性,这些模式肯定会有帮助,因为可能会发生突变,我们是否应该说“实例之间”,例如,当构建器在调用build()之前发生突变(以创建新的不可变实例)

然而,不变性与给定实例的构造方式无关。对于一个可变的类来说,编写构建器和静态工厂方法并没有任何意义。在构建的时候,所有对象都还没有发生变异,因此真正重要的是接下来会发生什么(在建设者和工厂离开之后)

您所需要做的就是关注类本身,并认为ok是这个类不可变的。常规的myBatis映射应该很好-节省编写生成器的时间

那么-您的类是不可变的吗?是的,因为您的所有字段都是final,或者是基元类型或字符串(在Java中是不可变的!)。如果您有其他非原语字段,那么您希望它们是final(从技术上讲,您不需要编写final,但建议这样做,只要该字段从未真正重新分配过),并且希望它们的类始终遵循这些规则的递归


我希望这能有所帮助,我想说明的是,构建器模式和工厂方法对于管理构造是很好的,但它们不会免费为您提供不变性,您始终需要编写一个构造函数。

这并不能回答问题。
package com.example.persistence.CarFactsMapper;

public interface CarFactsMapper {
    List<CarFacts> selectCarFacts();
}