1. 程式人生 > >Mybatis_映射文件配置

Mybatis_映射文件配置

spa 字符串 安全 str 處理 多個參數 mapper 取值 獲取

獲取自增主鍵的值

若數據庫支持自動生成主鍵的字段(比如 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_映射文件配置