精华内容
下载资源
问答
  • 获取主键id
    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新增数据后可以很... // 获取数据库写入数据的主键 }else{ exit($Model->getError()); } 如果你的数据表主键是自动增长型的,那么add方法成功后的返回值就是该数据的主键值。无需额外获取。 以上这篇T
  • Mybatis插入成功后获取主键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也能进行新增记录的操作,此时,下面方式可以获取新增记录的主键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代码: &lt;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,然后我们只需要取出他就可以了

     

    最终效果:

    数据库

    输出

    展开全文
  • 我们的准备工作是有三张表,...第三步:在mappers写三个sql(这里sys_sick不一样 要使用获取主键key的属性) 这个是多表新增的关键步骤,因为其他两张表在同时新增的时候,需要sick_id 所以在第一张表新增的时候,要返
  • 1.获取自增id的方法(1)使用mysql函数LAST_INSERT_ID(),mapper配置文件如下:&lt;insert id="insertUser" parameterType="com.aruisi.mybatis.dto.UserDTO"&gt; &lt;!-- order参数...
  • MybatisPlus中插入数据获取主键值示例代码MybatisPlus中插入数据获取主键值示例代码
  • 数据库: 执行结果是: 数据库插入成功,也没有报错,但是没获取id值 然后去检查了一下实体类,发现主键少了一个注解指定主键生成策略,GeneratedValue 就是它,我用的MySQL自增策略,加上之后,主键正常返回了。
  • MySQL获取自增主键Id

    千次阅读 2020-02-11 16:37:52
    mysql和oracle插入的时候有一个很大的区别是,oracle通过获取序列的方式得到主键,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得到这个自增id的值呢? 方法1:使用last_insert_id mysql...
  • Python mysql获取主键id

    千次阅读 2018-04-25 22:41:35
    有这么一段需求,插入数据后,获取返回的主键id,首次可以获取到,第二次插入失败,就获取不到主键id了。其实我们可以这样实现: (一)需求: 例子: 我们将name , plat(平台)为唯一主键, 因为name 在不...
  • Mybatis批量插入返回自增主键: 对于支持生成自增主键的数据库:useGenerateKeys和keyProperty 不支持生成自增主键的...create sequence ARCHIVES_SEQ_ID start with 1 increment by 1 minvalue 1 nomaxva...
  • 从mysql插入查询中获取新记录主键ID?好的,所以我可以说我在我的一个表中做了一个mysql item_id,该表的列为item_id,设置为autoincrement和primary key。如何让查询在同一查询中输出新生成的主键item_id的值?目前...
  • 数据库中插入一条记录后获取主键id

    千次阅读 2014-07-07 17:54:18
     id="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属性...
  • 在我们执行insert操作的时候,往往会需要拿到新插入数据的主键id做下一步操作。 例: //新增银行卡 BankCard bankCard = new BankCard(); bankCard.setBankCardRealName(bankCardRequest.getRealName()); ...
  • 主要介绍了MyBatis获取数据库自生成的主键Id详解及实例代码的相关资料,需要的朋友可以参考下
  • 首先插入一条数据INSERT into ecom_order(MemberID,GoodsTotalCounts,GoodsTotalFee,SAID,OrderTime,Status,AddTime,Remark) VALUES(1016,5,360,8,now(),1,now(),'无')使用如下查询SELECTLAST_INSERT_ID();...
  • ID 的自增长,那个机制每次都会记录最近一次新增的主键,或者是取最大值,然后在下一次进行递增处理,因此我们有获取插入的主键要么在新增之前,要么在新增之后,按照习惯我们一般喜欢在新增之后获取主键,下面来...
  • 1. XML方案 ... 注意: keyProperty="数据库中的主键字段名对应的实体类字段名" ;【填实体类字段名】 <insert id="insertSelective" parameterType="com.yc.Student" useGeneratedKeys="true" keyP...
  • insert 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, ...
  • insert into user_cert(identity_no,name,auth_time,age,applet_id <if test='userAuthenticationRequestV3.phone1 !=null '> ,telephone</if><if test='userAuthenticationRequestV3.addr !=null '&...
  • mybatis标签提供了useGeneratedKeys="true" keyProperty="id"的方式来获取insert完成后的主键 但是对于update语句,这个方法不好用 可以用如下方法: <update id="editCategory" parameterType=...
  • 1.在mapper.xml中:useGeneratedKeys=“true” keyProperty=“id”,这两个属性的作用: ...2. 想要获取自增主键id,应该通过对象的getId()方法,而并不是insert的返回值,insert的返回值表示的是影响行数 ...
  • //keyColumn是指定主键用的,如果表中 <insert id="insertSelective" parameterType="com.sgy.Tag" keyProperty="id" keyColumn="id" useGeneratedKeys="true"> </insert> 主要是上面的两个:...
  • Java springBoot 之获取自增主键ID的值 useGeneratedKeys=”true” keyProperty=”id” 在开发过程中,我们有时会用到自增主键的值来进行一些操作,但是当主键id是自增的情况下,添加一条记录时,其主键id是不能使用...
  • 如果想获取主键自增id,除了插入记录之后再查询之外,也可以使用mybatis提供的两种方式: 一是mybatis自动生成的sql语句: <insert id="insertSelective" parameterType="cn.tencent.eee.aaa.dao.model.User">...
  • xxxMapper.xml: <insert id="add" parameterType="cn.duqh.User" keyProperty="id" useGeneratedKeys="true"> ...xxx <... // 返回的主键 注:需设置id字段为主键,且设置自增长; ..

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 210,472
精华内容 84,188
关键字:

获取主键id