1. 程式人生 > >Mybatis增刪查改基礎

Mybatis增刪查改基礎

  1. 查詢

    <select id="selectPerson" parameterType="int" resultType="hashmap">
      SELECT * FROM PERSON WHERE ID = #{id}
    </select>
    

    id: 表示名稱空間中唯一識別符號,可以被用來引用這條語句

    parameterType:傳入這條語句的引數的型別,這個屬性是可選的,mybatis可以根據TypeHandler推斷出具體傳入語句的引數,預設值為unset

    resultType:返回值型別的完全限定名或別名,如果是集合的情形,則應該是集合屬性的型別,而不是集合本身

  2. 增刪改

    增刪改基本同查詢,需要注意的是,增刪改沒有resultType屬性,不能指定返回值型別,但可以使用整形(int long)或布林型(bool)來判斷受影響的行數。

​ useGeneratedKeys:(僅對insert 與 update 有用)這會使Mybatis 使用JDBC 呼叫getGeneratedKeys 方法來取出資料庫內部生成的主鍵(比如:像mysql,sql server這種資料庫的自增欄位,Oracle沒有自增欄位),預設值為false

​ keyProperty:(僅對 insert 和 update 有用)唯一標記一個屬性,mybatis會通過getGeneratedKeys方法的返回值或insert語句的字標籤selectKey (Oracle沒有自增欄位,它使用selectKey 這種方式)設定它的鍵值 ,預設值為unset,如果希望得到多個生成的列,可以指定逗號分隔的列表

  <selectKey keyProperty="id" resultType="int" order="BEFORE">
    select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1
  </selectKey>

order=“BEFORE”:表示這條語句在insert 語句之前執行

  1. 引數處理
  • 單個引數mybatis不會做特殊處理,直接用#{任意名稱} 即可取到值

  • 多個引數mybatis 會做處理,將所有引數封裝成一個Map,預設key 分別為param1…param2…,取值時使用#{param1 或 索引下標}

  • 多個引數的情況可以使用@Param 註解指定封裝成Map時的key

  • 多個引數都是資料模型對應屬性的情況,可以直接傳入POJO,取值時使用#{POJO 對應屬性名}

  • 多個引數沒有對應POJO 的情況,則可以使用傳入Map,取值時使用#{Map 對應的key}

  • 多個引數沒有對應POJO 的情況還可以構造一個TO(Transfer Object),然後直接傳入即可

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

  • 對於集合與陣列型別,即使只有一個引數也會封裝成Map
  • public Employee getEmp(List ids);

取值:取第一個id值,#{list[0]}

  1. #{} 與${} 的區別
  • #{} 相當與原生JDBC 中 PrepareStatement 的方式,是預編譯的方式,可以防止sql注入
  • ${} 相當於原生JDBC 中Statement 的方式,是直接拼接的方式,有安全問題
  • 大部分情況下都應該使用#{},只有在PrepareStatement 方式中佔位符? 無法使用的情況下,才使用${},如分庫分表的情況下
  1. 引數處理其他情況
  • jdbcType:指定對映的資料庫型別,如欄位為空時,預設被對映為OTHER型別, Oracle 不支援,所以要指定為NULL型別。也可以在全域性配置檔案中指定JdbcTypeForNull 欄位值為NULL
  1. 對於返回值為集合或Map的情況
  • 對於集合注意resultType 指定為集合元素型別即可,介面方法返回值宣告為集合型別
  • 對於將一個數據模型對映為Map的情況,resultType 指定為map(mybatis 內建別名),介面方法返回值宣告為Map,返回Map的key即資料模型屬性名
  • 對於將一組資料模型對映為Map的情況,resultType 指定為資料模型型別,用@MapKey 註解在介面方法上指定Map 的key