如何让MyBatis使用静态工厂方法而非构造器创建对象?
如何让MyBatis使用静态工厂方法创建Car对象
针对你这种仅提供私有构造器、通过静态工厂方法实例化的类,MyBatis支持直接配置使用指定工厂方法创建对象,分XML映射和注解两种场景实现:
一、XML映射文件配置方式
在Mapper XML文件中,通过resultMap指定静态工厂方法,具体配置如下:
<!-- 定义结果映射,指定使用createCheap静态方法创建实例 --> <resultMap id="carResultMap" type="com.yourpackage.Car"> <!-- constructor标签指定工厂方法,factoryMethod对应静态方法名 --> <constructor factoryMethod="createCheap"> <!-- 配置工厂方法的参数,column对应数据库列名,javaType匹配方法参数类型 --> <arg column="name" javaType="java.lang.String"/> </constructor> </resultMap> <!-- 查询语句绑定上述结果映射 --> <select id="getCarById" resultMap="carResultMap"> SELECT name FROM car WHERE id = #{id} </select>
注意:因为createCheap方法仅需name参数,所以查询语句只需返回name列即可,isCheap的值由工厂方法内部固定为true,无需从数据库读取。
二、注解方式配置
如果使用注解式Mapper,可通过@ConstructorArgs注解指定静态工厂方法:
import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.ConstructorArgs; import org.apache.ibatis.annotations.Arg; public interface CarMapper { @Select("SELECT name FROM car WHERE id = #{id}") @ConstructorArgs( factoryMethod = "createCheap", args = @Arg(column = "name", javaType = String.class) ) Car getCarById(Long id); }
关键注意事项
- 工厂方法的参数数量、类型必须和配置的
arg(XML)或@Arg(注解)完全匹配,否则MyBatis会抛出实例化异常。 - 若工厂方法有多个参数,需严格按照方法定义的参数顺序配置对应列。
- 确保MyBatis能正确识别Car类,可在MyBatis配置文件中配置类别名,或直接使用全类名。
内容的提问来源于stack exchange,提问作者Vadim
相关产品推荐
相关产品推荐

