Mybatis_映射文件配置
獲取自增主鍵的值
若數據庫支持自動生成主鍵的字段(比如 MySQL 和 SQL Server),則可以設置 useGeneratedKeys=”true”,然後再把 keyProperty 設置到目標屬性上。
<insert id="addEmp" useGeneratedKeys="true" keyProperty="id"> insert into tbl_employee (last_name,email,gender) VALUES (#{lastName},#{email},#{gender})</insert>
sql語句執行完成後,Mybatis會把插入生成的主鍵封裝到該bean對象中。
//測試添加 Employee employee = new Employee("[email protected]", "0", null, "tom"); mapper.addEmp(employee); System.out.print(employee.getId());
參數處理
①.單個參數:mybatis不會做特殊處理,#{參數名/任意名}:取出參數值。
②.多個參數:mybatis會做特殊處理。多個參數會被封裝成 一個map
key:param1...paramN,或者參數的索引也可以
value:傳入的參數值
#{}就是從map中獲取指定的key的值;
操作:
方法:public Employee getEmpByIdAndLastName(Integer id,String lastName);
取值:#{id},#{lastName}
異常:
org.apache.ibatis.binding.BindingException: Parameter ‘id‘ not found. Available parameters are [1, 0, param1, param2]
正確的取值方式:
<select id="getEmpByIdAndLastName" resultType="com.nuch.edu.domain.Employee"> SELECT * FROM tbl_employee WHERE id=#{param1} and last_name=#{param2} </select>
③.【命名參數】:明確指定封裝參數時map的key
import org.apache.ibatis.annotations.Param;
public Employee getEmpByIdAndLastName(@Param("id")Integer id,@Param("lastName")String lastName);
多個參數會被封裝成 一個map
key:使用@Param註解指定的值
value:參數值
#{指定的key}取出對應的參數值
<select id="getEmpByIdAndLastName" resultType="com.nuch.edu.domain.Employee"> SELECT * FROM tbl_employee WHERE id=#{id} and last_name=#{lastName} </select>
④.POJO:如果多個參數正好是我們業務邏輯的數據模型,我們就可以直接傳入pojo;#{屬性名}:取出傳入的pojo的屬性值
⑤.Map:如果多個參數不是業務模型中的數據,沒有對應的pojo,不經常使用,為了方便,我們也可以傳入map;#{key}:取出map中對應的值
public Employee getEmpByMap(Map<String,Object> map);
<select id="getEmpByMap" resultType="com.nuch.edu.domain.Employee"> SELECT * FROM tbl_employee WHERE id=#{id} and last_name=#{lastName} </select>
Map<String,Object> map = new HashMap<>(); map.put("id",3); map.put("lastName","jerry"); Employee jerry = mapper.getEmpByMap(map);
⑥.TO:如果多個參數不是業務模型中的數據,但是經常要使用,推薦來編寫一個TO(Transfer Object)數據傳輸對象
Page{ int index; int size; }
#{}和${}
#{key}:獲取參數的值,預編譯到SQL中。安全。
${key}:獲取參數的值,拼接到SQL中。有SQL註入問 題。原生jdbc不支持占位符的地方我們就可以使用${}進行取值。
有時我們只是想直接在 SQL 語句中插入一個不改變的字符串
ORDER BY ${columnName}
#{}更豐富的用法:
規定參數的一些規則:
javaType、 jdbcType、 mode(存儲過程)、 numericScale、
resultMap、 typeHandler、 jdbcTypeName;
jdbcType通常需要在某種特定的條件下被設置:在我們數據為null的時候,有些數據庫可能不能識別mybatis對null的默認處理。比如Oracle(報錯);因為mybatis對所有的null都映射的是原生Jdbc的OTHER類型,oracle不能正確處理。
全局配置中默認:jdbcTypeForNull=OTHER;
1、#{email,jdbcType=NULL}; 2、jdbcTypeForNull=NULL <setting name="jdbcTypeForNull" value="NULL"/>
Mybatis_映射文件配置