目录
- Controller.Java代码模块(也可以写在service,看个人习惯)
- Mapper.XML代码模块
- 后话:
需求说明:当执行插入操作的时候,其中数据包含两个模块,分别存放在两种数据库表中,拿表A,表B来说。
表A为基本信息表,其中插入时候有自增id,也就是每新增一条数据后下一个id都会自动加1。表B为详情表,其中有个字段为A_id与A表中的id是一样的,也就是他们的关联字段。那么问题就来了:如果你在新增数据的时候,你发现基本信息和详情的数据都是在一个页面中,也是同时传递到后端接口中,那么我们势必会有个先后,必须要有A表中的id,那样的话B表中的数据才能够对应入库,不然所属关联关系就会乱,这样也会影响功能,废话不多说,直接上代码。
Controller.java代码模块(也可以写在service,看个人习惯)
//数据新增 //先将基本数据入库 res = service.insertbase(po); int id =po.getId(); newid = id; //然后获取id再将另一部分数据入另一张表
Mapper.xml代码模块
<insert id="insertbase" parameterType="alertmodelPo" useGeneratedKeys="true" keyProperty="po.id"> insert into A(profile_name,use_flag, create_by, create_date, remark) values (#{po.profile_name},'1', #{po.create_by}, now(), #{po.remark}) <selectKey order="AFTER" resultType="java.lang.Integer" keyProperty="po.id"> select last_value from A_id_seq </selectKey> <www.devze.com;/insert>
keyProperty:默认为unset,主要用于设置getGeneratedKeys方法或selectKey子元素返回值将赋值到领域模型的哪个属性中。
useGeneratedKeys:取值范围true|false(默认值),设置是否使用JDBC的。
其中主要是先执行插入操作,然后再从表序列中查询出最新的数据,也就是last_value,这个地方存在一个情况就是表的数据最好不要python直接库操作表插入,不然会影响这个表的序列,当然重置表序列等操作可以看我之前写的博客,里面有详细介绍。
操作过程可能遇到的问题:
Id值取不到之情况1:keyProperty的值直接写id没有写po.id。
本质原因,因为keyProperty的值是对象的属性值,不是数据表中的字段名。
Id值取不到编程客栈之情况2:在dao层的入参处没有声明@Param(“po”)从而导致po.id的值获取不到,也就是说这个没声名的话mapper里面就不知道你的po是什么值,就会报错no getter ‘po’……..。
本质原因,对@Param的android理解不够。
后话:
*之前网上很多都是没有下面selectKey的标签,我发现这个不写的话会存在版本兼容,报下面这个错误,所以没有用网上的那些方法,上面的我写的方法反正百试不爽。所以还是用我的方法吧。
Returning autogenerated keys is only supp编程客栈orted for 8.2 and later servers.
以上就是myBATis的insert插入后获取自增id的方法详解(从controller到mapper)的详细内容,更多关于mybatis insert获取自增id的资料请关注编程客栈(www.devze.com)其它相关文章!
精彩评论