• Mybatis插入数据时 返回主键


    单条插入(oracle)返回主键

    通常我们执行一个inser语句,即使有返回,也只是会返回影响了多少条数据

    @insert("insert into t_user (id,name) values (suser.nextval,#{item.name,jdbcType=VARCHAR})")
    void insert(@Param("item") TUser t);

    但在有些时候,我们还需要获得插入数据的主键,在oracle数据库中,主键并没有办法自动增长,无法使用insert对应的useGeneratedKeys和keyProperty属性自动返回增加的主键。

    这时我们可以使用<selectKey>标签。

    @insert("insert into t_user (id,name) values (#{item.id,jdbcType=NUMERIC},#{item.name,jdbcType=VARCHAR})")
    @SelectKey(statement="select suser.nextval from dual", keyProperty="item.id", before=true, resultType=Long.class)
    void insert(@Param("item") TUser t);

    在上面selectKey中

    before=true,表示该语句会执行在insert之前。

    statement="select suser.nextval from dual",表示我们在这里获取下一个序列值,将该值作为主键。

    resultType=Long.class,表示获取的值为long类型。

    keyProperty="item.id",表示把生成的序列值放入参数TUser中的id属性中。

    此时,在我们的参数@Param("item") TUser t中,他的id值就已经是我们所获取的最新的序列。然后程序会再执行@insert内容,将id值作为参数传递进去。

    单条插入(mysql)返回主键

    类似下面这段代码一样获取插入后的主键

    User user = new User();  
    user.setUserName("chenzhou");  
    user.setPassword("xxxx");  
    user.setComment("测试插入数据返回主键功能");  
      
    System.out.println("插入前主键为:"+user.getUserId());  
    userDao.insertAndGetId(user);//插入操作  
    System.out.println("插入后主键为:"+user.getUserId());  

    方式一:

    在实体类的映射文件 "*Mapper.xml" 这样写:

    <insert id="insertAndGetId" useGeneratedKeys="true" keyProperty="userId" parameterType="com.chenzhou.mybatis.User">
        insert into user(userName,password,comment)
        values(#{userName},#{password},#{comment})
    </insert>

    Tips:

    useGeneratedKeys="true" 表示给主键设置自增长
    keyProperty="userId"  表示将自增长后的Id赋值给实体类中的userId字段。
    parameterType="com.chenzhou.mybatis.User" 这个属性指向传递的参数实体类

    这里提醒下,<insert></insert> 中没有resultType属性,不要乱加。

    实体类中uerId 要有getter() and setter(); 方法

    如果在MySQL数据库中建表时候已经设置了字段自增长,还可以选择了第二种方式。

    第二种方式:

        <!-- 插入一个商品 -->
        <insert id="insertProduct" parameterType="domain.model.ProductBean" >
           <selectKey resultType="java.lang.Long" order="AFTER" keyProperty="productId">
              SELECT LAST_INSERT_ID()
          </selectKey>
            INSERT INTO t_product(productName,productDesrcible,merchantId)values(#{productName},#{productDesrcible},#{merchantId});
        </insert>

    Tips: 

    <insert></insert> 中没有resultType属性,但是<selectKey></selectKey> 标签是有的。

    order="AFTER" 表示先执行插入语句,之后再执行查询语句。

    可被设置为 BEFORE 或 AFTER。

    如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。

    如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素-这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用
    keyProperty="userId"  表示将自增长后的Id赋值给实体类中的userId字段。

    SELECT LAST_INSERT_ID() 表示MySQL语法中查询出刚刚插入的记录自增长Id.

    实体类中uerId 要有getter() and setter(); 方法

    多条插入(oracle)返回主键

    解决方式:采用序列生成的主键,于是在插入数据的时候,先调用一下序列获取到序列值,再赋值给主键code,最后进行批量插入操作。

    多条插入(mysql)返回主键

    dao:

    public interface UserDao{
      int insertBatch(List<UserInfo> userList);
    }

    mapper:

    <insert id="insertBatch" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="userId">
      insert into user_info
      (
        user_id,
        user_name,
        user_pwd
       )
       values 
      <foreach collection="usrList" item="item" index="index" separator=","> 
       (     
        null,
        #{item.userName,jdbcType=VARCHAR},
        #{item.userPwd,jdbcType=VARCHAR}
       ) 
       </foreach> 
     </insert>

    serviceImpl:

    public List<UserInfo> saveCheckin(List<UserInfo> userList) {
      userDao.insertCheckin(userList); //成功后对象userList里面已经包含主键user_id
      return userList;
    }

    注意

    要将mybatis升到3.3.1以上
    不要在Dao 层加@Param注解,不然会被报如下错误

    报错:Parameter '你的@Param参数' not found. Available parameters are [list]

  • 相关阅读:
    Android studio关于点击事件后的页面跳转,选择完成后返回(onActivityResult)
    关于Android对话框简单实用方法总结
    Eclipse键盘输出文字,显示到屏幕上方法
    indexOf实际试用方法
    LiteOS裸机驱动移植01-以LED为例说明驱动移植
    LiteOS内核教程06-内存管理
    LiteOS内核教程05-互斥锁
    LiteOS内核教程04-信号量
    LiteOS内核教程03-任务管理
    LiteOS内核教程02-HelloWorld
  • 原文地址:https://www.cnblogs.com/linhongwenBlog/p/12885889.html
Copyright © 2020-2023  润新知