最近在写电商项目,写到地址管理模块的时候,遇到一个需求:添加地址时,添加地址成功之后给前端返回一个id方便给前端查询和测试,接下来就要用到mapper.xml中的useGeneratedKeys和keyProperty的两个属性。
Mybatis在插入的时候,需要获取自增主键,这时候就在mapper.xml的中将useGeneratedKeys和keyProperty,其中keyProperty对应的是Java对象的属性名,useGeneratedKeys的作用是允许 JDBC 支持自动生成主键,需要驱动支持。 如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能支持但仍可正常工作(比如 Derby)如:
<insert id="insert" parameterType="com.mmall.domain.Shipping" useGeneratedKeys="true" keyProperty="id"> insert into mmall_shipping (id, user_id, receiver_name, receiver_phone, receiver_mobile, receiver_province, receiver_city, receiver_district, receiver_address, receiver_zip, create_time, update_time ) values (#{id,jdbcType=INTEGER}, #{userId,jdbcType=INTEGER}, #{receiverName,jdbcType=VARCHAR}, #{receiverPhone,jdbcType=VARCHAR}, #{receiverMobile,jdbcType=VARCHAR}, #{receiverProvince,jdbcType=VARCHAR}, #{receiverCity,jdbcType=VARCHAR}, #{receiverDistrict,jdbcType=VARCHAR}, #{receiverAddress,jdbcType=VARCHAR}, #{receiverZip,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP} ) </insert>Mybatis执行完插入语句后,自动将自增长值赋值给对象Shipping的属性id,我们可以通过shipping.getId()方法获取,然后传回给前端:
@Service public class ShippingServiceImpl { @Autowired private ShippingMapper shippingMapper; public ServerResponse add(Integer userId,Shipping shipping){ shipping.setUserId(userId); int rowCount = shippingMapper.insert(shipping); if (rowCount>0){//我们与前端的约定是一旦地址添加成功返回一个shippingId给前端, Map result = Maps.newHashMap(); result.put("shippingId",shipping.getId()); return ServerResponse.createBySuccess("新增地址成功",result); } return ServerResponse.createBySuccess("新增地址失败"); } }