日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

mybatis_user_guide(4) Mapper XML 文件

發布時間:2023/12/3 asp.net 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mybatis_user_guide(4) Mapper XML 文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【-1】README

1)本文全文總結于?http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html

【0】SQL 映射文件有很少的幾個頂級元素(按照它們應該被定義的順序):

  • cache?– 給定命名空間的緩存配置。
  • cache-ref?– 其他命名空間緩存配置的引用。
  • resultMap?– 是最復雜也是最強大的元素,用來描述如何從數據庫結果集中來加載對象。(干貨——resultMap確實很厲害)
  • ?parameterMap?– 已廢棄!老式風格的參數映射。內聯參數是首選,這個元素可能在將來被移除,這里不會記錄。
  • sql?– 可被其他語句引用的可重用語句塊。
  • insert?– 映射插入語句
  • update?– 映射更新語句
  • delete?– 映射刪除語句
  • select?– 映射查詢語句

【1】select 語句 1)簡單查詢的 select 元素是非常簡單的。比如: <select id="selectPerson" parameterType="int" resultType="hashmap">SELECT * FROM PERSON WHERE ID = #{id} </select> 對以上代碼的分析(Analysis):這個語句被稱作 selectPerson,接受一個 int(或 Integer)類型的參數,并返回一個 HashMap 類型的對象,其中的鍵是列名,值便是結果行中的對應值。注意參數符號:#{id}
2)這就告訴 MyBatis 創建一個預處理語句參數,如下所示:
// Similar JDBC code, NOT MyBatis… String selectPerson = "SELECT * FROM PERSON WHERE ID=?"; PreparedStatement ps = conn.prepareStatement(selectPerson); ps.setInt(1,id); 3)我們需要深入了解參數和結果映射 3.1)select 元素有很多屬性允許你配置,來決定每條語句的作用細節。 <selectid="selectPerson"parameterType="int"parameterMap="deprecated"resultType="hashmap"resultMap="personResultMap"flushCache="false"useCache="true"timeout="10000"fetchSize="256"statementType="PREPARED"resultSetType="FORWARD_ONLY"> 3.2)select attributes 如下:

【2】insert, update 和 delete <insertid="insertAuthor"parameterType="domain.blog.Author"flushCache="true"statementType="PREPARED"keyProperty=""keyColumn=""useGeneratedKeys=""timeout="20"><updateid="updateAuthor"parameterType="domain.blog.Author"flushCache="true"statementType="PREPARED"timeout="20"><deleteid="deleteAuthor"parameterType="domain.blog.Author"flushCache="true"statementType="PREPARED"timeout="20">

1)下面就是 insert,update 和 delete 語句的示例: <insert id="insertAuthor">insert into Author (id,username,password,email,bio)values (#{id},#{username},#{password},#{email},#{bio}) </insert><update id="updateAuthor">update Author setusername = #{username},password = #{password},email = #{email},bio = #{bio}where id = #{id} </update><delete id="deleteAuthor">delete from Author where id = #{id} </delete> 2)插入語句的配置規則更加豐富,有多種生成方式 2.1)首先,如果你的數據庫支持自動生成主鍵的字段(比如 MySQL 和 SQL Server),那么你可以設置 useGeneratedKeys=”true”,然后再把 keyProperty 設置到目標屬性上就OK了。 <insert id="insertAuthor" useGeneratedKeys="true"keyProperty="id">insert into Author (username,password,email,bio)values (#{username},#{password},#{email},#{bio}) </insert> 2.2)若數據庫支持多行插入,你可以傳遞一個數組或List 集合對象 并檢索出 自動生成的key <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>
【3】sql 1)intro:?這個元素可以被用來定義可重用的 SQL 代碼段,可以包含在其他語句中。它可以被靜態地(在加載參數) 參數化. 不同的屬性值通過包含的實例變化. 比如:?(干貨——定義sql,并對其復用引用) <sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql> 1.1)這個 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 t1cross join some_table t2 </select> 1.2)屬性值可以用于包含的refid屬性或者包含的字句里面的屬性值,例如: <sql id="sometable">${prefix}Table </sql><sql id="someinclude">from<include refid="${include_target}"/> </sql><select id="select" resultType="map">selectfield1, field2, field3<include refid="someinclude"><property name="prefix" value="Some"/><property name="include_target" value="sometable"/></include> </select>
【4】參數(Parameters) 1)參數映射 <insert id="insertUser" parameterType="User">insert into users (id, username, password)values (#{id}, #{username}, #{password}) </insert> 對以上代碼的分析(Analysis):如果 User 類型的參數對象傳遞到了語句中,id、username 和 password 屬性將會被查找,然后將它們的值傳入預處理語句的參數中。


2)這點對于向語句中傳參是比較好的而且又簡單,不過參數映射的功能遠不止于此。

2.1)首先,像 MyBatis 的其他部分一樣,參數也可以指定一個特殊的數據類型。

#{property,javaType=int,jdbcType=NUMERIC}

Attention)?如果 null 被當作值來傳遞,對于所有可能為空的列,JDBC Type 是需要的。你可以自己通過閱讀預處理語句的 setNull() 方法的 JavaDocs 文檔來研究這種情況。


2.2)為了以后定制類型處理方式,你也可以指定一個特殊的類型處理器類(或別名),比如:

#{age,javaType=int,jdbcType=NUMERIC,typeHandler=MyTypeHandler} 2.3)對于數值類型,還有一個小數保留位數的設置,來確定小數點后保留的位數。 #{height,javaType=double,jdbcType=NUMERIC,numericScale=2} 3)最后,mode 屬性允、你指定 IN,OUT 或 INOUT 參數。如果參數為 OUT 或 INOUT,參數對象屬性的真實值將會被改變,就像你在獲取輸出參數時所期望的那樣。如果 mode 為 OUT(或 INOUT),而且 jdbcType 為 CURSOR(也就是 Oracle 的 REFCURSOR),你必須指定一個 resultMap 來映射結果集到參數類型。要注意這里的 javaType 屬性是可選的,如果左邊的空白是 jdbcType 的 CURSOR 類型,它會自動地被設置為結果集。 #{department, mode=OUT, jdbcType=CURSOR, javaType=ResultSet, resultMap=departmentResultMap}

4)字符串替換:默認情況下,使用#{}格式的語法會導致 MyBatis 創建預處理語句屬性并安全地設置值(比如?)。這樣做更安全,更迅速,通常也是首選做法,不過有時你只是想直接在 SQL 語句中插入一個不改變的字符串。比如,像 ORDER BY,你可以這樣來使用:

ORDER BY ${columnName} Attention)?以這種方式接受從用戶輸出的內容并提供給語句中不變的字符串是不安全的,會導致潛在的 SQL 注入攻擊,因此要么不允許用戶輸入這些字段,要么自行轉義并檢驗。(干貨——引入了SQL注入攻擊)


【5】Result Maps

1)intro:?ResultMap 的設計就是簡單語句不需要明確的結果映射,而很多復雜語句確實需要描述它們 的關系。

2)看個荔枝:?簡單映射語句的示例了,但沒有明確的 resultMap。比如:

<select id="selectUsers" resultType="map">select id, username, hashedPasswordfrom some_tablewhere id = #{id} </select> 對以上代碼的分析(Analysis):這樣一個語句簡單作用于所有列被自動映射到 HashMap 的鍵上,這由 resultType 屬性 指定。

3)problem + solution:

3.1)problem:這在很多情況下是有用的,但是 HashMap 不能很好描述一個領域模型。

3.2)solution:那樣你的應 用程序將會使用 JavaBeans 或 POJOs(Plain Old Java Objects,普通 Java 對象)來作為領域 模型。MyBatis 對兩者都支持。看看下面這個 JavaBean:

package com.someapp.model; public class User {private int id;private String username;private String hashedPassword;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getHashedPassword() {return hashedPassword;}public void setHashedPassword(String hashedPassword) {this.hashedPassword = hashedPassword;} } 3.2.1)這樣的一個 JavaBean 可以被映射到結果集,就像映射到 HashMap 一樣簡單。

<select id="selectUsers" resultType="com.someapp.model.User">select id, username, hashedPasswordfrom some_tablewhere id = #{id} </select> 3.2.2)要記住類型別名是你的伙伴。使用它們你可以不用輸入類的全路徑。比如:(干貨——設定別名) <!-- In mybatis-config.xml file --> <typeAlias type="com.someapp.model.User" alias="User"/><!-- In SQL Mapping XML file --> <select id="selectUsers" resultType="User">select id, username, hashedPasswordfrom some_tablewhere id = #{id} </select>

4)MyBatis 會在幕后自動創建一個 ResultMap,基于屬性名來映射列到 JavaBean 的屬性上。

5)problem+solution:

5.1)problem:如果列名沒有精確匹配;

5.2)solution:(2 solutions)

5.2.1)你可以在列名上使用 select 字句的別名(一個 基本的 SQL 特性)來匹配標簽。比如:

<select id="selectUsers" resultType="User">selectuser_id as "id",user_name as "userName",hashed_password as "hashedPassword"from some_tablewhere id = #{id} </select> 5.2.2)讓我們來看看最后一個示例中 外部的 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> 5.2.2.1)引用它的語句使用 resultMap 屬性就行了(注意我們去掉了 resultType 屬性)。比如: <selectid="selectUsers"resultMap="userResultMap">select user_id, user_name, hashed_passwordfrom some_tablewhere id = #{id} </select>

【5.1】高級結果映射

1)problem+solutions:

1.1)problem:MyBatis 創建的一個想法:數據庫不用永遠是你想要的或需要它們是什么樣的。而我們 最喜歡的數據庫最好是第三范式或 BCNF 模式,但它們有時不是。如果可能有一個單獨的 數據庫映射,所有應用程序都可以使用它,這是非常好的,但有時也不是; 1.2)solutions:結果映射就是 MyBatis 提供處理這個問題的答案;

2)problem:+solutions: 2.1)problem:我們如何映射下面這個語句? <!-- Very Complex Statement --> <select id="selectBlogDetails" resultMap="detailedBlogResultMap">selectB.id as blog_id,B.title as blog_title,B.author_id as blog_author_id,A.id as author_id,A.username as author_username,A.password as author_password,A.email as author_email,A.bio as author_bio,A.favourite_section as author_favourite_section,P.id as post_id,P.blog_id as post_blog_id,P.author_id as post_author_id,P.created_on as post_created_on,P.section as post_section,P.subject as post_subject,P.draft as draft,P.body as post_body,C.id as comment_id,C.post_id as comment_post_id,C.name as comment_name,C.comment as comment_text,T.id as tag_id,T.name as tag_namefrom Blog Bleft outer join Author A on B.author_id = A.idleft outer join Post P on B.id = P.blog_idleft outer join Comment C on P.id = C.post_idleft outer join Post_Tag PT on PT.post_id = P.idleft outer join Tag T on PT.tag_id = T.idwhere B.id = #{id} </select>

2.2)solutions:下面是一個完整的復雜結果映射例子 (假設作者, 博客, 博文, 評論和標簽都是類型的別名) 我們來看看, 。 但是不用緊張, 我們會一步一步來說明。

<!-- Very Complex Result Map --> <resultMap id="detailedBlogResultMap" type="Blog"><constructor><idArg column="blog_id" javaType="int"/></constructor><result property="title" column="blog_title"/><association property="author" javaType="Author"><id property="id" column="author_id"/><result property="username" column="author_username"/><result property="password" column="author_password"/><result property="email" column="author_email"/><result property="bio" column="author_bio"/><result property="favouriteSection" column="author_favourite_section"/></association><collection property="posts" ofType="Post"><id property="id" column="post_id"/><result property="subject" column="post_subject"/><association property="author" javaType="Author"/><collection property="comments" ofType="Comment"><id property="id" column="comment_id"/></collection><collection property="tags" ofType="Tag" ><id property="id" column="tag_id"/></collection><discriminator javaType="int" column="draft"><case value="1" resultType="DraftPost"/></discriminator></collection> </resultMap>

對以上代碼的分析(Analysis):

A1)resultMap:
  • constructor?- 類在實例化時,用來注入結果到構造方法中
    • idArg?-ID 參數;標記結果作為 ID 可以幫助提高整體效能
    • arg?-注入到構造方法的一個普通結果
  • id?–一個 ID 結果;標記結果作為 ID 可以幫助提高整體效能
  • result?–注入到字段或 JavaBean 屬性的普通結果
  • association?–一個復雜的類型關聯;許多結果將包成這種類型
    • 嵌入結果映射 – 結果映射自身的關聯,或者參考一個
  • collection?–復雜類型的集
    • 嵌入結果映射 – 結果映射自身的集,或者參考一個
  • discriminator?–使用結果值來決定使用哪個結果映射
    • case?–基于某些值的結果映射
      • 嵌入結果映射 – 這種情形結果也映射它本身,因此可以包含很多相 同的元素,或者它可以參照一個外部的結果映射。

【5.2】id & result <id property="id" column="post_id"/> <result property="subject" column="post_subject"/> 對以上代碼的分析(Analysis):?這些是結果映射最基本內容。id 和 result 都映射一個單獨列的值到簡單數據類型(字符 串,整型,雙精度浮點數,日期等)的單獨屬性或字段。

這兩者之間的唯一不同是 id 表示的結果將是當比較對象實例時用到的標識屬性。這幫 助來改進整體表現,特別是緩存和嵌入結果映射(也就是聯合映射) 。

1)id 和 result 屬性list 如下所示:

【5.3】支持的 JDBC 類型

【5.4】構造方法 <constructor><idArg column="id" javaType="int"/><arg column="username" javaType="String"/> </constructor> 對以上代碼的分析(Analysis):?idArg是為了 和 id 元素 區分開; 1)看看下面這個構造函數: public class User {//...public User(int id, String username) {//...} //... } 對以上代碼的分析(Analysis):

A1)當創建一個構造方法元素時,保證參數是按順序 排列的,而且數據類型也是確定的。

A2)該元素的屬性值 和 result 和 id 元素的屬性值相同;
【5.5】關聯 <association property="author" column="blog_author_id" javaType="Author"><id property="id" column="author_id"/><result property="username" column="author_username"/> </association> 1)intro: 關聯即表關聯; 2)關聯中不同的是你需要告訴 MyBatis 如何加載關聯。MyBatis 在這方面會有兩種不同的 方式:

way1)嵌套查詢:通過執行另外一個 SQL 映射語句來返回預期的復雜類型。 way2)嵌套結果:使用嵌套結果映射來處理重復的聯合結果的子集。首先, 讓我們來查看這個元素的屬性。所有的你都會看到,它和普通的只由 select 和?resultMap 屬性的結果映射不同。

【5.6】關聯的嵌套查詢



1)看個荔枝

<resultMap id="blogResult" type="Blog"><association property="author" column="author_id" javaType="Author" select="selectAuthor"/> </resultMap><select id="selectBlog" resultMap="blogResult">SELECT * FROM BLOG WHERE ID = #{id} </select><select id="selectAuthor" resultType="Author">SELECT * FROM AUTHOR WHERE ID = #{id} </select>

對以上代碼的分析(Analysis):?我們有兩個查詢語句:一個來加載博客,另外一個來加載作者,而且博客的結果映射描 述了“selectAuthor”語句應該被用來加載它的 author 屬性。

其他所有的屬性將會被自動加載,假設它們的列和屬性名相匹配。

這種方式很簡單, 但是對于大型數據集合和列表將不會表現很好。 問題就是我們熟知的 “N+1 查詢問題”。概括地講,N+1 查詢問題可以是這樣引起的:(干貨——引入了N+1 查詢問題)

  • 你執行了一個單獨的 SQL 語句來獲取結果列表(就是“+1”)。
  • 對返回的每條記錄,你執行了一個查詢語句來為每個加載細節(就是“N”)。

這個問題會導致成百上千的 SQL 語句被執行。這通常不是期望的。

MyBatis 能延遲加載這樣的查詢就是一個好處,因此你可以分散這些語句同時運行的消 耗。然而,如果你加載一個列表,之后迅速迭代來訪問嵌套的數據,你會調用所有的延遲加 載,這樣的行為可能是很糟糕的。

所以還有另外一種方法。(干貨——引入了 延遲加載)


【5.7】關聯的嵌套結果



1)看個荔枝:這個是一個非常簡單的示例 來說明它如何工作。代替了執行一個分離的語句,我們聯合博客表和作者表在一起,就像: <selectid="selectBlog"resultMap="blogResult">selectB.id as blog_id,B.title as blog_title,B.author_id as blog_author_id,A.id as author_id,A.username as author_username,A.password as author_password,A.email as author_email,A.bio as author_biofrom Blog B left outer join Author A on B.author_id = A.idwhere B.id = #{id} </select> 1.1)現在我們可以映射這個結果: <resultMap id="blogResult" type="Blog"><id property="id" column="blog_id" /><result property="title" column="blog_title"/><association property="author" column="blog_author_id" javaType="Author" resultMap="authorResult"/> </resultMap><resultMap id="authorResult" type="Author"><id property="id" column="author_id"/><result property="username" column="author_username"/><result property="password" column="author_password"/><result property="email" column="author_email"/><result property="bio" column="author_bio"/> </resultMap><span style="color: rgb(0, 0, 136); font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; font-size: 16px; line-height: 24px; background-color: rgb(245, 245, 245);"> </span>

1.2)現在,上面的示例用了外部的結果映射元素來映射關聯。這使得 Author 結果映射可以 重用。然而,如果你不需要重用它的話,或者你僅僅引用你所有的結果映射合到一個單獨描 述的結果映射中。你可以嵌套結果映射。這里給出使用這種方式的相同示例:(干貨——引入了嵌套結果) <resultMap id="blogResult" type="Blog"><id property="id" column="blog_id" /><result property="title" column="blog_title"/><association property="author" javaType="Author"><id property="id" column="author_id"/><result property="username" column="author_username"/><result property="password" column="author_password"/><result property="email" column="author_email"/><result property="bio" column="author_bio"/></association> </resultMap>
2)如果這個博客是由多個作者(聯合作者)撰寫的話,查詢語句select 映射為這個樣子: <selectid="selectBlog"resultMap="blogResult">selectB.id as blog_id,B.title as blog_title,A.id as author_id,A.username as author_username,A.password as author_password,A.email as author_email,A.bio as author_bio,CA.id as co_author_id,CA.username as co_author_username,CA.password as co_author_password,CA.email as co_author_email,CA.bio as co_author_biofrom Blog Bleft outer join Author A on B.author_id = A.idleft outer join Author CA on B.co_author_id = CA.idwhere B.id = #{id} </select> 2.1)調用作者 Author 的resultMap,定義如下: <resultMap id="authorResult" type="Author"><id property="id" column="author_id"/><result property="username" column="author_username"/><result property="password" column="author_password"/><result property="email" column="author_email"/><result property="bio" column="author_bio"/> </resultMap> 2.2)因為結果集中的 列名 不同于 resultMap 中的 列名,你需要指定 columnPrefix 以復用resultMap來映射 聯合作者結果; <resultMap id="blogResult" type="Blog"><id property="id" column="blog_id" /><result property="title" column="blog_title"/><association property="author"resultMap="authorResult" /><association property="coAuthor"resultMap="authorResult"columnPrefix="co_" /> </resultMap>
【5.8】集合 <collection property="posts" ofType="domain.blog.Post"><id property="id" column="post_id"/><result property="subject" column="post_subject"/><result property="body" column="post_body"/> </collection> 1)看個荔枝:?我們來繼續上面的示例,一個博客只有一個作者。但是博客有很多文章。在博客類中, 這可以由下面這樣的寫法來表示:? private List<Post> posts; 【5.8.1】集合的嵌套查詢 1)intro:?使用嵌套查詢來為博客加載文章; <resultMap id="blogResult" type="Blog"><collection property="posts" javaType="ArrayList" column="id" ofType="Post" select="selectPostsForBlog"/> </resultMap><select id="selectBlog" resultMap="blogResult">SELECT * FROM BLOG WHERE ID = #{id} </select><select id="selectPostsForBlog" resultType="Blog">SELECT * FROM POST WHERE BLOG_ID = #{id} </select>

對以上代碼的分析(Analysis): A1)首先,你應 該注意我們使用的是集合元素。然后要注意那個新的“ofType”屬性。這個屬性用來區分 JavaBean(或字段)屬性類型和集合包含的類型來說是很重要的。所以你可以讀出下面這個 映射: <collection property="posts" javaType="ArrayList" column="id" ofType="Post" select="selectPostsForBlog"/> 讀作: “在 Post 類型的 ArrayList 中的 posts 的集合。”

A2)javaType 屬性是不需要的,因為 MyBatis 在很多情況下會為你算出來。所以你可以縮短 寫法: <collection property="posts" column="id" ofType="Post" select="selectPostsForBlog"/> 【5.8.2】集合的嵌套結果 1)至此,你可以猜測集合的嵌套結果是如何來工作的,因為它和關聯完全相同,除了它應 用了一個“ofType”屬性 2)看個荔枝: <select id="selectBlog" resultMap="blogResult">selectB.id as blog_id,B.title as blog_title,B.author_id as blog_author_id,P.id as post_id,P.subject as post_subject,P.body as post_body,from Blog Bleft outer join Post P on B.id = P.blog_idwhere B.id = #{id} </select>

2.1)我們又一次聯合了博客表和文章表,而且關注于保證特性,結果列標簽的簡單映射。現 在用文章映射集合映射博客,可以簡單寫為:

<resultMap id="blogResult" type="Blog"><id property="id" column="blog_id" /><result property="title" column="blog_title"/><collection property="posts" ofType="Post"><id property="id" column="post_id"/><result property="subject" column="post_subject"/><result property="body" column="post_body"/></collection> </resultMap>

2.2)同樣,要記得 id 元素的重要性,如果你不記得了,請閱讀上面的關聯部分。

2.3)同樣, 如果你引用更長的形式允許你的結果映射的更多重用, 你可以使用下面這個替代 的映射:

<resultMap id="blogResult" type="Blog"><id property="id" column="blog_id" /><result property="title" column="blog_title"/><collection property="posts" ofType="Post" resultMap="blogPostResult" columnPrefix="post_"/> </resultMap><resultMap id="blogPostResult" type="Post"><id property="id" column="id"/><result property="subject" column="subject"/><result property="body" column="body"/> </resultMap>

【5.9】鑒別器(switch in java) <discriminator javaType="int" column="draft"><case value="1" resultType="DraftPost"/> </discriminator> 1)intro:??鑒別器非常容易理 解,因為它的表現很像 Java 語言中的 switch 語句。 2)看個荔枝:?定義鑒別器指定了 column 和 javaType 屬性。 列是 MyBatis 查找比較值的地方。 JavaType 是需要被用來保證等價測試的合適類型(盡管字符串在很多情形下都會有用)。比如: <resultMap id="vehicleResult" type="Vehicle"><id property="id" column="id" /><result property="vin" column="vin"/><result property="year" column="year"/><result property="make" column="make"/><result property="model" column="model"/><result property="color" column="color"/><discriminator javaType="int" column="vehicle_type"><case value="1" resultMap="carResult"/><case value="2" resultMap="truckResult"/><case value="3" resultMap="vanResult"/><case value="4" resultMap="suvResult"/></discriminator> </resultMap> 對以上代碼的分析(Analysis):

A1)?在這個示例中, MyBatis 會從結果集中得到每條記錄, 然后比較它的 vehicle 類型的值。如果它匹配任何一個鑒別器的實例,那么就使用這個實例指定的結果映射。

A2)如果沒有任何 一個實例相匹配,那么 MyBatis 僅僅使用鑒別器塊外定義的結果映射。所以,如果 carResult 按如下聲明: <resultMap id="carResult" type="Car"><result property="doorCount" column="door_count" /> </resultMap>

A3)那么只有 doorCount 屬性會被加載。這步完成后完整地允許鑒別器實例的獨立組,盡管 和父結果映射可能沒有什么關系。這種情況下,我們當然知道 cars 和 vehicles 之間有關系, 如 Car 是一個 Vehicle 實例。因此,我們想要剩余的屬性也被加載。我們設置的結果映射的 簡單改變如下。(干貨——想要剩余的屬性也被加載,使用繼承extend) <resultMap id="carResult" type="Car" extends="vehicleResult"><result property="doorCount" column="door_count" /> </resultMap> A4)現在 vehicleResult 和 carResult 的屬性都會被加載了。

3)盡管曾經有些人會發現這個外部映射定義會多少有一些令人厭煩之處。 因此還有另外一 種語法來做簡潔的映射風格。比如:

<resultMap id="vehicleResult" type="Vehicle"><id property="id" column="id" /><result property="vin" column="vin"/><result property="year" column="year"/><result property="make" column="make"/><result property="model" column="model"/><result property="color" column="color"/><discriminator javaType="int" column="vehicle_type"><case value="1" resultType="carResult"><result property="doorCount" column="door_count" /></case><case value="2" resultType="truckResult"><result property="boxSize" column="box_size" /><result property="extendedCab" column="extended_cab" /></case><case value="3" resultType="vanResult"><result property="powerSlidingDoor" column="power_sliding_door" /></case><case value="4" resultType="suvResult"><result property="allWheelDrive" column="all_wheel_drive" /></case></discriminator> </resultMap>

【6】自動映射

1)intro:?通常數據庫列使用大寫單詞命名,單詞間用下劃線分隔;而java屬性一般遵循駝峰命名法。 為了在這兩種命名方式之間啟用自動映射,需要將?mapUnderscoreToCamelCase設置為true。

2)自動映射甚至在特定的result map下也能工作。在這種情況下,對于每一個result map,所有的ResultSet提供的列, 如果沒有被手工映射,則將被自動映射。自動映射處理完畢后手工映射才會被處理。 在接下來的例子中,?id??userName列將被自動映射,?hashed_password?列將根據配置映射。(干貨——自動映射處理完畢后手工映射才會被處理)

3)看個荔枝

<selectid="selectUsers"resultMap="userResultMap">selectuser_id as "id",user_name as "userName",hashed_passwordfrom some_tablewhere id = #{id} </select>

<resultMap id="userResultMap" type="User"><result property="password" column="hashed_password"/> </resultMap> 4)There are three auto-mapping levels:(3個自動映射級別)
  • NONE?- disables auto-mapping. Only manually mapped properties will be set.
  • PARTIAL?- will auto-map results except those that have nested result mappings defined inside (joins).(默認級別)
  • FULL?- auto-maps everything.

4.1)將PARTIAL 設置為默認級別的原因:The default value is?PARTIAL, and it is so for a reason. When?FULL?is used auto-mapping will be performed when processing join results and joins retrieve data of several different entities in the same row hence this may result in undesired mappings.?

4.2)To understand the risk have a look at the following sample:

<selectid="selectBlog"resultMap="blogResult">selectB.id,B.title,A.username,from Blog B left outer join Author A on B.author_id = A.idwhere B.id = #{id} </select>

<resultMap id="blogResult" type="Blog"><association property="author" resultMap="authorResult"/> </resultMap><resultMap id="authorResult" type="Author"><result property="username" column="author_username"/> </resultMap>

Analysis of the sample) ?With this result map both?Blog?and?Author?will be auto-mapped. But note that?Author?has an?id?property and there is a column named?id?in the ResultSet so Author's id will be filled with Blog's id, and that is not what you were expecting. So use the?FULL?option with caution.

4.3)Regardless of the auto-mapping level configured you can enable or disable the automapping for an specific ResultMap by adding the attribute?autoMapping?to it:?(干貨——添加 autoMapping屬性)

<pre name="code" class="html"><resultMap id="userResultMap" type="User" autoMapping="false"><result property="password" column="hashed_password"/> </resultMap>

【7】緩存

1)intro:?默認情況下是沒有開啟緩存的,除了局部的 session 緩存,可以增強變現而且處理循環 依賴也是必須的。要開啟二級緩存,你需要在你的 SQL 映射文件中添加一行:

<cache/>

對以上代碼的分析(Analysis):?這個簡單語句的效果如下:

  • 映射語句文件中的所有 select 語句將會被緩存。
  • 映射語句文件中的所有 insert,update 和 delete 語句會刷新緩存。
  • 緩存會使用 Least Recently Used(LRU,最近最少使用的)算法來收回。
  • 根據時間表(比如 no Flush Interval,沒有刷新間隔), 緩存不會以任何時間順序 來刷新。
  • 緩存會存儲列表集合或對象(無論查詢方法返回什么)的 1024 個引用。
  • 緩存會被視為是 read/write(可讀/可寫)的緩存,意味著對象檢索不是共享的,而 且可以安全地被調用者修改,而不干擾其他調用者或線程所做的潛在修改。

2)?所有的這些屬性都可以通過緩存元素的屬性來修改。比如: <pre name="code" class="html"><cacheeviction="FIFO"flushInterval="60000"size="512"readOnly="true"/> 對以上代碼的分析(Analysis):?這個更高級的配置創建了一個 FIFO 緩存,并每隔 60 秒刷新,存數結果對象或列表的 512 個引用,而且返回的對象被認為是只讀的,因此在不同線程中的調用者之間修改它們會 導致沖突。
3)可用的收回策略有:
  • LRU?– 最近最少使用的:移除最長時間不被使用的對象。(默認策略)
  • FIFO?– 先進先出:按對象進入緩存的順序來移除它們。
  • SOFT?– 軟引用:移除基于垃圾回收器狀態和軟引用規則的對象。
  • WEAK?– 弱引用:?更積極地移除基于垃圾收集器狀態和弱引用規則的對象。

Supplement)

supplement1)flushInterval(刷新間隔):可以被設置為任意的正整數,而且它們代表一個合理的毫秒 形式的時間段。默認情況是不設置,也就是沒有刷新間隔,緩存僅僅調用語句時刷新。

supplement2)size(引用數目):可以被設置為任意正整數,要記住你緩存的對象數目和你運行環境的 可用內存資源數目。默認值是 1024。

supplement3)readOnly(只讀)屬性: 可以被設置為 true 或 false。只讀的緩存會給所有調用者返回緩 存對象的相同實例。因此這些對象不能被修改。這提供了很重要的性能優勢。可讀寫的緩存 會返回緩存對象的拷貝(通過序列化) 。這會慢一些,但是安全,因此默認是 false。

【7.1】使用自定義緩存

1)intro:?你也可以通過實現你自己的緩存或為其他第三方緩存方案 創建適配器來完全覆蓋緩存行為。(干貨——自定義緩存)

<cache type="com.domain.something.MyCustomCache"/>

對以上代碼的分析(Analysis):

A1)type 屬 性指 定的 類必 須實現 org.mybatis.cache.Cache 接口。

public interface Cache {String getId();int getSize();void putObject(Object key, Object value);Object getObject(Object key);boolean hasKey(Object key);Object removeObject(Object key);void clear(); } 2)看個荔枝 :要配置你的緩存, 簡單和公有的 JavaBeans 屬性來配置你的緩存實現, 而且是通過 cache 元素來傳遞屬性,比如, 下面代碼會在你的緩存實現中調用一個稱為 “setCacheFile(String file)” 的方法: <cache type="com.domain.something.MyCustomCache"><property name="cacheFile" value="/tmp/my-custom-cache.tmp"/> </cache>

3)記得緩存配置和緩存實例是綁定在 SQL 映射文件的命名空間是很重要的。因此,所有 在相同命名空間的語句正如綁定的緩存一樣。 語句可以修改和緩存交互的方式, 或在語句的 語句的基礎上使用兩種簡單的屬性來完全排除它們。默認情況下,語句可以這樣來配置:?

<select ... flushCache="false" useCache="true"/> <insert ... flushCache="true"/> <update ... flushCache="true"/> <delete ... flushCache="true"/>

對以上代碼的分析(Analysis) : 因為那些是默認的,你明顯不能明確地以這種方式來配置一條語句。相反,如果你想改 變默認的行為,只能設置 flushCache 和 useCache 屬性。比如,在一些情況下你也許想排除 從緩存中查詢特定語句結果,或者你也許想要一個查詢語句來刷新緩存。相似地,你也許有 一些更新語句依靠執行而不需要刷新緩存。(干貨——如果你想改 變默認的行為,只能設置 flushCache 和 useCache 屬性)

【7.2】參照緩存

1)回想一下上一節內容, 這個特殊命名空間的唯一緩存會被使用或者刷新相同命名空間內 的語句。也許將來的某個時候,你會想在命名空間中共享相同的緩存配置和實例。在這樣的 情況下你可以使用 cache-ref 元素來引用另外一個緩存。

cache-refnamespace="com.someone.application.data.SomeMapper"/>

總結

以上是生活随笔為你收集整理的mybatis_user_guide(4) Mapper XML 文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

a资源在线| 在线观看国产91 | 天天综合网天天综合色 | 一区二区视频播放 | 丰满少妇在线观看资源站 | 国产精品午夜在线 | 日本三级国产 | 久久综合给合久久狠狠色 | 日韩欧美在线观看一区二区 | 天天操天天草 | 婷婷色中文字幕 | 婷婷亚洲五月 | 国产高清视频在线播放一区 | 91精品国产福利在线观看 | 国产极品尤物在线 | 最新av网站在线观看 | 欧美精选一区二区三区 | 成人a视频片观看免费 | 96久久欧美麻豆网站 | 欧美日韩高清一区二区 国产亚洲免费看 | 欧美午夜精品久久久久久浪潮 | 美女网色 | 久久久久久久久久久久久9999 | 日本精品久久久一区二区三区 | 日韩免费不卡视频 | 色国产在线 | 日韩欧美国产视频 | 黄色在线免费观看网站 | 婷婷丁香色综合狠狠色 | www.色五月.com | 亚洲精品国产免费 | 狠狠做深爱婷婷综合一区 | 久草在线高清 | 91成人天堂久久成人 | 丁香婷婷网 | 丰满少妇高潮在线观看 | 午夜影院一级片 | 99精品国产免费久久久久久下载 | 中文字幕精品一区二区精品 | 国产精品18久久久久久不卡孕妇 | www五月| av综合av| 中文字幕黄色av | 亚洲人在线7777777精品 | 六月丁香激情综合色啪小说 | 三级黄色网址 | 黄色大全视频 | 国产精品国产三级在线专区 | 久久久久免费 | 精品久久久久久久久久久久久 | 免费在线观看日韩欧美 | 久久天天躁狠狠躁夜夜不卡公司 | 亚洲专区一二三 | 亚洲妇女av | www.天天射 | 国产精品99精品久久免费 | 麻豆视频观看 | 国产福利av在线 | 亚洲成人软件 | 久在线 | 久久久久夜色 | 亚洲精品一区二区精华 | 亚洲高清资源 | 亚洲精品乱码久久久久久高潮 | 九九视频在线播放 | 国产一区麻豆 | 一二三四精品 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 超级碰碰碰免费视频 | 粉嫩av一区二区三区免费 | 国产精品永久久久久久久久久 | 青青河边草免费直播 | 久草在线免费新视频 | 亚洲精品视频在线免费 | 超碰在线日韩 | 中文字幕av在线电影 | 黄色小视频在线观看免费 | 奇米影音四色 | 国产精品一区一区三区 | 500部大龄熟乱视频使用方法 | 亚洲精品午夜国产va久久成人 | av高清在线 | 国产精品情侣视频 | 国产亚洲精品成人av久久ww | 亚洲国产精品成人av | 午夜av电影院 | wwwwwww色| 亚洲综合欧美精品电影 | 久久精品久久久久电影 | 亚洲综合黄色 | 免费看高清毛片 | 少妇做爰k8经典 | 亚洲精品麻豆视频 | 国产韩国日本高清视频 | www黄色com| 91精品国产入口 | 在线看片成人 | 久久精品国产亚洲精品2020 | 人人爱爱| 国产91探花 | 俺要去色综合狠狠 | 成人观看 | 中文字幕在线高清 | 玖玖在线资源 | 成年人在线观看 | 99草视频 | 亚洲午夜精品一区二区三区电影院 | 成人午夜黄色影院 | 欧美日韩在线免费观看视频 | 日韩毛片久久久 | 欧美日韩免费视频 | 免费精品视频 | 91麻豆精品国产91久久久久久 | 探花国产在线 | 免费看黄的 | 在线 国产 日韩 | 国产一及片 | 亚洲精品字幕在线 | 在线欧美最极品的av | 日本中文字幕高清 | 中文永久免费观看 | 欧美不卡视频在线 | 日韩理论片中文字幕 | 亚洲精品久久久久www | 在线免费高清 | 天天久久夜夜 | 免费的成人av| 高清国产午夜精品久久久久久 | 特级黄色片免费看 | 一区二区 久久 | 国产精品一区二区三区久久久 | 九九电影在线 | 91成人免费看 | 久久激情五月丁香伊人 | 亚洲人成在线观看 | 午夜日b视频| 欧美另类美少妇69xxxx | 深夜福利视频在线观看 | 国产精品乱码一区二区视频 | 看片黄网站 | 中文字幕免费中文 | 一区二区三区四区五区在线视频 | 亚洲视频资源在线 | 国产老太婆免费交性大片 | 日韩视频免费观看高清 | 亚洲精品乱码久久久久久久久久 | 91在线小视频 | 久久精品网站视频 | 久久久久久久久久久福利 | 天天翘av | 久久中文字幕在线视频 | av免费网页 | 日本激情视频中文字幕 | 99精品久久99久久久久 | 香蕉在线视频播放网站 | 久久丁香网 | 久久久久久久久久久国产精品 | 日日爱视频 | 中文字幕a∨在线乱码免费看 | 999久久久久久 | 日本韩国精品在线 | 久久这里只有精品久久 | 黄色小网站在线 | 欧美在线观看视频 | 99精品久久只有精品 | 国产免费国产 | 9ⅰ精品久久久久久久久中文字幕 | 97超碰在线免费 | 日韩免费高清 | 日韩视频欧美视频 | 久久久久免费精品国产 | 欧美在线观看禁18 | 精品久久久久久久久久久久久久久久久久 | 欧美坐爱视频 | 日日夜夜精品视频 | 欧美一进一出抽搐大尺度视频 | 亚洲成人黄色在线 | 伊人婷婷激情 | 亚洲成人国产精品 | 欧美a在线免费观看 | 狠狠狠狠狠狠狠 | 91香蕉久久| 亚洲精品久久久久久久蜜桃 | 美女视频黄网站 | 欧美乱熟臀69xxxxxx | 久久精品久久久精品美女 | 国产精品粉嫩 | 六月丁香婷婷久久 | 高清av在线免费观看 | 国产视频手机在线 | 五月香婷| 国产不卡片 | 丁香婷婷激情 | 亚洲黄色在线免费观看 | 日韩在线视频免费播放 | 欧美大片第1页 | 欧美色图88| 国产精品久久久久免费a∨ 欧美一级性生活片 | 欧美一区二区三区四区夜夜大片 | 午夜在线免费观看 | 久久精品中文字幕免费mv | 亚洲撸撸| 狠狠狠狠狠狠狠 | 国产系列在线观看 | 成人污视频在线观看 | 国产 视频 高清 免费 | 久久精品1区 | 天天操天天爱天天干 | 亚洲在线视频观看 | 特黄特黄的视频 | 成人在线超碰 | 99精品国产福利在线观看免费 | 久久草草热国产精品直播 | 国产成人精品一区在线 | av不卡免费在线观看 | 免费亚洲视频在线观看 | 在线探花| 成人av地址 | 草久热| 亚洲人成在| 韩国一区二区在线观看 | 久久香蕉电影 | 国内99视频 | 久久伦理电影网 | 黄色免费大全 | 欧美精品中文在线免费观看 | 九九热视频在线免费观看 | 国产精品免费久久久久久久久久中文 | 亚洲午夜久久久久久久久电影网 | 国产高清专区 | 女人魂免费观看 | www.久热 | 91视频在线观看大全 | www.夜夜夜| 最近中文字幕mv免费高清在线 | 五月婷网站 | 国产精品自产拍在线观看蜜 | 国产精品久久久久999 | 精品一区二区三区四区在线 | 日韩欧美一区二区三区在线观看 | 偷拍福利视频一区二区三区 | 午夜视频播放 | 久草精品电影 | 成人网大片 | 国产精品久久久久aaaa九色 | 中文字幕色婷婷在线视频 | 日韩视频中文字幕在线观看 | 久久久久久久久久久国产精品 | 日韩理论在线视频 | 在线中文视频 | 久久综合网色—综合色88 | 婷婷成人综合 | 成人一区二区三区中文字幕 | 在线观看免费成人av | 69亚洲乱| 国产精品国产亚洲精品看不卡15 | 日韩成人邪恶影片 | 色www. | 久久99国产精品久久99 | 久草视频在 | 夜夜操天天干 | 天天天操天天天干 | 国产成人久久av免费高清密臂 | .精品久久久麻豆国产精品 亚洲va欧美 | 欧美精品亚洲精品日韩精品 | 国产精品一区二区白浆 | 久久在线电影 | 激情综合一区 | 成人在线观看日韩 | 九九视频精品免费 | 久草在线精品观看 | 毛片永久新网址首页 | 久久精品国产亚洲精品 | 日日夜夜网站 | 丁香综合网 | 久久永久免费 | 日韩色在线 | 波多野结衣在线观看一区二区三区 | 国产麻豆剧果冻传媒视频播放量 | 亚洲理论在线观看电影 | 国产成人黄色av | 国产欧美精品一区二区三区四区 | 在线观看你懂的网站 | 久久艹影院 | 91刺激视频 | 日韩试看| 日韩在线观看第一页 | 丁香花在线观看视频在线 | 操操综合| 亚洲综合在线五月天 | 免费黄色在线播放 | 亚洲视频一区二区三区在线观看 | www.xxxx变态.com| 日韩一级电影在线 | 亚洲视频电影在线 | 激情开心站 | 97超碰色偷偷 | 欧美成人基地 | 999男人的天堂 | 成人a免费视频 | 免费进去里的视频 | 国产亲近乱来精品 | 久久精品视频网站 | 久久激情五月婷婷 | 国产一二三四在线观看视频 | 精品视频在线免费观看 | 久久99九九99精品 | 久久久久中文 | 精品久久久久一区二区国产 | 欧美老少交 | 婷婷夜夜 | 精品中文字幕在线播放 | 国产精品久久久久久久7电影 | 探花视频在线观看+在线播放 | 在线观看91精品视频 | 中文资源在线播放 | 91麻豆看国产在线紧急地址 | 天天插天天狠天天透 | 国产二区视频在线 | 久久免费国产精品1 | www.com在线观看 | 久久在线影院 | 97高清视频 | 亚洲精品白浆高清久久久久久 | 在线观看91av| 国产美女免费看 | 911久久 | 久久久在线观看 | 日韩一区二区三区高清免费看看 | 国产精品久久9 | 免费视频91 | 国产成人1区 | 99久久婷婷国产综合精品 | 91视频久久久 | 天堂av在线中文在线 | 国产精品女主播一区二区三区 | 超碰97久久| 欧美性脚交 | 欧美三级在线播放 | 97色在线视频 | 日韩黄在线观看 | 在线日韩亚洲 | 国产日韩欧美视频在线观看 | 中文字幕在线观看一区 | 在线99| av大片免费在线观看 | 亚洲国产影院 | 亚洲一区网站 | 国产精品女人网站 | 欧美一级电影 | 欧美婷婷色 | 成人久久18免费网站 | 在线黄色观看 | 国产一级片网站 | 蜜臀av夜夜澡人人爽人人 | 免费一级日韩欧美性大片 | 久久99国产视频 | 人人插人人射 | 高清一区二区三区 | 国产精品都在这里 | 日韩精品专区在线影院重磅 | 开心色婷婷| 国产激情小视频在线观看 | 91最新在线观看 | 精品999久久久 | 91重口视频 | 天天弄天天操 | 91久久在线观看 | 国产黄色av| 日韩激情视频在线观看 | 五月婷婷丁香在线观看 | 久久久精品电影 | 亚洲国产欧美一区二区三区丁香婷 | 国产精品久久久久高潮 | 日韩在线视频看看 | 超碰在线成人 | 黄色电影网站在线观看 | 欧美日韩另类在线观看 | 日韩在线小视频 | 国产精品综合久久久久久 | 在线观看国产v片 | 91精品国自产拍天天拍 | 久久成人黄色 | h视频日本| av在线免费网 | 久久婷婷国产色一区二区三区 | 天天操综 | 精品免费一区二区三区 | 日日夜夜综合 | 国产视频久久久 | 最新av网址在线 | 中文字幕av在线播放 | 又黄又爽又刺激 | 99热国产在线观看 | 久久99精品一区二区三区三区 | 91污污 | av国产网站 | 日韩一级理论片 | 99婷婷狠狠成为人免费视频 | 日日干天天爽 | 中文字幕视频一区二区 | 精品在线观看一区二区 | 日本中文字幕在线 | 精品国产一区二区三区av性色 | 人人揉人人揉人人揉人人揉97 | 丁香影院在线 | 成年人在线免费看 | 在线观看日韩视频 | 色综合www | 国产资源网 | 日韩国产精品毛片 | 中文字幕av最新更新 | 国产精品二区在线观看 | 久久久久久久久久久网站 | 国产在线观看污片 | 蜜桃视频精品 | 91福利视频免费 | 天天干天天干天天 | 国产精品免费成人 | 激情综合色播五月 | 99在线免费视频 | 日韩欧美国产视频 | 久久久网站| 波多野结衣电影久久 | 欧美极品少妇xbxb性爽爽视频 | 精品一区二区三区久久久 | 精品在线播放视频 | 成人在线观看影院 | 18国产精品福利片久久婷 | 91久久精品一区二区二区 | 9999在线视频 | 久草精品免费 | 福利视频第一页 | 99久久精品免费 | 欧美日韩高清国产 | 亚洲婷婷丁香 | 国产在线91精品 | 久久久麻豆精品一区二区 | 香蕉在线播放 | 精选久久 | 日本在线观看视频一区 | 久久女教师 | 国产在线观看二区 | 日本黄色免费大片 | 日韩免费中文字幕 | 在线看国产日韩 | 91精品伦理| av网站在线观看免费 | 精品综合久久 | 热久久影视 | 黄色毛片大全 | 久久不卡免费视频 | 99久久一区 | 黄色的网站免费看 | 天天干天天操天天射 | 手机在线日韩视频 | 毛片网站在线 | 国产视频午夜 | 亚洲精品国产日韩 | 国产视频一区二区在线播放 | 久久99在线观看 | a√资源在线 | 五月天激情视频在线观看 | 超碰激情在线 | 一级一片免费观看 | 色偷偷88欧美精品久久久 | 久久综合狠狠综合久久狠狠色综合 | 五月天狠狠操 | 国产女人40精品一区毛片视频 | 亚洲人人av | 国产精品专区在线 | 亚洲黄色免费电影 | 成人精品视频久久久久 | 国产亚洲欧美在线视频 | 五月婷婷欧美视频 | 亚洲精品国产精品国自 | 麻豆国产露脸在线观看 | 青青河边草免费视频 | 国产拍揄自揄精品视频麻豆 | 婷婷日日 | 国产精品永久免费观看 | 激情欧美一区二区三区免费看 | 操操操人人 | 在线观看黄色小视频 | 又黄又爽又刺激 | 丁香久久婷婷 | 国产999在线 | 欧美91精品国产自产 | 久久夜夜夜 | 天天操天天操天天操天天操天天操天天操 | 亚洲黄色av网址 | 欧美一级免费片 | 久久福利小视频 | 成人午夜电影在线播放 | 国语麻豆 | 国产视频在线观看一区 | 最近字幕在线观看第一季 | 波多野结衣在线中文字幕 | 日韩精品免费在线观看视频 | 亚洲最大激情中文字幕 | 色婷婷视频在线观看 | 久操伊人 | 国产高h视频 | 狠狠色丁香婷婷综合久小说久 | 99久久久| 日韩黄色在线 | 久久99精品久久久久久久久久久久 | 在线观看国产日韩 | 国产丝袜 | 亚洲精品一区二区三区新线路 | 日韩欧美视频免费观看 | av成人亚洲 | 精品影院一区二区久久久 | 日韩在线三级 | 九色福利视频 | 欧美中文字幕第一页 | 不卡中文字幕在线 | 91探花系列在线播放 | 日韩和的一区二在线 | 夜夜躁狠狠躁 | 日韩av资源站 | 在线播放 日韩专区 | 69夜色精品国产69乱 | 色综合久久久久综合 | 开心激情五月网 | 婷婷深爱网 | 亚洲一区黄色 | 久久久精品国产一区二区 | 九色视频网站 | 欧美精品国产综合久久 | 丁香久久激情 | 久草视频网 | 亚洲精品www | 亚洲精品1区2区3区 超碰成人网 | 日本精品在线看 | 久久国产精品免费观看 | 米奇狠狠狠888 | 国产精品九色 | 久久99这里只有精品 | 国产自在线 | 午夜久久福利 | 国产原创在线观看 | 亚洲草视频 | 国产很黄很色的视频 | 日韩精品视频在线免费观看 | 91精品久久香蕉国产线看观看 | 日韩中文字幕免费视频 | 狠狠干美女 | 欧美日韩综合在线观看 | 国产美女永久免费 | 国产青春久久久国产毛片 | 毛片视频网址 | 国产 欧美 日产久久 | 在线国产日韩 | 国产精彩视频 | 亚洲成av片人久久久 | 精品国产1区 | 欧美久久久久久久久久 | 99理论片 | av永久网址 | 亚洲草视频| 亚洲免费av网站 | 国产精选在线观看 | 天天干天天干天天干 | 国产精品九色 | 99c视频高清免费观看 | 在线观看国产高清视频 | 久久国产精品一国产精品 | av福利在线导航 | 91av成人 | 成人免费视频观看 | 日本最新一区二区三区 | 色窝资源 | 国产黄色精品 | 不卡中文字幕av | 2023国产精品自产拍在线观看 | 99精品久久久 | 日韩欧美视频一区 | 久久99在线观看 | 国产午夜精品一区二区三区 | 欧美日韩中 | 91网在线 | 人人澡人人澡人人 | 在线免费观看视频a | 91精品久久久久久久久久久久久 | 999视频网站| 国产亚洲精品免费 | 在线免费观看羞羞视频 | 亚洲第一av在线 | 婷婷综合导航 | 日韩天堂在线观看 | 亚洲精品久久久久999中文字幕 | 午夜精品婷婷 | 蜜臀av性久久久久av蜜臀妖精 | 久久久久国产一区二区 | 久久人人精品 | 久久精品国产精品亚洲精品 | 日韩在线国产 | 欧美色图亚洲图片 | 亚洲夜夜爽 | 最新av在线免费观看 | 日韩字幕| 综合网在线视频 | 日韩r级电影在线观看 | 久久久黄色免费网站 | 亚洲一区二区三区四区在线视频 | 精品国产片 | 极品久久久久久久 | 国产精品免费久久 | 日本在线观看一区二区三区 | 日韩高清在线一区 | 丁香国产视频 | 一区二区三区电影大全 | 最近中文字幕在线 | 日本在线h | 免费观看版 | 婷婷激情五月综合 | 国产在线观看,日本 | 最近中文国产在线视频 | 欧洲激情在线 | 黄色日本片 | 中文字幕一区二区三区精华液 | 91手机电影| 久久精品国产一区二区三区 | 国产精品美女久久 | 亚洲电影久久久 | 在线观看自拍 | 狠狠操狠狠干天天操 | 国产精品视频在线看 | 婷婷av网 | 国产91学生粉嫩喷水 | 九色精品在线 | 中文av影院 | 成年人免费观看国产 | 天天干天天想 | 中文字幕乱码视频 | 亚洲国产精品成人女人久久 | 国产一区二区三区高清播放 | a在线免费观看视频 | 精品一二三四五区 | av中文资源在线 | 国产99视频在线观看 | 国产专区免费 | 91麻豆国产福利在线观看 | 麻豆视频在线 | 欧美精品v国产精品v日韩精品 | 99久久电影 | 国产999在线 | 久久久福利 | 午夜精品久久久久久久久久久 | av在线进入 | 久久艹艹 | 欧美一级片在线观看视频 | 国产精品久久99综合免费观看尤物 | 在线免费av电影 | 国产精品久久久久av福利动漫 | 午夜在线观看影院 | 网站免费黄色 | 97国产精品亚洲精品 | 性色av一区二区三区在线观看 | 九九精品久久 | 国产中文字幕亚洲 | 天天激情 | 久久精品免视看 | 亚洲美女视频网 | 国产精品丝袜久久久久久久不卡 | 99精品国产99久久久久久福利 | 美女久久精品 | 狠狠干干| 国产精品午夜在线观看 | 免费亚洲精品 | 91久久黄色 | 久久欧美视频 | 手机在线观看国产精品 | 国产免费不卡 | 久久在线 | 国产精品久久久久久婷婷天堂 | 免费福利影院 | 视频在线在亚洲 | 在线观看亚洲精品视频 | 在线岛国av| 欧美专区日韩专区 | 69欧美视频 | 91精品一区二区在线观看 | 亚洲国产中文字幕在线观看 | 区一区二在线 | 精品亚洲成a人在线观看 | 国产美女视频免费 | 亚洲第一区在线观看 | 中文字幕大全 | 欧美天天综合网 | 色七七亚洲影院 | 国产精品久久毛片 | 超碰在线中文字幕 | 国产成人免费在线 | 久久久精品日本 | 久草| 97网在线观看 | 伊人天天操 | 久久久视频在线 | 日韩欧美视频二区 | 国产精品成人自产拍在线观看 | 久久人操 | 久久乐九色婷婷综合色狠狠182 | 国产一卡二卡四卡国 | 91精品对白一区国产伦 | 国产亚洲人成网站在线观看 | 中文字幕免费观看全部电影 | 一区二区三区免费在线播放 | 亚州精品视频 | 国产美女免费观看 | 国产精品网红直播 | 国产亚洲精品综合一区91 | 亚洲精品在线免费 | 最新av免费 | 日批在线观看 | 一区二区视频在线免费观看 | 日韩在线网址 | 久久夜色网| 久久在视频 | 免费黄在线看 | 国产丝袜 | 亚洲精品黄| 亚洲aⅴ在线 | 超碰人人草人人 | 亚洲最大免费成人网 | 国产五月天婷婷 | 久久久久久久久久毛片 | 久久伦理电影网 | 欧美激情综合五月色丁香 | 国产精品久久久久久久久久久不卡 | 一区二区三区电影在线播 | 波多野结衣在线播放视频 | 欧美日韩不卡在线视频 | 精品在线亚洲视频 | 久久只有精品 | 96看片 | 夜夜爽www | 国产视频精品视频 | 热久久最新地址 | 免费视频久久久久久久 | 99av在线视频 | 久久久久久久久久久久99 | 久久久久欠精品国产毛片国产毛生 | 亚洲精品国偷拍自产在线观看蜜桃 | 天天摸夜夜添 | 在线免费视频一区 | 久久字幕网 | 国产精品成人久久久久 | 人人插人人插 | 超碰97人人在线 | 国产精品久久亚洲 | 亚洲综合网站在线观看 | 黄色一级免费 | 干av在线 | 亚洲精品免费播放 | 在线观看深夜福利 | 亚洲最新视频在线播放 | 精品美女视频 | 亚洲国产人午在线一二区 | 久久久久免费精品国产小说色大师 | 国色天香av | 亚洲国产日韩一区 | 五月婷婷导航 | 久草精品电影 | 国产成人精品一区二区三区福利 | 九色最新网址 | 久久草精品 | 97在线影院 | 国产免费一区二区三区最新 | 免费视频久久 | 成人av一二三区 | 国产成人精品在线 | 高清不卡一区二区三区 | 国产精品久久久久久超碰 | 91精品久久久久久久久 | 五月婷网 | 亚洲最新av | 国内精品久久久久 | 不卡的av | 婷婷伊人五月天 | 天堂资源在线观看视频 | 国产精品久久久久久久久久了 | 国际精品久久久 | 成人91在线| 久久99久久99精品中文字幕 | 午夜国产在线观看 | 国产免费黄视频在线观看 | 日韩中文字幕免费在线播放 | 亚洲国产精品成人综合 | 久久精品91视频 | 免费a级毛片在线看 | 91香蕉久久 | 日韩午夜av | av在线永久免费观看 | 国产精品欧美久久久久无广告 | 一区二区三区在线播放 | 久久国产精品99精国产 | 亚洲最新视频在线播放 | 久久亚洲成人网 | 亚洲伊人成综合网 | 成人一区影院 | 国产精品久久久久久久久久东京 | 日韩视频三区 | 欧美日韩在线观看一区二区三区 | 808电影 | 欧美日韩视频在线观看一区二区 | 激情婷婷久久 | 亚洲精品美女久久久久 | 天堂av网站| 天天操天天吃 | 日日干网 | 超碰人人在 | 国产午夜精品一区二区三区四区 | 黄色免费大全 | www.五月天 | 最新精品国产 | 亚洲欧美国产精品久久久久 | 国产伦理一区二区 | 久久久久久久久久伊人 | 不卡视频在线 | 91黄视频在线 | 99久e精品热线免费 99国产精品久久久久久久久久 | 天堂va欧美va亚洲va老司机 | 国产一区二区网址 | 国产又粗又猛又色又黄视频 | 久久久综合电影 | 日韩美在线 | 婷婷精品国产一区二区三区日韩 | 国产精品大片免费观看 | 91片网| 欧美日韩精品在线观看视频 | 国产91av视频在线观看 | 精品亚洲免a | 免费午夜在线视频 | 一级黄网 | 毛片网免费 | 国产一级久久久 | 91九色蝌蚪在线 | 日本久久视频 | 二区视频在线观看 | 亚洲一区二区三区在线看 | 免费看91的网站 | 日韩黄色一区 | 国产破处精品 | av中文字幕av | 亚洲精品视频网址 | 在线免费观看黄色小说 | 五月亚洲 | 久久久久久草 | 色婷婷综合视频在线观看 | av免费播放| 国产玖玖在线 | 国产精品久久久久久久久岛 | 婷婷亚洲激情 | 免费观看国产视频 | 成人久久18免费网站 | 日韩欧美一二三 | 视频在线观看99 | 国产五月| 免费观看黄 | 国产免费久久精品 | 亚洲va综合va国产va中文 | 久99久精品 | 成人免费精品 | 日本系列中文字幕 | 日本一区二区三区免费观看 | 人人玩人人添人人澡超碰 | 亚洲视频电影在线 | 国产精品久久久电影 | 黄色毛片一级片 | 中文字幕一区在线观看视频 | 国产成人在线观看免费 | 日韩高清毛片 | 天堂av影院 | 国产一级二级在线观看 | 国精产品999国精产 久久久久 | 色国产精品 | 99精品视频网站 | 亚洲精品videossex少妇 | 久久,天天综合 | 国产正在播放 | 在线 你懂 | 亚洲午夜精品久久久久久久久 | 69视频永久免费观看 | 91精品久久久久久久99蜜桃 | 国产精品国产三级国产aⅴ入口 | 国内精品免费 | 日韩视频a | 国产精品美女久久久免费 | 国产一区二区在线播放 | 日本中文字幕高清 | 在线看片一区 | 成人一区二区三区在线 | 国语精品久久 | 999久久久 | 激情喷水 | 国产一区二区三区 在线 | 在线黄网站 | 国产精品日韩精品 | 久久免费播放视频 | 美腿丝袜一区二区三区 | 日韩特黄一级欧美毛片特黄 | 黄色三级免费片 | 久久99国产综合精品免费 | 麻豆国产精品永久免费视频 | 黄色毛片视频免费观看中文 | 久久综合成人网 | 久草资源在线 | 一区二区三区四区五区在线 | 91久久国产综合精品女同国语 | 中文字幕日本在线 | 免费福利片2019潦草影视午夜 | 一区二区精品视频 | 在线成人一区二区 | 国产剧在线观看片 | 人人爽人人片 | 四虎影视成人永久免费观看视频 | 99久久精| 超碰国产97| 欧美激情视频一区二区三区免费 | 91高清在线看| 最近免费观看的电影完整版 | 精品久久久久久亚洲综合网 | 成人高清在线观看 | 精品国产美女在线 | 欧美巨乳波霸 | 九九九热视频 | 天天射天天干 | 欧美成人高清 | 国产一区二区三区网站 | 国内小视频在线观看 | 天天天在线综合网 | 欧美一区视频 | 国产黄视频在线观看 | 日韩大片免费观看 | 国产91aaa| 精品免费视频123区 午夜久久成人 | 亚洲精品大片www | 伊人五月综合 | 九九综合久久 | 日本三级在线观看中文字 | 欧美a级一区二区 | 欧美一级免费片 | www.神马久久 | 涩涩伊人| 啪啪资源 | 日韩中文字幕电影 | 久久精品2| 亚洲精品视频在线免费 | 天天操操操操操操 | 精品在线小视频 | x99av成人免费 | 99热精品国产一区二区在线观看 | 国产精品va最新国产精品视频 | 精品免费视频123区 午夜久久成人 | 国产精品毛片久久久久久 | 婷婷婷国产在线视频 | 91人人澡 | 国产资源在线免费观看 | 日韩精品中文字幕在线不卡尤物 | 精品在线亚洲视频 | 美女免费视频观看网站 | 亚洲在线免费视频 | 9在线观看免费高清完整版 玖玖爱免费视频 | 天天天天天天干 | 午夜精品一区二区三区在线 | 日本精品久久 | 国产精品 欧美 日韩 | 韩国av免费观看 | 久久久免费电影 | 免费看黄在线网站 | 久久艹在线观看 | 91av中文| 国产玖玖精品视频 | 日日躁夜夜躁aaaaxxxx | 国产精品一区二区三区电影 | 九九热99视频 | www免费在线观看 | 香蕉成人在线视频 | 国产一区二区精品 | av五月婷婷 | 日韩欧美视频一区二区三区 | 欧美日韩精品在线观看 | 久久久久久福利 | 黄色一级免费电影 | 午夜视频免费在线观看 | 黄色三级免费 | 安徽妇搡bbbb搡bbbb | 91九色网站 | 久久免费视频精品 | 国产黄色片在线 | 久久国产精品99久久久久久丝袜 | 日韩色中色 | 9在线观看免费高清完整版在线观看明 | 成人动图 | 欧美一区日韩精品 | 99视频精品在线 |