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]}