一、背景
群里有个哥们分享了一个mybatis的小”坑“。
”分享一个菜鸡点:mybatis中使用@param注解后,要keyProperty=“注解名.id”,不然拿不到生成的主键值“
那么我们就要看@Param 在什么时候用?为啥不写参数名不行呢?
二、解析
2.1 官方文档大法
user类
public class User {
//...
public User(Integer id, String username, int age) {
//...
}
//...
}
为了将结果注入构造方法,MyBatis 需要通过某种方式定位相应的构造方法。 在下面的例子中,MyBatis 搜索一个声明了三个形参的的构造方法,参数类型以 java.lang.Integer, java.lang.String 和 int 的顺序给出。
当你在处理一个带有多个形参的构造方法时,很容易搞乱 arg 元素的顺序。
从版本 3.4.3 开始,可以在指定参数名称的前提下,以任意顺序编写 arg 元素。
为了通过名称来引用构造方法参数,你可以添加 @Param 注解,或者使用 ‘-parameters’ 编译选项并启用 useActualParamName 选项(默认开启)来编译项目。
下面是一个等价的例子,尽管函数签名中第二和第三个形参的顺序与 constructor 元素中参数声明的顺序不匹配。
如果存在名称和类型相同的属性,那么可以省略 javaType 。剩余的属性和规则和普通的 id 和 result 元素是一样的。
【1】什么情况下用@param注解
一、是参数的顺序和xml映射文件的顺序不匹配时。
二、是参数为两个对象且属性有重名的时候,mybatis无法感知是哪个类的属性。
2.2 源码大法
为什么设置了@Parm的值,keyProperty不加item前缀就不生效呢?(内容略长,要有心理准备哈哈)
源码参考这里
我们加注解
void insert(@Param("item") CuxTodoItems cuxTodoItems);
对应xml
insert into cux_todo_items (user_id,todo_item_title,todo_item_content,priority)
values ( #{item.userId},#{item.todoItemTitle},#{item.todoItemContent},#{item.priority});
先执行这里构造参数名解析对象
public ParamNameResolver(Configuration config, Method method) {
<