為什么要在插入數據后獲取主鍵:當有一個訂單表和訂單詳情表,當插入訂單表的數據后,需要在訂單詳情表插入該訂單的具體購物情況,訂單詳情表需要的一個列是訂單表的主鍵或者訂單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文件