虽然是小坑,但坑起来要人命
参考教程
在插入语句里面有一些额外的属性和子元素用来处理主键的生成,并且提供了多种生成方式。首先,如果你的数据库支持自动生成主键的字段(比如 MySQL 和 SQL Server),那么你可以设置 useGeneratedKeys=”true”,然后再把 keyProperty 设置为目标属性就 OK 了。例如,如果上面的 Author 表已经在 id 列上使用了自动生成,那么语句可以修改为:
<insert id="insertAuthor" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into Author (username,password,email,bio)
values (#{username},#{password},#{email},#{bio})
</insert>
如果你的数据库还支持多行插入, 你也可以传入一个 Author 数组或集合,并返回自动生成的主键。
<insert id="insertAuthor" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into Author (username, password, email, bio) values
<foreach item="item" collection="list" separator=",">
(#{item.username}, #{item.password}, #{item.email}, #{item.bio})
</foreach>
</insert>
本人用的PostgreSQL,是支持自增主键的,但无论如何,返回的都是1,我的操作如下:
// XxxMapper.java
public interface XxxMapper extends BaseMapper<Xxx> {
int insertXxx(Xxx xxx);
}
// XxxServiceImpl.java
@Service
public class XxxServiceImpl extends ServiceImpl<XxxMapper, Xxx> implements IXxxService {
@Resource
private XxxMapper xxxMapper;
@Override
public void insertXxx(Xxx xxx) {
int xxxId = xxxMapper.insertXxx(xxx);
}
}
就这,我在网上找了半天。。老司机们可能都看笑了,这不。。错得很明显嘛
然而本菜鸟被下了降头,就是找不到原因。
百度出来的全是跟上一节一样,基本配置CV了一遍又一遍,一群¥%#*&E…%,这个要你教?教程抄起来就那么有意思?
After two hours…
破案了:
没错,对,配置没错,insert没错,返回没错,主键也没错。。
主键已经在Entity对象里了,也就是说,上述代码中的xxxId取的不是它返回的id,还是那个影响行数,返回的主键ID它已经给你放到你的入参对象里了。。
xxxMapper.insertXxx(xxx);
int xxxId = xxx.getId();
瞧,简单直白。。还得夸它干得不错,很人性化。。
我第一次也是这么认为的。。
第一次?
嗯。。这是第二次
第一次没中降头,自己想明白了,还颇为赞叹得告知同事。。
中间半个月去干其它事了,就没想起来
还是请教同事后他给我破的案,你之前不是还告诉我XXXXXXX嘛?(o´・ェ・`o)
自己找不到错时可以多方查找,与同行交流
自己躺过的坑也要牢记。。