项目场景:
往b表里添加a表获取的自增主键id问题描述:
大家注意这里有好多坑
- 怎么实现?
- keyProperty怎麽设置?
- 都写好了就是获取不到主键ID
解决方案:
1.第一个问题,怎么实现?
DamageListGoodsDao(也就时a表主表,要获取的主键id表)
int insertDamageList(@Param("damageList") DamageList damageList);
DamageListGoodsMapper.xml(敲重点了!!!)
1.首先得设置主键自增,也就是useGeneratedKeys=“true”
2.其次设置keyProperty中对应的值是实体类的属性,千万不要设置成数据库的字段
<insert id="insertDamageList" useGeneratedKeys="true" keyProperty="damageList.damageListId" parameterType="com.atguigu.jxc.entity.DamageList">
insert into t_damage_list(damage_number,damage_date,remarks,user_id)
values (#{damageList.damageNumber},#{damageList.damageDate},#{damageList.remarks},#{damageList.userId})
</insert>
最后,获取到新增行的主键ID,会返回给设置的model模型(也就是实体类)中,然后直接调用实体类属性就可以得到值了
DamageListGoodServiceImpl(测试结果,这里展示关键的service代码)
// 调用dao层插入a表的方法 说明damageList是DamageList实体类的对象
damageListGoodsDao.insertDamageList(damageList);
// 输出得到的主键值 这里的主键值已经封装给实体类了
System.out.println(damageList.getDamageListId());
// 把a表查到的主键值插入到b表 damageListGoods是前端传来b表的数据
// 根据你自己的代码看是否传该参数
damageListGoodsDao.insertDamageListGoods(damageList,damageListGoods);
细节注意:都写好了就是获取不到主键ID:
1.查看dao层中的调用a表的方法传的参数 有俩种方法
第一种:传参时加@Param()的如下
DamageListGoodsDao(也就时a表主表,要获取的主键id表)
int insertDamageList(@Param("damageList") DamageList damageList);
使用这种方式传的参,keyProperty必须要设置为
keyProperty=“damageList.damageListId”
<insert id="insertDamageList" keyProperty="damageList.damageListId" parameterType="com.atguigu.jxc.entity.DamageList" useGeneratedKeys="true">
insert into t_damage_list(damage_number,damage_date,remarks,user_id)
values (#{damageList.damageNumber},#{damageList.damageDate},#{damageList.remarks},#{damageList.userId})
</insert>
第二种:传参时不加@Param()的如下
int insertDamageList(DamageList damageList);
这种方式,keyProperty设置为实体类对应的主键id就可以了
keyProperty=“damageListId”
<insert id="insertDamageList" parameterType="com.atguigu.jxc.entity.DamageList" useGeneratedKeys="true" keyProperty="damageListId">
insert into t_damage_list(damage_number,damage_date,remarks,user_id)
values (#{damageNumber},#{damageDate},#{remarks},#{userId})
</insert>
2.查看数据库表,是否设置了主键
总结:
1.主要设好useGeneratedKeys以及keyProperty这两个属性
2.@Parm("") 传的参要与keyProperty=“”值得格式一样
3.数据库表的主键
补充知识点
在不使用@Param注解的时候,只能使用一个参数,并且在查询语句取值时只能用#{}(如果想传递多个参数,parameterType参数类型为map(此处为别名)或者为JavaBean)
在使用@Param注解的时候,可以使用多个参数,无需再设置parameterType,并且在查询语句中使用时可以使用#{}或者${}