今天写项目的时候遇到了一个问题 我在xml里面的parameterType定义的对象里面只有字段A,B,C但是dao里面通过通配符传递接受对象,传进去的有字段A,B,C,D之后通过xml里面取值#{D}可以取到值见代码
public class TestParam{
private String A;
private String B;
private String C;
}
public class TestParam2{
private String A;
private String B;
private String C;
private String D;
}
public interfacae TestDao{
int testInsert(T entity);
}
<insert parameterType="xx.xx.xx.xx.xx.TestParam">
insert into t_test (field1,field2,field3,field4) values (#{A},#{B},#{C},#{D})
</insert>
@Autowired
private TestDao testDao;
public void test(){
TestParam2 testParam2 = TestParam2();
testParam2.setA("a");
testParam2.setB("b");
testParam2.setC("c");
testParam2.setD("d");
testDao.insert(testParam2);
}
结果:D字段正常入库
通过上述代码dao层接受的TestParam2但是我xml里面的parameterType接受的是TestParam1
并且TestParam1不包含D字段但是入库的时候正常入库了并且#{D}也取到值了这里问了下部门的大佬大佬的解释如下:
因为mybatis的运行方式是先有sql然后再去取值,这里的parameterType只是一个指导参数,并不具备实际意义,当sql里面有#{D}的时候会通过反射区找到dao层传递进来的对象去找指定字段的值,编译成功后dao层传递进来的其实就是一个map,sql里面所有的取值都是从这个map里面拿到的