写在前面:
我们在使用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()方法,导致主键值也跳过了。