12 myBatis-04-Mapper文件

1、標籤和屬性

1.1、Mapper內部的頂級標籤

  • insert – 映射插入語句。
  • update – 映射更新語句。
  • delete – 映射刪除語句。
  • select – 映射查詢語句。
  • resultMap – 描述如何從數據庫結果集中加載對象,是最複雜也是最強大的元素。
  • sql – 可被其它語句引用的可重用語句塊。
  • cache – 該命名空間的緩存配置。
  • cache-ref – 引用其它命名空間的緩存配置。

1.2、數據變更

insert,update,delete三個標籤用法基本差不錯,比較簡單。

<insert
  id="insertAuthor"
  parameterType="domain.blog.Author"
  flushCache="true"
  statementType="PREPARED"
  keyProperty=""
  keyColumn=""
  useGeneratedKeys=""
  timeout="20">

<update
  id="updateAuthor"
  parameterType="domain.blog.Author"
  flushCache="true"
  statementType="PREPARED"
  timeout="20">

<delete
  id="deleteAuthor"
  parameterType="domain.blog.Author"
  flushCache="true"
  statementType="PREPARED"
  timeout="20">

相關屬性:

屬性描述
id 在命名空間中唯一的標識符,可以被用來引用這條語句。
parameterType 將會傳入這條語句的參數的類全限定名或別名。這個屬性是可選的,因爲 MyBatis 可以通過類型處理器(TypeHandler)推斷出具體傳入語句的參數,默認值爲未設置(unset)。
parameterMap 用於引用外部 parameterMap 的屬性,目前已被廢棄。請使用行內參數映射和 parameterType 屬性。
flushCache 將其設置爲 true 後,只要語句被調用,都會導致本地緩存和二級緩存被清空,默認值:(對 insert、update 和 delete 語句)true。
timeout 這個設置是在拋出異常之前,驅動程序等待數據庫返回請求結果的秒數。默認值爲未設置(unset)(依賴數據庫驅動)。
statementType 可選 STATEMENT,PREPARED 或 CALLABLE。這會讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,默認值:PREPARED。
useGeneratedKeys (僅適用於 insert 和 update)這會令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法來取出由數據庫內部生成的主鍵(比如:像 MySQL 和 SQL Server 這樣的關係型數據庫管理系統的自動遞增字段),默認值:false。
keyProperty (僅適用於 insert 和 update)指定能夠唯一識別對象的屬性,MyBatis 會使用 getGeneratedKeys 的返回值或 insert 語句的 selectKey 子元素設置它的值,默認值:未設置(unset)。如果生成列不止一個,可以用逗號分隔多個屬性名稱。
keyColumn (僅適用於 insert 和 update)設置生成鍵值在表中的列名,在某些數據庫(像 PostgreSQL)中,當主鍵列不是表中的第一列的時候,是必須設置的。如果生成列不止一個,可以用逗號分隔多個屬性名稱。
databaseId 如果配置了數據庫廠商標識(databaseIdProvider),MyBatis 會加載所有不帶 databaseId 或匹配當前 databaseId 的語句;如果帶和不帶的語句都有,則不帶的會被忽略。

批量新增的用法

如果你的數據庫還支持多行插入, 你也可以傳入一個 Author 數組或集合,並返回自動生成的主鍵。

<insert id="insertAuthor" useGeneratedKeys="true"
    keyProperty="id">
  insert into Author (username, password, email, bio) values
  <foreach item="item" collection="list" separator=",">
    (#{item.username}, #{item.password}, #{item.email}, #{item.bio})
  </foreach>
</insert> 

1.3、數據查詢

select標籤,用於完成數據的查詢,普通的查詢比較簡單。

複雜的用法:動態Sql,與resultMap結合

<selectKey
  keyProperty="id"
  resultType="int" / resultMap="" 
  order="BEFORE"
  statementType="PREPARED">

相關屬性:

屬性描述
keyProperty selectKey 語句結果應該被設置到的目標屬性。如果生成列不止一個,可以用逗號分隔多個屬性名稱。
keyColumn 返回結果集中生成列屬性的列名。如果生成列不止一個,可以用逗號分隔多個屬性名稱。
resultType 結果的類型。通常 MyBatis 可以推斷出來,但是爲了更加準確,寫上也不會有什麼問題。MyBatis 允許將任何簡單類型用作主鍵的類型,包括字符串。如果生成列不止一個,則可以使用包含期望屬性的 Object 或 Map。
resultMap 用來引用外部結果集配置,完成查詢字段與Java對象屬性的映射,與resultType不能同時使用。
order 可以設置爲 BEFORE 或 AFTER。如果設置爲 BEFORE,那麼它首先會生成主鍵,設置 keyProperty 再執行插入語句。如果設置爲 AFTER,那麼先執行插入語句,然後是 selectKey中的語句 - 這和 Oracle 數據庫的行爲相似,在插入語句內部可能有嵌入索引調用。
statementType 和前面一樣,MyBatis 支持 STATEMENTPREPARED 和 CALLABLE 類型的映射語句,分別代表 StatementPreparedStatement 和 CallableStatement 類型。

1.4 sql代碼片段

這個元素可以用來定義可重用的 SQL 代碼片段,以便在其它語句中使用。 參數可以靜態地(在加載的時候)確定下來,並且可以在不同的 include 元素中定義不同的參數值。比如:

<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>

這個 SQL 片段可以在其它語句中使用,例如:

<select id="selectUsers" resultType="map">
  select
    <include refid="userColumns"><property name="alias" value="t1"/></include>,
    <include refid="userColumns"><property name="alias" value="t2"/></include>
  from some_table t1
    cross join some_table t2
</select>

1.5 cache緩存

MyBatis 內置了一個強大的事務性查詢緩存機制,它可以非常方便地配置和定製。 爲了使它更加強大而且易於配置,我們對 MyBatis 3 中的緩存實現進行了許多改進。

默認情況下,只啓用了本地的會話緩存,它僅僅對一個會話中的數據進行緩存。 要啓用全局的二級緩存,只需要在你的 SQL 映射文件中添加一行:

。。。

1.6 cache-ref

。。。

2、輸入參數

Mapper操作內會包含參數,參數定義方式:

1)#{參數名},主要用於字段值位置。

2)${參數名},主要用於字符串替換,當替換參數值時有注入的風險。

參數值傳入支持簡單類型也支持複雜類型,如果只有一個參數,可以不需要通過parameterType指定參數類型。

參數名後邊可以指定其它的數據類型聲明,例如:

常用的類型:javaType,jdbcType,typeHandler,numericScale,mode,resultMap

jdbcType的取值必須是org.apache.ibatis.type.JdbcType枚舉類型中的某一個類型。

typeHandler是數據值處理器,用來完成數據的二次處理。

numericScale如果是數值類型,可以通過該屬性指定保留小數的位數。

mode 屬性允許你指定 INOUT 或 INOUT 參數,如果是存儲過程的參數才需要。

resultMap 用來將結果集 ResultMap 映射到參數的類型上。

#{isDelete,javaType=java.lang.String,jdbcType=BIT,typeHandler=db.TypeHandles.isDeleteTypeHandle}
#{height,javaType=double,jdbcType=NUMERIC,numericScale=2}
#{department, mode=OUT, jdbcType=CURSOR, javaType=ResultSet, resultMap=departmentResultMap}

簡單類型方法:

<select id="selectUsers" resultType="User">
  select id, username, password
  from users
  where id = #{id}
</select>

負責類型用法:如果 User 類型的參數對象傳遞到了語句中,會查找 id、username 和 password 屬性,然後將它們的值傳入預處理語句的參數中。

<insert id="insertUser" parameterType="User">
  insert into users (id, username, password)
  values (#{id}, #{username}, #{password})
</insert>

參數替換的應用舉例:

按照任意的列進行查詢

@Select("select * from user where ${column} = #{value}")
User findByColumn(@Param("column") String column, @Param("value") String value);

按照任意列進行排序

ORDER BY ${columnName} 

3、輸出映射

resultType,用來指定輸出的具體類型,查詢列名需要和類型的字段名保持統一,字段名和屬性不對應是要使用別名方式。

<select id="selectUsers" resultType="User">
  select
    user_id             as "id",
    user_name           as "userName",
    hashed_password     as "hashedPassword"
  from some_table
  where id = #{id}
</select>

myBatis會在幕後自動創建一個 ResultMap,再根據屬性名來映射列到 JavaBean 的屬性上

resultMap,顯示的指定字段和屬性的映射關係

<resultMap id="userResultMap" type="User">
  <id property="id" column="user_id" />
  <result property="username" column="user_name"/>
  <result property="password" column="hashed_password"/>
</resultMap>
<select id="selectUsers" resultMap="userResultMap">
  select user_id, user_name, hashed_password
  from some_table
  where id = #{id}
</select>

4、動態Sql

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章