咱們在使用Mybatis做爲持久層框架的時候,有時候在執行新增業務時有時候會讓咱們獲得自增主鍵的值,這裏的話有兩種方法能夠獲得。html
表和基本的數據沿用上一篇講mybatis的緩存策略中的數據:https://www.cnblogs.com/buwei/p/10148724.html。java
在UserMapper接口值添加執行新增的方法:sql
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>
咱們在實現操做的時候選擇其中一種便可apache
而後編寫測試類:緩存
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的值,可是數據庫中的數據並不會插入,session
而後咱們是在執行插入以後使用user.getId()方法來獲取插入數據以後自動生成的主鍵的值。mybatis
咱們能夠看到的是數據庫中id值跳過了6,就是由於前一次的測試用沒有執行session.commit()方法,致使主鍵值也跳過了。app