很多時候,我們都需要在插入一條數據后回過頭來獲取到這條數據在數據表中的自增主鍵,便於后續操作。針對這個問題,有兩種解決方案:
- 先插入,后查詢。我們可以先插入一條數據,然后根據插入的數據的各個字段值,再次訪問數據庫,從數據庫中將剛剛插入的數據查詢出來。當然,這種方法是很笨的,不提倡使用。
- MyBatis為我們提供了一種在插入數據后獲取自增主鍵的方式,通過這種方式,我們可以在插入一條數據之后直接從插入的POJO對象中取出id即可。這種方式簡單且效率高、節省代碼量,因此提倡使用。
Mapper.xml文件中的代碼如下:
<mapper namespace="testuser"> <insert id="insertUser" parameterType="com.itgungnir.hellomybatis.bean.User"> <!-- 將插入數據的主鍵返回,返回到User對象中 --> <!-- keyProperty:將查詢到的主鍵值設置到parameterType對象的哪個屬性中 --> <!-- order:SELECT LAST_INSERT_ID()語句的執行順序(相對於insert語句來說的執行順序) --> <!-- resultType:指定SELECT LAST_INSERT_ID()語句的結果類型 --> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> <!-- SELECT LAST_INSERT_ID():得到剛insert到數據表中的記錄的主鍵值,只適用於自增主鍵 --> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO user(name) VALUES(#{name}) </insert> </mapper>
測試代碼中這樣寫:
public void insertUser(){ SqlSession session = null; try { // MyBatis配置文件 String resource = "SqlMapConfig.xml"; // 得到配置文件流 InputStream is = Resources.getResourceAsStream(resource); // 創建會話工廠,傳入MyBatis配置文件的信息 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is); // 通過工廠得到SqlSession session = factory.openSession(); // 要添加到數據庫中的作為參數的員工對象 User user = new User(); user.setName("111111"); // 通過SqlSession操作數據庫,查詢結果是與映射文件中的resultType相匹配的數據類型 // 第一個參數:映射文件中Statement的id,等於namespace+"."+statementid // 第二個參數:指定和映射文件中的SQL語句匹配的parameter type類型的參數 session.insert("testuser.insertUser", user); // 提交事務 session.commit(); // 打印主鍵 System.out.println(user.getId()); } catch (IOException e) { e.printStackTrace(); } finally { // 釋放資源(會話資源) if (session != null) { session.close(); } } }