mybatis插入insert操作,返回自增id


通過map插入

controller

@GetMapping("insertOrder")
public String insertOrder(String params) {
    RegCheck.isNull(params);
    String[] arr = params.split("@");
    //訂單號@備注1@備注2@備注3@備注4@備注5@備注6
    if (arr.length != 7) {
        throw new ServiceException(ResultEnum.LOSTPARAMS);
    }
    Map<String, Object> map = Maps.newHashMap();
    map.put("ticket", arr[0]);
    map.put("remark1", arr[1]);
    map.put("remark2", arr[2]);
    map.put("remark3", arr[3]);
    map.put("remark4", arr[4]);
    map.put("remark5", arr[5]);
    map.put("remark6", arr[6]);
    String id = orderService.insertOrder(map);
    return id;
}

serviceImpl

@Override
public String insertOrder(Map<String, Object> map) {
    int num = orderMapper.insertOrder(map);
    if (num != 1) {
        throw new ServiceException(1000, "插入數據失敗!");
    }
    return map.get("ticket").toString();
}

通過插入操作,插入返回的自增id寫入到ticket這個key得value中,為什么寫在ticket這個key中,是xml文件中配置的

service

String insertOrder(Map<String, Object> map);

mapper

int insertOrder(Map<String, Object> map);

此時返回的int值,插入成功返回1

xml

<insert id="insertOrder" useGeneratedKeys="true" keyProperty="ticket">
    insert into order_order_record
    (id,ticket,remark1,remark2,remark3,remark4,remark5,remark6,create_time)
    values
    (null,#{ticket},#{remark1},#{remark2},#{remark3},#{remark4},#{remark5},#{remark6},now())
</insert>

此時自增主鍵返回到map中ticket這個key中

Mybatis 配置文件 useGeneratedKeys 參數只針對 insert 語句生效,默認為 false。當設置為 true 時,表示如果插入的表以自增列為主鍵,則允許 JDBC 支持自動生成主鍵,並可將自動生成的主鍵返回。

keyColumn:數據庫表中的自增字段名。

keyProperty:數據庫自增字段在pojo中的對應屬性或者對應的map中的key

通過實體類插入

controller

@GetMapping("insertOrders")
public int insertOrders(String params) {
    RegCheck.isNull(params);
    String[] arr = params.split("@");
    //訂單號@備注1@備注2@備注3@備注4@備注5@備注6
    if (arr.length != 7) {
        throw new ServiceException(ResultEnum.LOSTPARAMS);
    }
    Order order = new Order();
    order.setTicket(arr[0]);
    order.setRemark1(arr[1]);
    order.setRemark2(arr[2]);
    order.setRemark3(arr[3]);
    order.setRemark4(arr[4]);
    order.setRemark5(arr[5]);
    order.setRemark6(arr[6]);
    int id = orderService.insertOrders(order);
    return id;
}

Order

@Data
public class Order {
    public int id;
    public String ticket;
    public String remark1;
    public String remark2;
    public String remark3;
    public String remark4;
    public String remark5;
    public String remark6;
    public Date createTime;
}

serviceImpl

@Override
public int insertOrders(Order order) {
    int num = orderMapper.insertOrders(order);
    if (num != 1) {
        throw new ServiceException(1002, "插入數據失敗!");
    }
    return order.getId();
}

service

int insertOrders(Order order);

mapper

int insertOrders(Order order);

xml

<insert id="insertOrders" useGeneratedKeys="true" keyProperty="id">
    insert into order_order_record
    (id,ticket,remark1,remark2,remark3,remark4,remark5,remark6,create_time)
    values
    (null,#{ticket},#{remark1},#{remark2},#{remark3},#{remark4},#{remark5},#{remark6},now())
</insert>

此時自增主鍵返回到Order的id字段中,serviceImpl通過獲取id可以獲得最新插入的id

selectKey

<insert id="insert">
 <selectKey keyProperty="id" resultType="int" order="BEFORE">
  <if test="_databaseId == 'oracle'">
   select seq_users.nextval from dual
  </if>
  <if test="_databaseId == 'db2'">
   select nextval for seq_users from sysibm.sysdummy1"
  </if>
 </selectKey>
 insert into users values (#{id}, #{name})
</insert>

order屬性可以控制

selectKey在插入操作前或者操作后獲取key值,做為字段插入或返回字段。(此段代碼獲取的序列值id作為字段值插入到users表中)

<selectKey keyProperty="id" resultType="int" order="AFTER">
        select LAST_INSERT_ID()
</selectKey>

如果數據庫支持自增長主鍵字段(比如mysql、sql server)設置useGeneratedKeys=”true”和keyProperty,這樣就可以插入主鍵id值
oracle則不支持自增長id,設置useGeneratedKey=”false”,如果設置true則會有報錯信息。通過nextval函數,如SEQ_table.Nextval生成id

插入更新一條數據時,可以使用selectKey獲取id操作。當做多條數據插入更新時,而selectKey只能使用一次,此時應該使用useGeneratedKeys操作。

站在巨人的肩膀上摘蘋果:

原文鏈接:https://blog.csdn.net/qq_33488642/article/details/82189742


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM