MyBatis 真正的核心在映射文件中。比直接使用 JDBC 節省95%的代碼。並且將 SQL 語句獨立在 Java 代碼以外,能夠進行更爲細緻的 SQL 優化。java
<select <!-- 1. id(必須配置) id是命名空間中的惟一標識符,可被用來表明這條語句 一個命名空間(namespace)對應一個dao接口 這個id也應該對應dao裏面的某個方法(sql至關於方法的實現),所以id應該與方法名一致 --> id="selectUser" <!-- 2. parapeterType(可選配置,默認由mybatis自動選擇處理) 將要傳入語句的參數的徹底限定名或別名,若是不配置,mybatis會經過ParamterHandler根據參數類型默認選擇合適的typeHandler進行處理 paramterType 主要指定參數類型,能夠是int, short, long, string等類型,也能夠是複雜類型(如對象) --> parapeterType="int" <!-- 3. resultType(resultType 與 resultMap 二選一配置) 用來指定返回類型,指定的類型能夠是基本類型,也能夠是java容器,也能夠是javabean --> resultType="hashmap" <!-- 4. resultMap(resultType 與 resultMap 二選一配置) 用於引用咱們經過 resultMap 標籤訂義的映射類型,這也是mybatis組件高級複雜映射的關鍵 --> resultMap="USER_RESULT_MAP" <!-- 5. flushCache(可選配置) 將其設置爲true,任什麼時候候語句被調用,都會致使本地緩存和二級緩存被清空,默認值:false --> flushCache="false" <!-- 6. useCache(可選配置) 將其設置爲true,會致使本條語句的結果被二級緩存,默認值:對select元素爲true --> useCache="true" <!-- 7. timeout(可選配置) 這個設置是在拋出異常以前,驅動程序等待數據庫返回請求結果的秒數,默認值爲:unset(依賴驅動) --> timeout="10000" <!-- 8. fetchSize(可選配置) 這是嘗試影響驅動程序每次批量返回的結果行數和這個設置值相等。默認值爲:unset(依賴驅動) --> fetchSize="256" <!-- 9. statementType(可選配置) STATEMENT, PREPARED或CALLABLE的一種,這會讓MyBatis使用選擇Statement, PrearedStatement或CallableStatement,默認值:PREPARED --> statementType="PREPARED" <!-- 10. resultSetType(可選配置) FORWARD_ONLY,SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE 中的一個,默認值爲:unset(依賴驅動) --> resultSetType="FORWORD_ONLY" ></select>
<!-- 1. type 對應的返回類型,能夠是javabean, 也能夠是其它 2. id 必須惟一, 用於標示這個resultMap的惟一性,在使用resultMap的時候,就是經過id引用 3. extends 繼承其餘resultMap標籤 --> <resultMap type="" id="" extends=""> <!-- 1. id 惟一性,注意啦,這個id用於標示這個javabean對象的惟一性, 不必定會是數據庫的主鍵(不要把它理解爲數據庫對應表的主鍵) 2. property 屬性對應javabean的屬性名 3. column 對應數據庫表的列名 (這樣,當javabean的屬性與數據庫對應表的列名不一致的時候,就能經過指定這個保持正常映射了) --> <id property="" column=""/> <!-- result 與id相比,對應普通屬性 --> <result property="" column=""/> <!-- constructor 對應javabean中的構造方法 --> <constructor> <!-- idArg 對應構造方法中的id參數 --> <idArg column=""/> <!-- arg 對應構造方法中的普通參數 --> <arg column=""/> </constructor> <!-- collection 爲關聯關係,是實現一對多的關鍵 1. property 爲javabean中容器對應字段名 2. ofType 指定集合中元素的對象類型 3. select 使用另外一個查詢封裝的結果 4. column 爲數據庫中的列名,與select配合使用 --> <collection property="" column="" ofType="" select=""> <!-- 當使用select屬性時,無需下面的配置 --> <id property="" column=""/> <result property="" column=""/> </collection> <!-- association 爲關聯關係,是實現一對一的關鍵 1. property 爲javabean中容器對應字段名 2. javaType 指定關聯的類型,當使用select屬性時,無需指定關聯的類型 3. select 使用另外一個select查詢封裝的結果 4. column 爲數據庫中的列名,與select配合使用 --> <association property="" column="" javaType="" select=""> <!-- 使用select屬性時,無需下面的配置 --> <id property="" column=""/> <result property="" column=""/> </association> </resultMap>
<insert <!-- 同 select 標籤 --> id="insertProject" <!-- 同 select 標籤 --> paramterType="projectInfo" <!-- 1. useGeneratedKeys(可選配置,與 keyProperty 相配合) 設置爲true,並將 keyProperty 屬性設爲數據庫主鍵對應的實體對象的屬性名稱 --> useGeneratedKeys="true" <!-- 2. keyProperty(可選配置,與 useGeneratedKeys 相配合) 用於獲取數據庫自動生成的主鍵 --> keyProperty="projectId" >
<sql id="userColumns">id,username,password</sql>
這個 SQL 片斷能夠被包含在其餘語句中,eg:sql
<select id="selectProjectList" paramertType="int" resultType="hashmap"> SELECT <include refid="userColumns"/> FROM t_project_002_project_info </select>
在 mybatis 配置文件中,使用以下配置數據庫
<typeAliases> <typeAlias type="com.enh.bean.ProjectInfo" alias="projectInfo"/> </typeAliases>
那麼在 Mapper 中,能夠直接使用 projectInfo,即表示 com.enh.bean.ProjectInfo緩存
每一個sql映射文件的要元素中,都須要指定一個名稱空間,用以確保每一個映射語句的id屬性不會重複。如session
<mapper namespace="com.enh.mapper.PersonMapper">
在Java代碼中引用某個 sql 映射時,使用的亦是含有名稱空間的全路徑。如mybatis
session.update("com.enh.mapper.PersonMapper.udpateUser", user);