1. 程式人生 > >mybatis系列之XML對映檔案

mybatis系列之XML對映檔案

一、XML對映檔案

1.1 Mybatis的增刪改操作

mybatis允許增刪改直接定義以下型別返回值

Integer、Long、Boolean、void

1.2 sqlsession

sqlSessionFactory.openSession(); 獲取的session需要手動提交程式碼 sqlSessionFactory.openSession(true);會自動提交

public void test() throws IOException{		
	SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
	//獲取到的SqlSession不會自動提交資料
SqlSession openSession = sqlSessionFactory.openSession(); try{ EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class); Employee employee = new Employee(null, "jerry4",null, "1"); mapper.addEmp(employee); openSession.commit(); }finally{ openSession.close(); } }

1.3 獲取自增主鍵

<insert
  id="insertAuthor"
  parameterType="domain.blog.Author"
  flushCache="true"
  statementType="PREPARED"
  keyProperty=""
  keyColumn=""
  useGeneratedKeys=""
  timeout="20">

useGeneratedKeys(僅對 insert 和 update 有用)這會令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法來取出由資料庫內部生成的主鍵(比如:像 MySQL 和 SQL Server 這樣的關係資料庫管理系統的自動遞增欄位),預設值:false

(useGeneratedKeys="true keyProperty=“id”)

<insert id="insertAuthor" useGeneratedKeys="true"
    keyProperty="id">
  insert into Author (username,password,email,bio)
  values (#{username},#{password},#{email},#{bio})
</insert>

對於不支援自動生成型別的資料庫或可能不支援自動生成主鍵的 JDBC 驅動,MyBatis 有另外一種方法來生成主鍵

	<!-- 
	獲取非自增主鍵的值:
		Oracle不支援自增;Oracle使用序列來模擬自增;
		每次插入的資料的主鍵是從序列中拿到的值;如何獲取到這個值;
	 -->
	<insert id="addEmp" databaseId="oracle">
		<!-- 
		keyProperty:查出的主鍵值封裝給javaBean的哪個屬性
		order="BEFORE":當前sql在插入sql之前執行
			   AFTER:當前sql在插入sql之後執行
		resultType:查出的資料的返回值型別
		
		BEFORE執行順序:
			先執行selectKey查詢id的sql;查出id值封裝給javaBean的id屬性
			在執行插入的sql;就可以取出id屬性對應的值
		AFTER執行順序:
			先執行插入的sql(從序列中取出新值作為id);
			再執行selectKey查詢id的sql;
		 -->
		<selectKey keyProperty="id" order="BEFORE" resultType="Integer">
			<!-- 編寫查詢主鍵的sql語句 -->
			<!-- BEFORE-->
			select EMPLOYEES_SEQ.nextval from dual 
			<!-- AFTER:
			 select EMPLOYEES_SEQ.currval from dual -->
		</selectKey>
		
		<!-- 插入時的主鍵是從序列中拿到的 -->
		<!-- BEFORE:-->
		insert into employees(EMPLOYEE_ID,LAST_NAME,EMAIL) 
		values(#{id},#{lastName},#{email<!-- ,jdbcType=NULL -->}) 
		<!-- AFTER:
		insert into employees(EMPLOYEE_ID,LAST_NAME,EMAIL) 
		values(employees_seq.nextval,#{lastName},#{email}) -->
	</insert>

二、引數設定

2.1 單個引數:mybatis不會做特殊處理,

可以接受基本型別,物件型別,集合型別的值。這種情況 MyBatis可直接使用這個引數,不需要經過任何處理

#{引數名/任意名}:取出引數值。

2.2 多個引數:mybatis會做特殊處理。

任意多個引數,都會被MyBatis重新包裝成一個Map傳入。 Map的key是param1,param2,0,1…,值就是引數的值。

2.3 命名引數

為引數使用@Param起一個名字,MyBatis就會將這些引數封 裝進map中,key就是我們自己指定的名字

2.4 POJO:

如果多個引數正好是我們業務邏輯的資料模型,我們就可以直接傳入pojo; #{屬性名}:取出傳入的pojo的屬性值

2.5 Map:

如果多個引數不是業務模型中的資料,沒有對應的pojo,不經常使用,為了方便,我們也可以傳入map #{key}:取出map中對應的值

2.6 TO:

如果多個引數不是業務模型中的資料,但是經常要使用,推薦來編寫一個TO(Transfer Object)資料傳輸物件

Page{
	int index;
	int size;
}

2.7 練習

public Employee getEmp(@Param("id")Integer id,String lastName);
	取值:id==>#{id/param1}   lastName==>#{param2}

public Employee getEmp(Integer id,@Param("e")Employee emp);
	取值:id==>#{param1}    lastName===>#{param2.lastName/e.lastName}

2.8 特別注意:如果是Collection(List、Set)型別或者是陣列

會特殊處理,也是把傳入的list或者陣列封裝在map中。 key:Collection(collection),如果是List還可以使用這個key(list);陣列(array)

public Employee getEmpById(List<Integer> ids);
//取值:取出第一個id的值:   #{list[0]}