<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.jv.dao.EmployeeMapper"> <!-- 若是參數只有一個,在映射文件中使用${**},好比${id},若是有多個參數能夠採用多參數或者POJO方式來傳遞,詳細內容見 https://my.oschina.net/u/3049601/blog/edit --> <select id="getEmployeeById" resultType="employee" databaseId="mysql"> select employee_id,first_name,last_name,gendor,birthday from employee where employee_id=#{id} </select> <select id="getEmployeeById" resultType="employee" databaseId="oracle"> select employee_id,first_name,last_name,gendor,birthday from employee where employee_id=#{id} </select> <!-- 注意:必定要在全局配置文件中切換environments的默認environment爲dev_mysql --> <!-- 由於Mysql支持主鍵自增,因此使用useGeneratedKeys+keyProperty兩個屬性能夠在程序得到自增值,其內部原理就是經過Statement.getGeneratedKeys獲得 useGeneratedKeys:默認值即爲true keyProperty:指定javabean的主鍵對應的屬性名稱 --> <insert id="addEmployee" useGeneratedKeys="true" keyProperty="employeeId" databaseId="mysql"> <!-- 由於主鍵是自增的,因此不須要寫ID的插入語句 --> insert into employee (first_name,last_name,gendor,birthday) values(#{firstName},#{lastName},#{gendor},#{birthday}) </insert> <!-- 由於Oracle不支持自增屬性,解決方式是使用序列,所以須要得到插入記錄的主鍵須要經過另外的方式 <selectKey>:指定得到主鍵的SQL keyProperty:指定javabean的主鍵對應的屬性名稱 order:有BEFORE和AFTER兩種取值,建議都是BEFORE,由於使用AFTER可能會出現問題,這裏也就不針對AFTER作代碼演示了 resultType:javabean屬性類型 --> <insert id="addEmployee" databaseId="oracle"> <selectKey databaseId="oracle" keyProperty="employeeId" order="BEFORE" resultType="Integer"> <!-- 若是<selectKey>的order屬性是BEFORE,那麼取序列就必須是xxx_seq.nextval,若是是AFTER,則是xxx_seq.currval --> select EMPLOYEE_ID_SEQ.nextval from dual </selectKey> <!-- 由於主鍵不是自增的,須要在得到主鍵值並設置給JAVABEAN對象後從對象中獲取並插入,所以須要些主鍵插入SQL --> insert into employee (employee_id,first_name,last_name,gendor,birthday) values(#{employeeId},#{firstName},#{lastName},#{gendor},#{birthday}) </insert> <!-- 由於更新操做和數據庫沒什麼差異,因此再也不指定datebaseId屬性 --> <update id="updateEmployee"> update employee set first_name=#{firstName} where employee_id=#{employeeId} </update> <!-- 由於更新操做和數據庫沒什麼差異,因此再也不指定datebaseId屬性 --> <delete id="deleteEmployee" ></delete> </mapper>
Mybatis參數傳遞和取值詳情:java
單個參數:Mybatis不會作特殊處理, #{參數名/任意名}:取出參數值。
多個參數:mybatis會作特殊處理。
1.多個參數會被封裝成 一個map,
封裝:mysql
key:paramName1...paramNameN,或者參數的索引也能夠
value:傳入的參數值
取值:sql
#{paramName}就是從map中獲取指定的key的值;
操做:
方法:public Employee getEmpByIdAndLastName(Integer id,String lastName);
取值:#{id},#{lastName}數據庫
2.形參了表有多個參數apache
public Employee getEmpByIdAndLastName(Integer id,String lastName);數組
錯誤的取值方式:#{id},#{lastName}mybatis
Mybatis會報以下錯誤:oracle
org.apache.ibatis.binding.BindingException:
Parameter 'id' not found.
Available parameters are [1, 0, param1, param2app
正確的取值方式1:#{param1},#{param2}spa
正確的取值方式1:使用命名參數方式
明確指定封裝參數時map的key;@Param("id"),如:
public Employee getEmpByIdAndLastName(@Param("id")Integer id,
@Param("lastName")String lastName);
多個參數會被封裝成 一個map,
key:使用@Param註解指定的值
value:參數值
使用#{指定的key}取出對應的參數值,如:${lastName}
3.POJO:
若是多個參數正好是咱們業務邏輯的數據模型,咱們就能夠直接傳入pojo;
#{屬性名}:取出傳入的pojo的屬性值
4.Map:
若是多個參數不是業務模型中的數據,沒有對應的pojo,不常常使用,爲了方便,咱們也能夠傳入map
#{key}:取出map中對應的值
5.TO:
若是多個參數不是業務模型中的數據,可是常常要使用,推薦來編寫一個TO(Transfer Object)數據傳輸對象
Page{
int index;
int size;
}
========================思考========================
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}
特別注意:若是是Collection(List、Set)類型或者是數組,也會特殊處理。也是把傳入的list或者數組封裝在map中。
Collection:${collection[index]}
List:${list[index]}
數組:${array[index]}