Mybatis向数据库插入记录的同时获取其自增的id值
前言
在实际开发中,我们经常会遇到一对多的这种需求,比如发布一个公告,公告内容为单独一张数据表,而这个公告下又会有一些其他的一些数据信息,这些数据信息又单独放在一张数据表中,这时候我们就需要将两张表关联起来建立外键,而在向公告表插入一条公告记录的同时需要将这个公告下的其他数据信息插入到属于它的表中,那么外键值的插入就是一个问题了因为主键id都是自增的。我们必须要插入对应公告的id到其他数据信息的表外键列中。用来索引定位一对多的关系,下面是获取刚刚插入记录的自增id的方法
一、使用Map集合进行插入时获取自增id的方法
前端Demo代码 :
注意: 我下面发送给后端的数据没有任何有关于id的操作!!!
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
xmlns:v-on="http://www.w3.org/1999/xhtml" xmlns:v-bind="http://www.w3.org/1999/xhtml">
<head th:replace="public/header :: header(~{::title},~{},~{})">
<title>测试Map集合获取自增id</title>
<meta charset="UTF-8">
</head>
<body>
<button id="but1">发送Map集合数据给后端</button>
</body>
</html>
<script type="text/javascript">
$("#but1").click(function() {
$.ajax({
type:"post",
url:"/materialOut/getInsertAutoId",
data:'{"rkd_number":"001","rkd_name":"码不多测试插入数据","rkd_money":"999.99","rkd_date":"2021-09-03","rkd_person":"码不多","rkd_phone":"17612236596"}',
contentType:"application/json"
})
});
</script>
后端Demo代码:
- Mybatis映射文件sql
<insert id="insertDate" parameterType="map" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into rkd_jinxiang_info
<foreach collection="map" index="key" item="val" separator="," open="(" close=")">
${key}
</foreach>
values
<foreach collection="map" index="key" item="val" separator="," open="(" close=")">
#{val}
</foreach>
</insert>
参数说明 :
1.useGeneratedKeys 参数支持 insert 语句,默认情况是 false。当设置为 true时,表示如果插入的表以自增列为主键,则允许 JDBC 支持自动生成主键,并可将自动生成的主键返回。
2.keyProperty的值是Map的key不是数据库表中的字段名,你不需要去自己向Map集合中主动添加这里key和value。
3. keyColumn指定数据库主键
2.DAO层接口方法
void insertDate(@Param("map") Map map);
3.sevice层接口方法
void insertData(Map<String,Object> map);
4.service实现类方法
public void insertData(Map map) {
materialOutDao.insertDate(map);
};
5.Controller控制器
@RequestMapping("/getInsertAutoId")
@ResponseBody
public void getInsertAutoId(@RequestBody Map map){
//调用方法,执行插入sql
materialOutService.insertData(map);
//获取插入后自增的id值,直接get即可!!!!!!你不需要在代码中对id做任何操作!!!
Object id = map.get("id");
//将Object转为字符串,再转为int值
String strId = String.valueOf(id);
int intId = Integer.parseInt(strId);
//输出查看结果
System.out.println(intId);
}
结果 :
二、使用实体类进行插入时获取自增id的方法
前端Demo没变,这里就不二次贴了没意义。
后端Demo代码 :
其实变动也不大。就是将参数换成了实体类
- sql映射文件
<insert id="insertDate" parameterType="com.materialmanage.entity.MaBuDuoTest" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into rkd_jinxiang_info
(rkd_name,rkd_number,rkd_money,rkd_date,rkd_person,rkd_phone)
values
(#{rkd_name},#{rkd_number},#{rkd_money},#{rkd_date},#{rkd_person},#{rkd_phone})
</insert>
参数说明 :
1.useGeneratedKeys 参数支持 insert 语句,默认情况是 false。当设置为 true时,表示如果插入的表以自增列为主键,则允许 JDBC 支持自动生成主键,并可将自动生成的主键返回。
2.keyProperty的值是实体类的id属性不是数据库表中的字段名!!!
3. keyColumn指定数据库主键
- 实体类 : 与数据库字段完全一致就OK
//lombok
@Data
@NoArgsConstructor
public class MaBuDuoTest {
private int id;
private String rkd_number;
private String rkd_name;
private String rkd_money;
private String rkd_date;
private String rkd_person;
private String rkd_phone;
}
- DAO层
void insertDate(MaBuDuoTest maBuDuoTest);
- Service与ServiceImpl
void insertData(MaBuDuoTest maBuDuoTest);
public void insertData(MaBuDuoTest maBuDuoTest) {
materialOutDao.insertDate(maBuDuoTest);
}
- Controller控制器
@RequestMapping("/getInsertAutoId")
@ResponseBody
public void getInsertAutoId(@RequestBody MaBuDuoTest maBuDuoTest){
//调用方法,执行插入sql
materialOutService.insertData(maBuDuoTest);
//直接调用实体类中id属性的get方法即可!!!!
int id = maBuDuoTest.getId();
//输出查看结果
System.out.println(id);
}
}
结果 :
三、sql映射文件中insert获取自增id的另一种写法
其实还有一种写法,获取自增id在Mybatis的sql文件中。
<!--发布公告添加标题和公告内容并查询最新自增的id-->
<insert id="insertDate" parameterType="MaBuDuoTest">
<!--通过mybatis框架提供的selectKey标签获得自增产生的ID值-->
/*order="AFTER",声明当前select语句在insert后面执行*/
<selectKey resultType="int" keyColumn="id" order="AFTER" keyProperty="id">
select LAST_INSERT_ID()
</selectKey>
insert into rkd_jinxiang_info
(rkd_name,rkd_number,rkd_money,rkd_date,rkd_person,rkd_phone)
values
(#{rkd_name},#{rkd_number},#{rkd_money},#{rkd_date},#{rkd_person},#{rkd_phone})
</insert>
总结
以上就是获取自增id的全部内容,当你获取到插入记录的自增id,你就可以将这个id作为另一张表的外键插入到它的外键列中,具体的业务逻辑需要根据你的项目需求而定!!! 有时间我还会为大家更新更多有用的小文章。