SQL 映射文件只有很少的幾個頂級元素(按照應被定義的順序列出):
-
cache
– 該命名空間的緩存配置。 -
cache-ref
– 引用其它命名空間的緩存配置。 -
resultMap
– 描述如何從數據庫結果集中加載對象,是最復雜也是最強大的元素。 -
sql
– 可被其它語句引用的可重用語句塊。 -
insert
– 映射插入語句。 -
update
– 映射更新語句。 -
delete
– 映射刪除語句。 -
select
– 映射查詢語句。
select
<select id="selectPerson" parameterType="int" resultType="hashmap" resultMap="personResultMap" flushCache="false" useCache="true" timeout="10" fetchSize="256" statementType="PREPARED" resultSetType="FORWARD_ONLY">
select元素的屬性詳解:
屬性 | 描述 |
---|---|
id |
在命名空間中唯一的標識符,可以被用來引用這條語句。 |
parameterType |
將會傳入這條語句的參數的類全限定名或別名。這個屬性是可選的,因為 MyBatis 可以通過類型處理器(TypeHandler)推斷出具體傳入語句的參數,默認值為未設置(unset)。 |
resultType |
期望從這條語句中返回結果的類全限定名或別名。 如果返回的是集合,那應該設置為集合包含的類型,而不是集合本身的類型。 resultType 和 resultMap 之間只能同時使用一個。 |
resultMap |
對外部 resultMap 的命名引用。 resultType 和 resultMap 之間只能同時使用一個。 |
flushCache |
將其設置為 true 后,只要語句被調用,都會導致本地緩存和二級緩存被清空,默認值:false。 |
useCache |
將其設置為 true 后,將會導致本條語句的結果被二級緩存緩存起來,默認值:對 select 元素為 true。 |
timeout |
這個設置是在拋出異常之前,驅動程序等待數據庫返回請求結果的秒數。默認值為未設置(unset)(依賴數據庫驅動)。 |
fetchSize |
這是一個給驅動的建議值,嘗試讓驅動程序每次批量返回的結果行數等於這個設置值。 默認值為未設置(unset)(依賴驅動)。 |
statementType |
可選 STATEMENT,PREPARED 或 CALLABLE。這會讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,默認值:PREPARED。 |
resultSetType |
FORWARD_ONLY,SCROLL_SENSITIVE, SCROLL_INSENSITIVE 或 DEFAULT(等價於 unset) 中的一個,默認值為 unset (依賴數據庫驅動)。 |
resultOrdered |
這個設置僅針對嵌套結果 select 語句:如果為 true,將會假設包含了嵌套結果集或是分組,當返回一個主結果行時,就不會產生對前面結果集的引用。 這就使得在獲取嵌套結果集的時候不至於內存不夠用。默認值:false 。 |
resultSets |
這個設置僅適用於多結果集的情況。它將列出語句執行后返回的結果集並賦予每個結果集一個名稱,多個名稱之間以逗號分隔。 |
insert, update 和 delete
數據變更語句 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">
Insert, Update, Delete 元素的屬性詳解:
屬性 | 描述 |
---|---|
id |
在命名空間中唯一的標識符,可以被用來引用這條語句。 |
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)中,當主鍵列不是表中的第一列的時候,是必須設置的。如果生成列不止一個,可以用逗號分隔多個屬性名稱。 |
主鍵返回<selectKey>
插入一條新數據時,有兩種方法確定最新的主鍵值:
-
UUID(非自增主鍵返回)
在執行插入語句前獲取最新的主鍵值
<!-- mysql的uuid生成主鍵 --> <mapper namespace="mybatis_test.ManMapper"> <insert id="insertUser" parameterType="mybatis_test.Man"> <selectKey keyProperty="id" order="BEFORE" resultType="string"> <!--去除'-'和空格--> select replace(uuid(), '-', '') </selectKey> insert into man(id,name) value(#{id},#{name}) </insert> </mapper>
-
LAST_INSERT_ID()(自增主鍵返回)
通過LAST_INSERT_ID()獲取剛插入記錄的自增主鍵值,在insert語句執行后,執行select LAST_INSERT_ID()就可以獲取自增主鍵;
SQL執行語句返回的是影響的行數,為1或者0,主鍵id已經存到了man對象的“id”字段中,所以應該從對象中獲取
<insert id="insertUser" parameterType="mybatis_test.Man"> insert into man(name) value(#{name}) <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> select LAST_INSERT_ID() </selectKey> </insert>
代碼
//這里返回的是影像的行數,為1或者0 manMapper.insertUser(man); sqlSession.commit(); //主鍵id已經存到了man對象的“id”字段中,所以應該從對象中獲取 System.out.println(man.getId());
selectKey 標簽屬性
屬性 | 描述 |
---|---|
keyProperty |
selectKey 語句結果應該被設置的目標屬性。如果希望得到多個生成的列,也可以是逗號分隔的屬性名稱列表。 |
keyColumn |
匹配屬性的返回結果集中的列名稱。如果希望得到多個生成的列,也可以是逗號分隔的屬性名稱列表。 |
resultType |
結果的類型。MyBatis 允許任何簡單類型用作主鍵的類型,包括字符串。如果希望作用於多個生成的列,則可以使用一個包含期望屬性的 Object 或一個 Map。 |
order |
可選值BEFORE和AFTER,設置為BEFORE會先執行selectKey語句,再執行insert語句;設置為AFTER會先執行insert語句再執行selectKey語句 |
SQL片段
用來定義可重用的 SQL 代碼片段,以便在其它語句中使用。 參數可以靜態地(在加載的時候)確定下來,並且可以在不同的 include 元素中定義不同的參數值。
定義
<sql id="userColumns"> ... </sql>
在增刪查改的語句中使用 include標簽 使用SQL片段
參數(占位符)
傳入簡單參數,如 int ,String等,不用寫參數類型(parameterType),如果傳入的是對象,就需要寫
在Mybatis中,有兩種占位符
-
#{} 解析傳遞進來的參數數據
-
${} 對傳遞進來的參數原樣拼接在SQL中
結果映射<resultMap>
簡單映射
-
顯示配置
resultMap
<resultMap type="mybatis_test.Student" id="citiesMap">...</resultMap> <select id="findById" parameterType="int" resultMap="citiesMap">...</select>
select標簽的resultMap屬性=顯示配置的resultMap標簽的id屬性
-
不配置
resultMap
-
resultType屬性為類的全限定名(需要保證表字段和類屬性相同,如果不同,可以在select語句中設置別名
select user_city as usercity from...
或者顯示配置resultMap
做字段和屬性的對應關系)
<select id="findById" parameterType="int" resultType="mybatis_test.Student">...</select>
-
resultType屬性為類的別名
-
<!-- mybatis.xml 中 --> <typeAlias type="mybatis_test.Studentr" alias="Studentr"/> <!-- SQL 映射 XML 中 --> <select id="selectUsers" resultType="Studentr">...</select>
高級結果映射
需要顯示配置 resultMap
resultMap
的屬性
屬性 | 描述 |
---|---|
id |
當前命名空間中的一個唯一標識,用於標識一個結果映射。 |
type |
類的完全限定名, 或者一個類型別名。 |
autoMapping |
如果設置這個屬性,MyBatis 將會為本結果映射開啟或者關閉自動映射。 這個屬性會覆蓋全局的屬性 autoMappingBehavior。默認值:未設置(unset)。 |
resultMap
的子標簽
-
constructor - 用於在實例化類時,注入結果到構造方法中
-
idArg - ID 參數;標記出作為 ID 的結果可以幫助提高整體性能
-
arg - 將被注入到構造方法的一個普通結果
-
-
id – 一個 ID 結果;標記出作為 ID 的結果可以幫助提高整體性能
-
result – 注入到字段或 JavaBean 屬性的普通結果
-
association – 一個復雜類型的關聯;許多結果將包裝成這種類型
-
嵌套結果映射 – 關聯可以是 resultMap 元素,或是對其它結果映射的引用
-
-
collection – 一個復雜類型的集合
-
嵌套結果映射 – 集合可以是 resultMap 元素,或是對其它結果映射的引用
-
-
discriminator – 使用結果值來決定使用哪個 resultMap
-
case – 基於某些值的結果映射
-
嵌套結果映射 – case 也是一個結果映射,因此具有相同的結構和元素;或者引用其它的結果映射
-
-
id和result的屬性
屬性 | 描述 |
---|---|
property |
映射到列結果的字段或屬性。如果 JavaBean 有這個名字的屬性(property),會先使用該屬性。否則 MyBatis 將會尋找給定名稱的字段(field)。 無論是哪一種情形,你都可以使用常見的點式分隔形式進行復雜屬性導航。 比如,你可以這樣映射一些簡單的東西:“username”,或者映射到一些復雜的東西上:“address.street.number”。 |
column |
數據庫中的列名,或者是列的別名。一般情況下,這和傳遞給 resultSet.getString(columnName) 方法的參數一樣。 |
javaType |
一個 Java 類的全限定名,或一個類型別名(關於內置的類型別名,可以參考上面的表格)。 如果你映射到一個 JavaBean,MyBatis 通常可以推斷類型。然而,如果你映射到的是 HashMap,那么你應該明確地指定 javaType 來保證行為與期望的相一致。 |
jdbcType |
JDBC 類型,所支持的 JDBC 類型參見這個表格之后的“支持的 JDBC 類型”。 只需要在可能執行插入、更新和刪除的且允許空值的列上指定 JDBC 類型。這是 JDBC 的要求而非 MyBatis 的要求。如果你直接面向 JDBC 編程,你需要對可以為空值的列指定這個類型。 |
typeHandler |
我們在前面討論過默認的類型處理器。使用這個屬性,你可以覆蓋默認的類型處理器。 這個屬性值是一個類型處理器實現類的全限定名,或者是類型別名。 |
constructor 的屬性
屬性 | 描述 |
---|---|
column |
數據庫中的列名,或者是列的別名。一般情況下,這和傳遞給 resultSet.getString(columnName) 方法的參數一樣。 |
javaType |
一個 Java 類的完全限定名,或一個類型別名(關於內置的類型別名,可以參考上面的表格)。 如果你映射到一個 JavaBean,MyBatis 通常可以推斷類型。然而,如果你映射到的是 HashMap,那么你應該明確地指定 javaType 來保證行為與期望的相一致。 |
jdbcType |
JDBC 類型,所支持的 JDBC 類型參見這個表格之前的“支持的 JDBC 類型”。 只需要在可能執行插入、更新和刪除的且允許空值的列上指定 JDBC 類型。這是 JDBC 的要求而非 MyBatis 的要求。如果你直接面向 JDBC 編程,你需要對可能存在空值的列指定這個類型。 |
typeHandler |
我們在前面討論過默認的類型處理器。使用這個屬性,你可以覆蓋默認的類型處理器。 這個屬性值是一個類型處理器實現類的完全限定名,或者是類型別名。 |
select |
用於加載復雜類型屬性的映射語句的 ID,它會從 column 屬性中指定的列檢索數據,作為參數傳遞給此 select 語句。具體請參考關聯元素。 |
resultMap |
結果映射的 ID,可以將嵌套的結果集映射到一個合適的對象樹中。 它可以作為使用額外 select 語句的替代方案。它可以將多表連接操作的結果映射成一個單一的 ResultSet 。這樣的 ResultSet 將會將包含重復或部分數據重復的結果集。為了將結果集正確地映射到嵌套的對象樹中,MyBatis 允許你 “串聯”結果映射,以便解決嵌套結果集的問題。想了解更多內容,請參考下面的關聯元素。 |
name |
構造方法形參的名字。從 3.4.3 版本開始,通過指定具體的參數名,你可以以任意順序寫入 arg 元素。參看上面的解釋。 |