寫在前面:
我們在使用Mybatis作為持久層框架的時候,有時候在執行新增業務時有時候會讓我們得到自增主鍵的值,這里的話有兩種方法可以得到。
表和基本的數據沿用上一篇講mybatis的緩存策略中的數據:https://www.cnblogs.com/buwei/p/10148724.html。
在UserMapper接口值添加執行新增的方法:
1 /** 2 * 增加一個 3 * @param user 增加的對象 4 */ 5 void saveOne(User user);
要想獲取插入后表中數據的生成主鍵的值,主要的配置在UserMapper.xml中,有兩種配置都可以實現我們需要的需求,如下:
1 <!--增加一個用戶並返回主鍵id--> 2 <insert id="saveOne" parameterType="com.buwei.entity.User" > 3 INSERT into user(name, password) value(#{name},#{password}) 4 <selectKey keyProperty="id" order="AFTER" resultType="int"> 5 select last_insert_id() 6 </selectKey> 7 </insert> 8 9 <insert id="saveOne" parameterType="com.buwei.entity.User" useGeneratedKeys="true" keyProperty="id"> 10 INSERT into user(name, password) value(#{name},#{password}) 11 </insert>
我們在實現操作的時候選擇其中一種即可
然后編寫測試類:
1 package com.buwei.test; 2 3 import com.buwei.entity.User; 4 import com.buwei.mapper.UserMapper; 5 import org.apache.ibatis.io.Resources; 6 import org.apache.ibatis.session.SqlSession; 7 import org.apache.ibatis.session.SqlSessionFactory; 8 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 9 10 import java.io.IOException; 11 import java.io.InputStream; 12 import java.util.List; 13 14 /** 15 * @author buwei 16 * @date 2018/12/22 14:33 17 */ 18 public class MybatisGetIdTest { 19 20 public static void main(String[] args) throws IOException { 21 // 1.讀取配置文件 22 InputStream in= Resources.getResourceAsStream("SqlMapConfig.xml"); 23 // 2.創建sqlSessionFactory的構建者對象 24 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); 25 // 3.使用構建者創建工廠對象SQLSessionFactory 26 SqlSessionFactory factory = builder.build(in); 27 // 4.使用SQLSessionFactory生產SQLSession 28 SqlSession session = factory.openSession(); 29 // 5.使用session創建mapper的代理對象 30 UserMapper userMapper = session.getMapper(UserMapper.class); 31 // 6使用代理對象執行插入一個對象的方法 32 User user = new User(); 33 user.setName("test01"); 34 user.setPassword("123456"); 35 userMapper.saveOne(user); 36 // 7.獲取插入后自增主鍵的值 37 int id = user.getId(); 38 System.out.println("插入的user對象的id值為"+id); 39 40 session.commit(); 41 // 7.釋放資源 42 session.close(); 43 in.close(); 44 } 45 }
這里我們需要注意的是在執行插入等修改數據庫中數據的時候一定要執行commit()方法,否則,雖然控制台也能打印出id的值,但是數據庫中的數據並不會插入,
然后我們是在執行插入之后使用user.getId()方法來獲取插入數據之后自動生成的主鍵的值。
我們可以看到的是數據庫中id值跳過了6,就是因為前一次的測試用沒有執行session.commit()方法,導致主鍵值也跳過了。