个人主题网站设计,唐山企业建网站,网络热词的利弊,凡科互动官网登录入口官方Mybatis主键自动生成
在MyBatis中#xff0c;允许设置名称为“useGeneratedKeys”参数存在3个位置#xff1a; 在xml映射器中设置useGeneratedKeys参数 在接口映射器中设置useGeneratedKeys参数 在settings元素中设置useGeneratedKeys参数
在不同位置设置的useGenerated…Mybatis主键自动生成
在MyBatis中允许设置名称为“useGeneratedKeys”参数存在3个位置 在xml映射器中设置useGeneratedKeys参数 在接口映射器中设置useGeneratedKeys参数 在settings元素中设置useGeneratedKeys参数
在不同位置设置的useGeneratedKeys参数最终结果相同但是影响范围不同。
官方的说法是该参数的作用是“允许JDBC支持自动生成主键需要驱动兼容”如何理解这句话的意思
其本意是说对于支持自动生成记录主键的数据库如MySQLSQL Server此时设置useGeneratedKeys参数值为true在执行添加记录之后可以获取到数据库自动生成的主键ID。
在xml映射器中配置useGeneratedKeys参数
!-- 插入数据:返回记录的id值 --
insert idinsertOneTest parameterTypeorg.x.Test useGeneratedKeystrue keyPropertyid keyColumnidinsert into test(name,descr,url,create_time,update_time) values(#{name},#{descr},#{url},now(),now())
/insertxml映射器中配置的useGeneratedKeys参数只会对xml映射器产生影响
在接口映射器中设置useGeneratedKeys参数
// 设置useGeneratedKeys为true返回数据库自动生成的记录主键id
Options(useGeneratedKeys true, keyProperty id, keyColumn id)
Insert(insert into test(name,descr,url,create_time,update_time) values(#{name},#{descr},#{url},now(),now()))
Integer insertOneTest(Test test);注意 在接口映射器中设置的useGeneratedKeys参数会覆盖在元素中设置的对应参数值。
在settings元素中设置useGeneratedKeys参数
实际上在settings元素中设置useGeneratedKeys是一个全局参数但是只会对接口映射器产生影响对xml映射器不起效。
settings
!--
允许JDBC支持自动生成主键需要驱动兼容。
如果设置为true则这个设置强制使用自动生成主键尽管一些驱动不能兼容但仍可正常工作比如 Derby。
--
setting nameuseGeneratedKeys valuetrue /
/settings此时在接口映射中添加记录之后将返回主键ID。
public interface TestMapper {// 受全局useGeneratedKeys参数控制添加记录之后将返回主键idInsert(insert into test(name,descr,url,create_time,update_time) values(#{name},#{descr},#{url},now(),now()))Integer insertOneTest(Test test);
}但是请注意如果此时在接口映射器中又明确设置了useGeneratedKeys参数那么注解映射器中的useGeneratedKeys参数值将覆盖settings元素中设置的全局useGeneratedKeys参数值。 举个例子先在settings元素中设置全局useGeneratedKeys参数值为true再在接口映射器中设置useGeneratedKeys参数值为false添加记录之后将不能返回注解ID。
// 在接口映射器中设置的useGeneratedKeys参数值将会覆盖在settings元素中设置全局useGeneratedKeys参数值
Options(useGeneratedKeys false, keyProperty id, keyColumn id)
Insert(insert into test(name,descr,url,create_time,update_time) values(#{name},#{descr},#{url},now(),now()))
Integer insertOneTest(Test test);注意项
Mybatis 配置文件配置useGeneratedKeys 参数只针对 insert 语句生效默认为 false。且需要数据库支持自动生成主键
在INSERT语句中我们为可以自动生成auto-generated主键的列 STUD_ID 插入值。我们可以使用useGeneratedKeys和keyProperty属性让数据库生成auto_increment列的值并将生成的值设置到其中一个输入对象属性内如下所示
insert idinsertStudent parameterTypeStudent useGeneratedKeystrue keyPropertystudId INSERT INTO STUDENTS(NAME, EMAIL, PHONE) VALUES(#{name},#{email},#{phone})
/insert 这里STUD_ID列值将会被数据库自动生成(如mysql)并且生成的值会被设置到student对象的studId属性上。
但是有些数据库如Oracle并不支持AUTO_INCREMENT列其使用序列SEQUENCE来生成主键值。假设我们有一个名为my_seq的序列来生成SUTD_ID主键值。使用如下代码来生成主键
drop sequence my_seq;
create sequence my_seq;
insert idinsertStudent parameterTypeStudent selectKey keyPropertystudId resultTypeint orderBEFORE SELECT my_seq.nextval FROM DUAL /selectKey INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL, PHONE) VALUES(#{studId},#{name},#{email},#{phone})
/insert 这里我们使用了子元素来生成主键值并将值保存到Student对象的studId 属性上。属性order“before”表示MyBatis将取得序列的下一个值作为主键值并且在执行INSERT语句之前将值设置到studId属性上。 注: SelectKey需要注意order属性像MySQL、SQLServer等一类支持自动增长类型的数据库中order需要设置为after才会取到正确的值。 像Oracle这样取序列的情况需要设置为before否则会报错。