-
2020-10-23 20:06:52
今天插入数据后想得要得到其自增的主键id,用来进行其他操作,网上找了很多办法,这里做一下总结
用@Options注解:
代码如下:
@Insert("INSERT INTO sp_attribute(attr_name,cat_id,attr_sel,attr_write,attr_vals,delete_time)" + "VALUES(#{attr_name},#{cat_id},#{attr_sel},#{attr_write},#{attr_vals},null)") @Options(useGeneratedKeys = true,keyProperty = "attr_id",keyColumn = "attr_id") void addAttr(Attribute attribute);
这里的useGeneratedKeys参数只针对 insert 语句生效,默认为 false,为true时就会把其自增id返回,keyProperty表示实体类中的成员变量,keyColumn则对应数据库中的列名,因为我的实体类和数据库中都叫"attr_id",所以是一样的。
需要注意的是,获取主键id是通过实体类的gitter()方法而不是addAttr的Integer返回值。
比如://这样返回的Integer的值只能是1或0,代表着执行成功或是失败 Integer addAttr(Attribute attribute); //用gitter()得到才是我们需要的主键id,我的主键id是attr_id,故 attribute.getAttr_id();
更多相关内容 -
THINKPHP在添加数据的时候获取主键id的值方法
2020-12-20 02:11:30在使用ThinkPHP新增数据后可以很... // 获取数据库写入数据的主键 }else{ exit($Model->getError()); } 如果你的数据表主键是自动增长型的,那么add方法成功后的返回值就是该数据的主键值。无需额外获取。 以上这篇T -
Mybatis插入成功后获取主键id
2022-06-22 11:08:53Mybatis插入成功后获取主键id这也是java程序员面试中一个很常见的问题,我们平时写插入语句的时候其实不太需要获取返回值,我们知道insert语句的返回值是受影响的行数,但其实更多时候我们是忽略的。
问题引出
我们现在有一个User的实体类,它有id,username,age这三个字段,id是主键。我们需要在服务端接收前端传递过来的数据将它封装成一个User对象然后插入到mysql中。实际开发中前端只可能传递给服务端username和age这两个字段,id是不会传给后台的,后台的插入语句也不会写关于主键的插入,都是使用mysql的主键递增。那问题来了,如果说我们现在有这样一个需求,
插入数据后我需要拿到插入这一行数据的主键id,将id存到redis或者发送别的什么中间件,应该怎么做,难道需要再去mysql中查一遍吗?显然太麻烦了。问题解决
我们在xml中添加useGeneratedKeys 和 keyProperty这两个字段,必须两个都加上,缺哪一个都不行!!!
并且keyProperty表示的是从数据库的主键中获取的值应该返回到java对象中的哪一个字段上,我这里写的是返回到id字段上,当然也应该这样写,如果你想返回到其他字段上也可以,改一下keyProperty后面的值就行了。
我们看下官方对着两个字段的解释
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id" parameterType="User"> insert into user(username,age) values(#{username},#{age}) </insert>
-
使用mybatis框架,新增记录时获取主键id
2020-01-07 21:13:47在使用mybatis框架时,如果数据库表的主键为自增,则意味着不需要生成主键id也能进行新增记录的操作,此时,下面方式可以获取新增记录的主键id 方式一 可以返回一个或多个字段,mysql/oracle数据库获取主键都可以...在使用mybatis框架时,如果数据库表的主键为自增,则意味着不需要生成主键id也能进行新增记录的操作,此时,下面方式可以获取新增记录的主键id
方式一
可以返回一个或多个字段,mysql/oracle数据库获取主键都可以使用。
mysql
<selectKey keyProperty="id" order="AFTER" resultType="int"> select LAST_INSERT_ID() </selectKey>
oracle
<selectKey keyProperty="id" order= "BEFORE" resultType="int"> select SEQ_ID.nextval from dual </selectKey>
keyProperty:selectKey标签中sql语句返回结果被设置的属性。如果需要返回多个列(eg:表中有多个字段自增),可以使用逗号分隔的属性名称;
order:获取主键(返回字段)与执行sql的顺序,取值为:AFTER/BEFORE。
1)、AFTER:先执行sql(插入数据),再获取主键设置keyProperty的值,mysql数据库中表字段自增使用;
2)、BEFORE:先获得主键(返回字段)设置keyProperty的值,再执行sql(插入数据),oracle数据库中表字段自增使用。
原因见结论中。
resultType:主键(返回字段)的类型,如果返回多个列,可以设置成map。
方式二
返回一个字段时使用,mysql数据库获取主键可以使用。
keyProperty="id" useGeneratedKeys="true"
useGeneratedKeys:使用JDBC的getGeneratedKeys方法获取数据库自动生成的主键。
具体示例
MybatisTest.java
package com.su.mybatis.mysql.controller; import java.io.InputStream; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import com.su.mybatis.mysql.dao.UserMapper; import com.su.mybatis.mysql.model.User; public class MybatisTest { public static void main(String[] args) { MybatisTest m = new MybatisTest(); m.getUserInfo(); } public void getUserInfo() { InputStream is = this.getClass().getClassLoader().getResourceAsStream("mybatisConfig.xml"); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is); SqlSession sqlSession = factory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User u = new User(); u.setAge(25); u.setMoney(2000); u.setName("苏"); u.setPhone("13614785236"); userMapper.insertMethod1(u); // userMapper.insertMethod2(u); sqlSession.commit(); System.out.println(u.getId()); } }
UserMapper.java
package com.su.mybatis.mysql.dao; import com.su.mybatis.mysql.model.User; public interface UserMapper { void insertMethod1(User u); void insertMethod2(User u); }
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="com.su.mybatis.mysql.dao.UserMapper" > <resultMap id="BaseResultMap" type="com.su.mybatis.mysql.model.User" > <id column="id" property="id" jdbcType="INTEGER" /> <result column="name" property="name" jdbcType="VARCHAR" /> <result column="age" property="age" jdbcType="INTEGER" /> <result column="phone" property="phone" jdbcType="CHAR" /> <result column="money" property="money" jdbcType="INTEGER" /> </resultMap> <sql id="Base_Column_List" > id, name, age, phone, money </sql> <insert id="insertMethod1" parameterType="com.su.mybatis.mysql.model.User" > <selectKey keyProperty="id" order="AFTER" resultType="int"> select LAST_INSERT_ID() </selectKey> insert into user (id, name, age, phone, money) values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER}, #{phone,jdbcType=CHAR}, #{money,jdbcType=INTEGER}) </insert> <insert id="insertMethod2" parameterType="com.su.mybatis.mysql.model.User" keyProperty="id" useGeneratedKeys="true"> insert into user (id, name, age, phone, money) values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER}, #{phone,jdbcType=CHAR}, #{money,jdbcType=INTEGER}) </insert> </mapper>
输出结果
6
user表数据
修改数据:将id为6的数据改成id为10。
使用insertMethod2方法
// userMapper.insertMethod1(u); userMapper.insertMethod2(u);
输出结果
7
user表数据
注意
上面手动该了一次主键id(id为6改成了id为10),此时,如果增加数据,当要插入的数据主键id自增到10时,会发生上面情况呢?
1)、执行几次(直到返回值为9)上面的main方法插入记录
2)、再次执行main方法,此时应该插入主键id为10的记录
控制台报错:主键重复,但是数据库user表中AUTO_INCREMENT的值还是会自增
再次执行一次main方法
输出结果
11
user表
结论
mysql中主键自增,正常情况下新增记录的主键id就是AUTO_INCREMENT的值,但是mysql会在提交时验证AUTO_INCREMENT的值是否合法(eg:唯一性),验证通过,插入数据并返回主键id,验证不通过,不插入数据,返回错误。因此,mysql只有在提交数据时才知道主键的值,所以需要先执行sql(插入数据);oracle则使用sequnce方式生成主键,需要先拿到主键的值再执行sql(插入数据),这也就是上面提到的order字段在mysql设置成AFTER,oracle设置成BEFORE的原因。
如果有写的不对的地方,请大家多多批评指正,非常感谢!
-
MyBatis 插入的同时获取主键id
2018-11-01 16:02:14有时候进行一些多步操作的时候就需要得到最新插入一条记录的id号,那么如何在插入的同时返回id号 Mapper代码: <insert id="insertFeeds" parameterType="com.yj.pojo.Feeds" ...有时候进行一些多步操作的时候就需要得到最新插入一条记录的id号,那么如何在插入的同时返回id号
Mapper代码:
<insert id="insertFeeds" parameterType="com.yj.pojo.Feeds" useGeneratedKeys="true" keyProperty="id"> insert into feeds (id, title, content, pic, video, auther_id, comments, favours, likes, cover_select, views, set_time, kind) values (#{id,jdbcType=INTEGER}, #{title,jdbcType=VARCHAR}, #{content,jdbcType=VARCHAR}, #{pic,jdbcType=VARCHAR}, #{video,jdbcType=VARCHAR}, #{autherId,jdbcType=VARCHAR}, #{comments,jdbcType=INTEGER}, #{favours,jdbcType=INTEGER}, #{likes,jdbcType=INTEGER}, #{coverSelect,jdbcType=INTEGER}, #{views,jdbcType=INTEGER}, #{setTime,jdbcType=VARCHAR}, #{kind,jdbcType=VARCHAR}) </insert>
service层:
当设置了useGeneratedKeys="true" keyProperty="id"后,它会在你插入数据库的同时,将这个对象的id值改为最新的那个id,然后我们只需要取出他就可以了
最终效果:
数据库
输出
-
JavaWeb SSM框架项目 如何实现同时多表新增并且获取主键id
2021-12-29 18:55:14我们的准备工作是有三张表,...第三步:在mappers写三个sql(这里sys_sick不一样 要使用获取主键key的属性) 这个是多表新增的关键步骤,因为其他两张表在同时新增的时候,需要sick_id 所以在第一张表新增的时候,要返 -
mybatis学习教程——获取主键ID的方法
2018-06-02 23:33:351.获取自增id的方法(1)使用mysql函数LAST_INSERT_ID(),mapper配置文件如下:<insert id="insertUser" parameterType="com.aruisi.mybatis.dto.UserDTO"> <!-- order参数... -
MybatisPlus中插入数据获取主键值示例代码
2019-04-20 23:37:33MybatisPlus中插入数据获取主键值示例代码MybatisPlus中插入数据获取主键值示例代码 -
解决使用Mybatis的insertSelective方法获取主键id为null的问题
2021-08-04 16:55:11数据库: 执行结果是: 数据库插入成功,也没有报错,但是没获取到id值 然后去检查了一下实体类,发现主键少了一个注解指定主键生成策略,GeneratedValue 就是它,我用的MySQL自增策略,加上之后,主键正常返回了。 -
MySQL获取自增主键Id
2020-02-11 16:37:52mysql和oracle插入的时候有一个很大的区别是,oracle通过获取序列的方式得到主键,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得到这个自增id的值呢? 方法1:使用last_insert_id mysql... -
Python mysql获取主键id
2018-04-25 22:41:35有这么一段需求,插入数据后,获取返回的主键id,首次可以获取到,第二次插入失败,就获取不到主键id了。其实我们可以这样实现: (一)需求: 例子: 我们将name , plat(平台)为唯一主键, 因为name 在不... -
Oracle 添加数据后获取主键ID的解决办法
2018-12-27 12:51:45Mybatis批量插入返回自增主键: 对于支持生成自增主键的数据库:useGenerateKeys和keyProperty 不支持生成自增主键的...create sequence ARCHIVES_SEQ_ID start with 1 increment by 1 minvalue 1 nomaxva... -
从mysql插入查询中获取新记录主键ID?
2021-01-28 10:03:03从mysql插入查询中获取新记录主键ID?好的,所以我可以说我在我的一个表中做了一个mysql item_id,该表的列为item_id,设置为autoincrement和primary key。如何让查询在同一查询中输出新生成的主键item_id的值?目前... -
数据库中插入一条记录后获取主键id
2014-07-07 17:54:18id="insert" keyProperty="adId" parameterType="com.zhdm.pojo.Advertise"> ...//获取插入的id resultType="java.lang.Long" order="AFTER" keyProperty="adId"> SELECT LAST_INSERT_ID() -
JDBC连接获取新增后的主键id
2022-03-12 14:58:27通常我们在mysql中新增insert一条数据之后,都需要获取添加后的主键Id(因为主键id是唯一标识这一行数据的),但是呢,又不能连续执行两个语句。虽然参考了很多博主的文章,使用了事务处理和allowMutiInsert=true属性... -
mybatis plus新增(insert)数据获取主键id问题
2020-06-10 14:06:50在我们执行insert操作的时候,往往会需要拿到新插入数据的主键id做下一步操作。 例: //新增银行卡 BankCard bankCard = new BankCard(); bankCard.setBankCardRealName(bankCardRequest.getRealName()); ... -
MyBatis获取数据库自生成的主键Id详解及实例代码
2020-09-09 17:35:11主要介绍了MyBatis获取数据库自生成的主键Id详解及实例代码的相关资料,需要的朋友可以参考下 -
mysql如何获取刚插入的主键id
2021-01-20 20:47:03首先插入一条数据INSERT into ecom_order(MemberID,GoodsTotalCounts,GoodsTotalFee,SAID,OrderTime,Status,AddTime,Remark) VALUES(1016,5,360,8,now(),1,now(),'无')使用如下查询SELECTLAST_INSERT_ID();... -
Mybatis 插入时获取主键的方式
2021-11-19 22:45:03ID 的自增长,那个机制每次都会记录最近一次新增的主键,或者是取最大值,然后在下一次进行递增处理,因此我们有获取插入的主键要么在新增之前,要么在新增之后,按照习惯我们一般喜欢在新增之后获取主键,下面来... -
Tk.MyBatis通用Mapper中获取自增主键ID,与使用uuid 做主键时获取 id
2020-11-26 20:18:101. XML方案 ... 注意: keyProperty="数据库中的主键字段名对应的实体类字段名" ;【填实体类字段名】 <insert id="insertSelective" parameterType="com.yc.Student" useGeneratedKeys="true" keyP... -
mybatis批量插入数据后,批量获取自增主键ID的示例
2020-09-12 14:08:20insert id="insertDept" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="deptId"> INSERT INTO sys_dept (parent_id, dept_name, levels, create_by, ancestors, types, create_time, ... -
mybatis注解获取插入的自增主键id
2020-09-10 10:28:54insert into user_cert(identity_no,name,auth_time,age,applet_id <if test='userAuthenticationRequestV3.phone1 !=null '> ,telephone</if><if test='userAuthenticationRequestV3.addr !=null '&... -
【MyBatis】update获取主键方式
2022-03-17 13:25:52mybatis标签提供了useGeneratedKeys="true" keyProperty="id"的方式来获取insert完成后的主键 但是对于update语句,这个方法不好用 可以用如下方法: <update id="editCategory" parameterType=... -
Mybatis 在 insert 之后想获取自增的主键 id
2021-11-16 18:05:231.在mapper.xml中:useGeneratedKeys=“true” keyProperty=“id”,这两个属性的作用: ...2. 想要获取自增主键id,应该通过对象的getId()方法,而并不是insert的返回值,insert的返回值表示的是影响行数 ... -
Mybatis Java代码中执行insert后,就能获取到主键id的配置方法
2022-01-07 14:52:05//keyColumn是指定主键用的,如果表中 <insert id="insertSelective" parameterType="com.sgy.Tag" keyProperty="id" keyColumn="id" useGeneratedKeys="true"> </insert> 主要是上面的两个:... -
Java获取自增主键ID的值 useGeneratedKeys=”true” keyProperty=”id”
2021-01-05 10:08:22Java springBoot 之获取自增主键ID的值 useGeneratedKeys=”true” keyProperty=”id” 在开发过程中,我们有时会用到自增主键的值来进行一些操作,但是当主键id是自增的情况下,添加一条记录时,其主键id是不能使用... -
mybatis插入数据时,自动获取主键的自增id
2020-07-02 10:23:45如果想获取主键自增id,除了插入记录之后再查询之外,也可以使用mybatis提供的两种方式: 一是mybatis自动生成的sql语句: <insert id="insertSelective" parameterType="cn.tencent.eee.aaa.dao.model.User">... -
解决mybatis插入获取主键id,返回值一直为1问题
2020-06-03 12:50:21xxxMapper.xml: <insert id="add" parameterType="cn.duqh.User" keyProperty="id" useGeneratedKeys="true"> ...xxx <... // 返回的主键 注:需设置id字段为主键,且设置自增长; ..