在项目开发中,有时需要获取主键值。
比如在表的关联关系中,将数据插入主表之后需要再插入子表,我们需要把主表的主键作为外键插入子表中。
这样的话就需要获取主键值了。
所以涉及主键返回的问题。
1.自增主键的返回
MYSQL自增主键,执行insert提交之前自动生成一个自增主键。
通过mysql函数获取到刚刚插入的记录的自增主键。
LAST_INSERT_ID(),在insert之后调用此函数。
<insert id="insertUser" parameterType="com.winner.User"> <!-- 将插入数据的主键返回,插入到user对象中。 SELECT LAST_INSERT_ID():得到刚刚insert进去记录的主键值,只适用于自增主键。 keyProperty:将查询到的主键值设置到parameterType指定的对象的哪个属性上。 order:SELECT LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序。 resultType:指定SELECT LAST_INSERT_ID()的结果类型 --> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO user(username,birthday,sex,address) VALUES (#{userName},#{birthday},#{sex},#{address}) </insert>
User user = new User(); user.setUserName("王小二"); user.setBirthday(new Date()); user.setSex("1"); user.setAddress("江苏南京"); sqlSession.insert(User.class.getName().concat(".") + "insertUser", user);
可以看到,这里生成的user对象并没有设置id的值,默认是0,mapper文件中的selectKey 的设置会使得user对象的id的值是数据库中对应的记录的主键id的值。
当然是插入操作完成之后才有这个值。
2.非自增主键返回
使用mysql的uuid()函数生成主键,需要修改表中id字段类型为string,长度设置成35位。
执行思路:
先通过uuid()查询到主键,将主键输入到sql语句中。
执行uuid()语句顺序相对于insert语句之前执行。
<insert id="insertUser" parameterType="com.winner.User"> <!-- 使用mysql的uuid()函数生成主键,将主键设置到user对象的id属性中。 其次在执行insert语句时,从user对象中取出id属性的值。 注意,这样的话insert语句中就需要包括id字段和id属性。 --> <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> SELECT uuid() </selectKey> INSERT INTO user(id,username,birthday,sex,address) VALUES (#{id},#{userName},#{birthday},#{sex},#{address}) </insert>
注意,这种情况下,表的id字段类型必须是varchar类型,不能自增,长度必须大于35.
User user = new User(); user.setUserName("王小二"); user.setBirthday(new Date()); user.setSex("1"); user.setAddress("江苏南京"); sqlSession.insert(User.class.getName().concat(".") + "insertUser", user);
可以看到,这里生成的user对象并没有设置id的值,默认是null,mapper文件中的selectKey 的设置会使得user对象的id的值是数据库中对应的记录的主键id的值。
但是在插入操作之前这个值就有了。
时间: 2024-11-05 14:54:48