MyBatis总结(十二)--获取非自增主键的值

 

本文内容来自尚硅谷

代码从MyBatis总结(十一)--增加一条数据时,如何获取自动设置主键的id值

获取非自增主键值两种方式

 

方式一:在执行insert语句前查询出序列

映射文件如下写法

	
	
		
		
			select EMPLOYEES_SEQ.nextval from dual 
		
		insert into employees(EMPLOYEE_ID,LAST_NAME,EMAIL) 
		values(#{id},#{lastName},#{email}) 
	

说明一:databaseId=oracle:表示在oracle数据库时使用。此时在mybatis配置文件中已经配置了各个数据库厂商的别名 

	
		
		
		
		
	

说明二:selectKey标签中order=before表示再执行insert语句前就先执行该查询语句,查询出下一个序列

说明三:keyProperty:查出的主键值封装给javaBean的哪个属性

 

获取到主键值

	public void test03() throws IOException{
		
		SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
		//1、获取到的SqlSession不会自动提交数据
		SqlSession openSession = sqlSessionFactory.openSession();
		
		try{
			EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
			//测试添加
			Employee employee = new Employee(null, "jerry4",null, "1");
			mapper.addEmp(employee);
			System.out.println(employee.getId());
			openSession.commit();
		}finally{
			openSession.close();
		}
		
	}

方式二:在执行insert语句后再查询出序列

映射文件方式如下

	
		
			 select EMPLOYEES_SEQ.currval from dual
		

		insert into employees(EMPLOYEE_ID,LAST_NAME,EMAIL) 
		values(employees_seq.nextval,#{lastName},#{email})
	

 

说明一:这里的selectkey执行的查询语句与方式二不一样的放,order值为after,且获取的是当前序列值而不是nextval值

说明二:insert语句插入序列值,不再是#{id}而是直接employees_seq.nextval

 

 

这里建议使用方式一来获取非自增主键的值:因为在高并发的情况下,使用方式二很容易获取到的di值都是一样的

 

 

你可能感兴趣的:(MyBatis总结)