為什么要在插入數據后獲取主鍵:當有一個訂單表和訂單詳情表,當插入訂單表的數據后,需要在訂單詳情表插入該訂單的具體購物情況,訂單詳情表需要的一個列是訂單表的主鍵或者訂單ID。(通俗講:A表的主鍵是B表的外鍵,當向A表添加數據后需要在B表對A表做補充說明,B表的外鍵列就從A表的主鍵獲取)
1.創建實體類com.entity.Dept(DeptId和DeptName)和com.dao.DeptDao(有方法Integer insert(Dept dept)),這里寫的是Dept類,要用到反射的,和后面的deptMapper.xml代碼有關
2.在dao模塊的resources中創建deptMapper.xml文件,當然,要先在mabatis-config.xml中添加<Mapper resource="deptMapper.xml"></Mapper>
方法一:在deptMapper.xml文件中,
<mapper namespace="com.dao.DeptDao">//命名空間和DeptDao類的全稱一樣
<insert id="insert" keyProperty="deptId" useGeneratedKeys="true">//deptId是Dept類的字段
insert into dept(dept_name) values (#{deptName})//#{deptName}中的deptName是和Dept類的字段一樣
</insert>
</mapper>
java代碼:
public class DeptDaoImpl implements DeptDao{
public int insert(Dept dept) {
DeptDao deptDao = MapperFactory.generateMapper(DeptDao.class);
deptDao.insert(dept);
return dept.getDeptId();
}
}
public class DeptDaoImplTest {
@Test
public void testInsertKey() {
Dept dept = new Dept();
dept.setDeptName("動漫");
int insert = new DeptDaoImpl().insert(dept);
System.out.println(insert);
}
}
方法二:利用<insert>和<selectKey>結合使用:
deptMapper.xml文件內容:
<mapper namespace="com.dao.DeptDao">
<insert id="insert" >
<selectKey resultType="integer" order="AFTER" keyProperty="deptId">
select last_insert_id();//Mysql的函數,獲取最后插入的
</selectKey>
insert into dept(dept_name) values (#{deptName})
</insert>
</mapper>
方法三:order="BEFORE"
<mapper namespace="com.dao.DeptDao">
<insert id="insert">
<selectKey keyProperty="deptId" order="BEFORE" resultType="integer">
select 88 // 自己直接設置dept_id
</selectKey>
insert into dept(dept_id,dept_name) values (#{deptId},#{deptName})
</insert>
</mapper>
總結:方法二較之方法一的好處是即使要獲取的不是主鍵也可以。Java部分代碼不需要改變,只需要改變xml文件
