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 |
|
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 支持 STATEMENT ,PREPARED 和 CALLABLE 類型的映射語句,分別代表 Statement , PreparedStatement 和 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 屬性允許你指定 IN
,OUT
或 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