版权声明: https://blog.csdn.net/smileyan9/article/details/88016380
1. 编写目的
介绍如何使用mysql数据库并且已经设计这个表的主键值为自增,使用mybatis插入一条数据时返回这个插入数据的主键值。
2. 特别提醒
不能够误以为调用dao层,返回值是主键值。这样编写代码,最后会发现如果插入一条数据成功的话,返回值永远是1。
因为返回值的意思是插入后对这张表影响的行数。
3. 具体代码
- 保证数据库设计时主键值是自增的
- 使用mybatis配置的xml文件中,需要指定自增是哪个字节。下面是项目中的源码,特别要注意useGeneratedKeys="true"是使用自增,keyProperty对应的java中实体类中主键的那个变量名,而不是数据库表中的属性名。
<insert id="insertUser" parameterType="cn.ailanglang.diary.entity.User"
useGeneratedKeys="true" keyProperty="pkUserid">
insert into user(password,uk_phone,gmt_create,gmt_modified)
values(#{password},#{ukPhone},#{gmtCreate},#{gmtModified})
</insert>
- 在调用时,需要先插入数据,然后再调用实体类的getId方法返回主键值。
推荐在service层完成,但是为了让测试效果更明显,我写在controller中,代码如下:
@RequestMapping("/add")
private Map<String,String> insertUser(String password,String phonenum) {
Map<String,String > map = new HashMap<>(2);
User user = new User();
user.setGmtCreate(new Date());
user.setGmtModified(new Date());
user.setUkPhone(phonenum);
user.setPassword(password);
// 特别要注意这个地方
Long id = userService.insertUser(user);
System.out.println(id);
map.put("insert的返回值 == ",id+"");
map.put("user.getPkuserid == ",user.getPkUserid()+"");
return map;
}
4. 效果展示
5. 推荐
推荐写在service层中,避免一些可能导致的不必要的麻烦。
@Autowired
private UserDao userDao;
@Override
public Long insertUser(User user) {
userDao.insertUser(user);
return user.getPkUserid();
}
6. 总结
小小的问题困扰我的时间真不少,特在此做笔记,也供他人了解,有问题欢迎交流。
Smileyan 2019年2月28日