You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 08:26:49