• mysql 获取自增id的值的方法


    原生jdbc方式:

    Statement.getGeneratedKeys()

    示例:

    Statement stmt = null;
    ResultSet rs = null;
    
    try {
    
        //
        // Create a Statement instance that we can use for
        // 'normal' result sets assuming you have a
        // Connection 'conn' to a MySQL database already
        // available
    
        stmt = conn.createStatement();
    
        //
        // Issue the DDL queries for the table for this example
        //
    
        stmt.executeUpdate("DROP TABLE IF EXISTS autoIncTutorial");
        stmt.executeUpdate(
                "CREATE TABLE autoIncTutorial ("
                + "priKey INT NOT NULL AUTO_INCREMENT, "
                + "dataField VARCHAR(64), PRIMARY KEY (priKey))");
    
        //
        // Insert one row that will generate an AUTO INCREMENT
        // key in the 'priKey' field
        //
    
        stmt.executeUpdate(
                "INSERT INTO autoIncTutorial (dataField) "
                + "values ('Can I Get the Auto Increment Field?')",
                Statement.RETURN_GENERATED_KEYS);
    
        //
        // Example of using Statement.getGeneratedKeys()
        // to retrieve the value of an auto-increment
        // value
        //
    
        int autoIncKeyFromApi = -1;
    
        rs = stmt.getGeneratedKeys();
    
        if (rs.next()) {
            autoIncKeyFromApi = rs.getInt(1);
        } else {
    
            // throw an exception from here
        }
    
        System.out.println("Key returned from getGeneratedKeys():"
            + autoIncKeyFromApi);
    } finally {
    
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException ex) {
                // ignore
            }
        }
    
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException ex) {
                // ignore
            }
        }
    }

    也有使用SELECT LAST_INSERT_ID() 注意:并发可能会出现问题。示例:

    Statement stmt = null;
    ResultSet rs = null;
    
    try {
    
        //
        // Create a Statement instance that we can use for
        // 'normal' result sets.
    
        stmt = conn.createStatement();
    
        //
        // Issue the DDL queries for the table for this example
        //
    
        stmt.executeUpdate("DROP TABLE IF EXISTS autoIncTutorial");
        stmt.executeUpdate(
                "CREATE TABLE autoIncTutorial ("
                + "priKey INT NOT NULL AUTO_INCREMENT, "
                + "dataField VARCHAR(64), PRIMARY KEY (priKey))");
    
        //
        // Insert one row that will generate an AUTO INCREMENT
        // key in the 'priKey' field
        //
    
        stmt.executeUpdate(
                "INSERT INTO autoIncTutorial (dataField) "
                + "values ('Can I Get the Auto Increment Field?')");
    
        //
        // Use the MySQL LAST_INSERT_ID()
        // function to do the same thing as getGeneratedKeys()
        //
    
        int autoIncKeyFromFunc = -1;
        rs = stmt.executeQuery("SELECT LAST_INSERT_ID()");
    
        if (rs.next()) {
            autoIncKeyFromFunc = rs.getInt(1);
        } else {
            // throw an exception from here
        }
    
        System.out.println("Key returned from " +
                           "'SELECT LAST_INSERT_ID()': " +
                           autoIncKeyFromFunc);
    
    } finally {
    
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException ex) {
                // ignore
            }
        }
    
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException ex) {
                // ignore
            }
        }
    }

    mybatis封装后的配置如下:

    <insert id="insert" parameterType="Post" useGeneratedKeys="true" keyProperty="id">

    调用

    postDao.add(post);

    和以前一样结果后返回1,使用post.getId()可以获取到自增的id。

    参考文献:

    【1】http://dev.mysql.com/doc/connector-j/en/connector-j-usagenotes-last-insert-id.html

    【2】http://stackoverflow.com/questions/12241260/get-auto-genearated-key-for-the-inserted-record-in-mybatis

  • 相关阅读:
    ZygoteInit 相关分析
    Zygote(app_process)相关分析2
    Zygote(app_process)相关分析1
    android Init 相关分析
    简明Python教程(A Byte of Python中文版)
    鸟哥的linux私房菜——第5章 首次登陆与在线求助man page
    Cmake实践(Cmake Practice)第二部分
    Cmake实践(Cmake Practice)第一部分
    鸟哥的linux私房菜——第3章 主机规划与磁盘分区
    鸟哥的linux私房菜——第1章 Linux是什么
  • 原文地址:https://www.cnblogs.com/davidwang456/p/4836327.html
Copyright © 2020-2023  润新知