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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Mybatis持久层开发

發布時間:2023/12/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mybatis持久层开发 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • Mybatis持久層開發簡要步驟
    • 概述:
    • 示例:
    • 總結:
    • 注意要點:
      • 基于Mapper代理的示例
      • 基于注解的示例
    • 應用場景:
      • 主鍵返回
      • 批量查詢
      • 動態SQL
      • 緩存
      • 關聯查詢
      • 延遲加載
      • 逆向工程
      • PageHelper分頁插件
      • Mybatis Plus

Mybatis持久層開發簡要步驟

概述:

1.編寫全局配置文件

2.編寫mapper映射文件

3.加載全局配置文件,生成SqlSessionFactory

4.創建SQLSession,調用mapper映射文件中的SQL語句來執行CRUD操作

注:CRUD是4個單詞的首字母,CRUD分別指增加(Create)、讀取查詢(Retrieve)、更新(Update)和刪除(Delete)這4個單詞的首字母。

示例:

1.使用MySQL命令行或某些數據庫可視化軟件創建一張student表

2.打開IDEA創建一個Maven項目

3.導入依賴的jar包

<dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.10</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.6</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version><scope>provided</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.10</version><scope>test</scope></dependency></dependencies>

4.創建一個類

package com.yogurt.po;import lombok.*;@Getter @Setter @NoArgsConstructor @AllArgsConstructor @ToString public class Student {private Integer id;private String name;private Integer score;private Integer age;private Integer gender;}

5.編寫mapper映射文件(編寫SQL語句)

<!-- StudentMapper.xml --> <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="test"><select id="findAll" resultType="com.yogurt.po.Student">SELECT * FROM student;</select><insert id="insert" parameterType="com.yogurt.po.Student">INSERT INTO student (name,score,age,gender) VALUES (#{name},#{score},#{age},#{gender});</insert><delete id="delete" parameterType="int">DELETE FROM student WHERE id = #{id};</delete> </mapper>

6.編寫數據源jdbc.properties文件

db.url=jdbc:mysql://192.168.183.129:3306/yogurt?characterEncoding=utf8 db.user=root db.password=root db.driver=com.mysql.jdbc.Driver

7.編寫全局配置文件(主要是配置數據源信息),命名為mybatis.properties

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><!-- 配置文件信息 --><properties resource="db.properties"></properties><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><!-- 從配置文件中加載屬性 --><property name="driver" value="${db.driver}"/><property name="url" value="${db.url}"/><property name="username" value="${db.user}"/><property name="password" value="${db.password}"/></dataSource></environment></environments><mappers><!-- 加載前面編寫的SQL語句的文件 --><mapper resource="StudentMapper.xml"/></mappers></configuration>

8.編寫dao類

package com.yogurt.dao;import com.yogurt.po.Student; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException; import java.io.InputStream; import java.util.List;public class StudentDao {private SqlSessionFactory sqlSessionFactory;public StudentDao(String configPath) throws IOException {InputStream inputStream = Resources.getResourceAsStream(configPath);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}public List<Student> findAll() {SqlSession sqlSession = sqlSessionFactory.openSession();List<Student> studentList = sqlSession.selectList("findAll");sqlSession.close();return studentList;}public int addStudent(Student student) {SqlSession sqlSession = sqlSessionFactory.openSession();int rowsAffected = sqlSession.insert("insert", student);sqlSession.commit();sqlSession.close();return rowsAffected;}public int deleteStudent(int id) {SqlSession sqlSession = sqlSessionFactory.openSession();int rowsAffected = sqlSession.delete("delete",id);sqlSession.commit();sqlSession.close();return rowsAffected;} }

9.測試

public class SimpleTest {private StudentDao studentDao;@Beforepublic void init() throws IOException {studentDao = new StudentDao("mybatis-config.xml");}@Testpublic void insertTest() {Student student = new Student();student.setName("yogurt");student.setAge(24);student.setGender(1);student.setScore(100);studentDao.addStudent(student);}@Testpublic void findAllTest() {List<Student> all = studentDao.findAll();all.forEach(System.out::println);} }

總結:

  • 編寫mapper.xml,書寫SQL,并定義好SQL的輸入參數,和輸出參數
  • 編寫全局配置文件,配置數據源,以及要加載的mapper.xml文件
  • 通過全局配置文件,創建SqlSessionFactory
  • 每次進行CRUD時,通過SqlSessionFactory創建一個SqlSession
  • 調用SqlSession上的selectOne,selectList,insert,delete,update等方法,傳入mapper.xml中SQL標簽的id,以及輸入參數
  • 注意要點:

    1.全局配置文件中,各標簽配置順序如下,因為mybatis中的源碼是按此順序進行解析

    <configuration><!-- 配置順序如下properties settingstypeAliasestypeHandlersobjectFactorypluginsenvironmentsenvironmenttransactionManagerdataSourcemappers--> </configuration>

    子標簽說明:

    • <properties>

    一般將數據源的信息單獨放在一個properties文件中,然后用這個標簽引入,在下面environment標簽中,就可以用${}占位符快速獲取數據源的信息

    • <settings>

    用來開啟或關閉mybatis的一些特性,比如可以用<setting name="lazyLoadingEnabled" value="true"/>來開啟延遲加載,可以用<settings name="cacheEnabled" value="true"/>來開啟二級緩存

    • <typeAliases>

    在mapper.xml中需要使用parameterType和resultType屬性來配置SQL語句的輸入參數類型和輸出參數類型,類必須要寫上全限定名,比如一個SQL的返回值映射為Student類,則resultType屬性要寫com.yogurt.po.Student,這太長了,所以可以用別名來簡化書寫,比如

    <typeAliases><typeAlias type="com.yogurt.po.Student" alias="student"/> </typeAliases>

    之后就可以在resultType上直接寫student,mybatis會根據別名配置自動找到對應的類。

    當然,如果想要一次性給某個包下的所有類設置別名,可以用如下的方式

    <typeAliases><package name="com.yogurt.po"/> </typeAliases>

    如此,指定包下的所有類,都會以簡單類名的小寫形式,作為它的別名

    另外,對于基本的Java類型 -> 8大基本類型以及包裝類,以及String類型,mybatis提供了默認的別名,別名為其簡單類名的小寫,比如原本需要寫java.lang.String,其實可以簡寫為string

    • <typeHandlers>

      用于處理Java類型和Jdbc類型之間的轉換,mybatis有許多內置的TypeHandler,比如StringTypeHandler,會處理Java類型String和Jdbc類型CHAR和VARCHAR。這個標簽用的不多

    • <objectFactory>

      mybatis會根據resultType或resultMap的屬性來將查詢得到的結果封裝成對應的Java類,它有一個默認的DefaultObjectFactory,用于創建對象實例,這個標簽用的也不多

    • <plugins>

      可以用來配置mybatis的插件,比如在開發中經常需要對查詢結果進行分頁,就需要用到pageHelper分頁插件,這些插件就是通過這個標簽進行配置的。在mybatis底層,運用了責任鏈模式+動態代理去實現插件的功能

      <!-- PageHelper 分頁插件 --> <plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"><property name="helperDialect" value="mysql"/></plugin> </plugins>
    • <environments>

      用來配置數據源

    • <mappers>

      用來配置mapper.xml映射文件,這些xml文件里都是SQL語句

    2.mapper.xml的SQL語句中的占位符${}和#{}

    一般會采用#{},#{}在mybatis中,最后會被解析為?,其實就是Jdbc的PreparedStatement中的?占位符,它有預編譯的過程,會對輸入參數進行類型解析(如果入參是String類型,設置參數時會自動加上引號),可以防止SQL注入,如果parameterType屬性指定的入參類型是簡單類型的話(簡單類型指的是8種java原始類型再加一個String),#{}中的變量名可以任意,如果入參類型是pojo,比如是Student類

    那么#{name}表示取入參對象Student中的name屬性,#{age}表示取age屬性,這個過程是通過反射來做的,這不同于${},${}取對象的屬性使用的是OGNL(Object Graph Navigation Language)表達式

    而${},一般會用在模糊查詢的情景,比如SELECT * FROM student WHERE name like '%${name}%';

    它的處理階段在#{}之前,它不會做參數類型解析,而僅僅是做了字符串的拼接,若入參的Student對象的name屬性為zhangsan,則上面那條SQL最終被解析為SELECT * FROM student WHERE name like '%zhangsan%';

    而如果此時用的是SELECT * FROM student WHERE name like '%#{name}%'; 這條SQL最終就會變成

    SELECT * FROM student WHERE name like '%'zhangsan'%'; 所以模糊查詢只能用${},雖然普通的入參也可以用${},但由于${}不會做類型解析,就存在SQL注入的風險,比如

    SELECT * FROM user WHERE name = '${name}' AND password = '${password}'

    我可以讓一個user對象的password屬性為'OR '1' = '1,最終的SQL就變成了

    SELECT * FROM user WHERE name = 'yogurt' AND password = ''OR '1' = '1',因為OR '1' = '1'恒成立,這樣攻擊者在不需要知道用戶名和密碼的情況下,也能夠完成登錄驗證

    另外,對于pojo的入參,${}中獲取對象屬性的語法和#{}幾乎一樣,但${}在mybatis底層是通過OGNL表達式語言進行處理的,這跟#{}的反射處理有所不同

    對于簡單類型(8種java原始類型再加一個String)的入參,${}中參數的名字必須是value

    上面其實是比較原始的開發方式,我們需要編寫dao類,針對mapper.xml中的每個SQL標簽,做一次封裝,SQL標簽的id要以字符串的形式傳遞給SqlSession的相關方法,容易出錯,非常不方便;為了簡化開發,mybatis提供了mapper接口代理的開發方式,不需要再編寫dao類,只需要編寫一個mapper接口,一個mapper的接口和一個mapper.xml相對應,只需要調用SqlSession對象上的getMapper(),傳入mapper接口的class信息,即可獲得一個mapper代理對象,直接調用mapper接口中的方法,即相當于調用mapper.xml中的各個SQL標簽,此時就不需要指定SQL標簽的id字符串了,mapper接口中的一個方法,就對應了mapper.xml中的一個SQL標簽

    基于Mapper代理的示例

    全局配置文件和mapper.xml文件是最基本的配置,仍然需要。這次不編寫dao類,直接創建一個mapper接口

    package com.yogurt.mapper;import com.yogurt.po.Student;import java.util.List;public interface StudentMapper {List<Student> findAll();int insert(Student student);int delete(Integer id);List<Student> findByName(String value); }

    而我們的mapper.xml文件如下

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.yogurt.mapper.StudentMapper"><select id="findAll" resultType="com.yogurt.po.Student">SELECT * FROM student;</select><insert id="insert" parameterType="com.yogurt.po.Student">INSERT INTO student (name,score,age,gender) VALUES (#{name},#{score},#{age},#{gender});</insert><delete id="delete" parameterType="int">DELETE FROM student WHERE id = #{id};</delete><select id="findByName" parameterType="string" resultType="student">SELECT * FROM student WHERE name like '%${value}%';</select> </mapper>

    mapper接口和mapper.xml之間需要遵循一定規則,才能成功的讓mybatis將mapper接口和mapper.xml綁定起來

  • mapper接口的全限定名,要和mapper.xml的namespace屬性一致
  • mapper接口中的方法名要和mapper.xml中的SQL標簽的id一致
  • mapper接口中的方法入參類型,要和mapper.xml中SQL語句的入參類型一致
  • mapper接口中的方法出參類型,要和mapper.xml中SQL語句的返回值類型一致
  • 這個mapper接口,mybatis會自動找到對應的mapper.xml,然后對mapper接口使用動態代理的方式生成一個代理類

    基于注解的示例

  • 創建一個Mapper接口

    package com.yogurt.mapper; import com.yogurt.po.Student; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Select; import java.util.List;public interface PureStudentMapper {@Select("SELECT * FROM student")List<Student> findAll();@Insert("INSERT INTO student (name,age,score,gender) VALUES (#{name},#{age},#{score},#{gender})")int insert(Student student); }
  • 在全局配置文件中修改<mappers>標簽,直接指定加載這個類

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><properties resource="properties/db.properties"></properties><typeAliases><package name="com.yogurt.po"/></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${db.driver}"/><property name="url" value="${db.url}"/><property name="username" value="${db.user}"/><property name="password" value="${db.password}"/></dataSource></environment></environments><mappers><mapper class="com.yogurt.mapper.PureStudentMapper"/></mappers></configuration>
  • 測試代碼如下

    public class PureMapperTest {private SqlSessionFactory sqlSessionFactory;@Beforepublic void init() throws IOException {InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}@Testpublic void test() {SqlSession sqlSession = sqlSessionFactory.openSession();PureStudentMapper mapper = sqlSession.getMapper(PureStudentMapper.class);mapper.insert(new Student(10,"Tomcat",120,60,0));sqlSession.commit();List<Student> studentList = mapper.findAll();studentList.forEach(System.out::println);} }

    注:當使用注解開發時,若需要傳入多個參數,可以結合@Param注解,示例如下

    package org.mybatis.demo.mapper;import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import org.mybatis.demo.po.Student;import java.util.List;public interface PureStudentMapper {@Select("SELECT * FROM student WHERE name like '%${name}%' AND major like '%${major}%'")List<Student> find(@Param("name") String name, @Param("major") String major); }

    @Param標簽會被mybatis處理并封裝成一個Map對象,比如上面的示例中,實際傳入的參數是一個Map對象,@Param標簽幫忙向Map中設置了值,即它做了

    Map<String,Object> map = new HashMap<>(); map.put("name", name); map.put("major",major);

    將方法形參中的name和major放到了map對象中,所以在@Select標簽中可以用${name}和${major}取出map對象中的值。

    三種加載mapper的方式總結

    • <mapper resource="" />

      加載普通的xml文件,傳入xml的相對路徑(相對于類路徑)

    • <mapper class="" />

      使用mapper接口的全限定名來加載,若mapper接口采用注解方式,則不需要xml;若mapper接口沒有采用注解方式,則mapper接口和xml文件的名稱要相同,且在同一個目錄

    • <package name="" />

      掃描指定包下的所有mapper,若mapper接口采用注解方式,則不需要xml;若mapper接口沒有采用注解方式,則mapper接口和xml文件的名稱要相同,且在同一目錄

    注意:用后兩種方式加載mapper接口和mapper.xml映射文件時,可能會報錯

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-VjPtAEa1-1646826930975)(C:\Users\20490\AppData\Roaming\Typora\typora-user-images\image-20220220193746535.png)]

    是因為,對于src/main/java 源碼目錄下的文件,maven打包時只會將該目錄下的java文件打包,而其他類型的文件都不會被打包進去,去工程目錄的target目錄下看看maven構建后生成的文件,發現mapper.xml未被打包進去

    具體解決辦法見(4條消息) 關于maven打包時, 資源文件沒有被打包進來的問題_vcj1009784814的博客-CSDN博客_maven打包resource文件沒打進去

    應用場景:

    主鍵返回

    通常我們會將數據庫表的主鍵id設為自增。在插入一條記錄時,我們不設置其主鍵id,而讓數據庫自動生成該條記錄的主鍵id,那么在插入一條記錄后,如何得到數據庫自動生成的這條記錄的主鍵id呢?有兩種方式

  • 使用useGeneratedKeys和keyProperty屬性

    <insert id="insert" parameterType="com.yogurt.po.Student" useGeneratedKeys="true" keyProperty="id">INSERT INTO student (name,score,age,gender) VALUES (#{name},#{score},#{age},#{gender});</insert> 123
  • 使用<selectKey>子標簽

    <insert id="insert" parameterType="com.yogurt.po.Student">INSERT INTO student (name,score,age,gender) VALUES (#{name},#{score},#{age},#{gender});<selectKey keyProperty="id" order="AFTER" resultType="int" >SELECT LAST_INSERT_ID();</selectKey></insert>

    如果使用的是mysql這樣的支持自增主鍵的數據庫,可以簡單的使用第一種方式;對于不支持自增主鍵的數據庫,如oracle,則沒有主鍵返回這一概念,而需要在插入之前先生成一個主鍵。此時可以用<selectKey>標簽,設置其order屬性為BEFORE,并在標簽體內寫上生成主鍵的SQL語句,這樣在插入之前,會先處理<selectKey>,生成主鍵,再執行真正的插入操作。

    <selectKey>標簽其實就是一條SQL,這條SQL的執行,可以放在主SQL執行之前或之后,并且會將其執行得到的結果封裝到入參的Java對象的指定屬性上。注意<selectKey>子標簽只能用在<insert>和<update>標簽中。上面的LAST_INSERT_ID()實際上是MySQL提供的一個函數,可以用來獲取最近插入或更新的記錄的主鍵id。

  • 測試代碼如下

    public class MapperProxyTest {private SqlSessionFactory sqlSessionFactory;@Beforepublic void init() throws IOException {InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);}@Testpublic void test() {SqlSession sqlSession = sqlSessionFactory.openSession();StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);Student student = new Student(-1, "Podman", 130, 15, 0);mapper.insert(student);sqlSession.commit();System.out.println(student.getId());} }

    批量查詢

    主要是動態SQL標簽的使用,注意如果parameterType是List的話,則在標簽體內引用這個List,只能用變量名list,如果parameterType是數組,則只能用變量名array

    <select id="batchFind" resultType="student" parameterType="java.util.List">SELECT * FROM student<where><if test="list != null and list.size() > 0">AND id in<foreach collection="list" item="id" open="(" separator="," close=")">#{id}</foreach></if></where> </select>@Testpublic void testBatchQuery() {SqlSession sqlSession = sqlSessionFactory.openSession();StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);List<Student> students = mapper.batchFind(Arrays.asList(1, 2, 3, 7, 9));students.forEach(System.out::println);}

    動態SQL

    可以根據具體的參數條件,來對SQL語句進行動態拼接。

    比如在以前的開發中,由于不確定查詢參數是否存在,許多人會使用類似于where 1 = 1 來作為前綴,然后后面用AND 拼接要查詢的參數,這樣,就算要查詢的參數為空,也能夠正確執行查詢,如果不加1 = 1,則如果查詢參數為空,SQL語句就會變成SELECT * FROM student where,SQL不合法。

    mybatis里的動態標簽主要有

    • if

      <!-- 示例 --> <select id="find" resultType="student" parameterType="student">SELECT * FROM student WHERE age >= 18<if test="name != null and name != ''">AND name like '%${name}%'</if> </select>

      當滿足test條件時,才會將<if>標簽內的SQL語句拼接上去

    • choose

      <!-- choose 和 when , otherwise 是配套標簽 類似于java中的switch,只會選中滿足條件的一個 --> <select id="findActiveBlogLike"resultType="Blog">SELECT * FROM BLOG WHERE state = ‘ACTIVE’<choose><when test="title != null">AND title like #{title}</when><when test="author != null and author.name != null">AND author_name like #{author.name}</when><otherwise>AND featured = 1</otherwise></choose> </select>
    • trim

      • where

        <where>標簽只會在至少有一個子元素返回了SQL語句時,才會向SQL語句中添加WHERE,并且如果WHERE之后是以AND或OR開頭,會自動將其刪掉

        <select id="findActiveBlogLike"resultType="Blog">SELECT * FROM BLOG<where><if test="state != null">state = #{state}</if><if test="title != null">AND title like #{title}</if><if test="author != null and author.name != null">AND author_name like #{author.name}</if></where> </select>

        <where>標簽可以用<trim>標簽代替

        <trim prefix="WHERE" prefixOverrides="AND | OR">... </trim>
      • set

        在至少有一個子元素返回了SQL語句時,才會向SQL語句中添加SET,并且如果SET之后是以,開頭的話,會自動將其刪掉

        <set>標簽相當于如下的<trim>標簽

        <trim prefix="SET" prefixOverrides=",">... </trim>

      可以通過<trim>標簽更加靈活地對SQL進行定制

      實際上在mybatis源碼,也能看到trim與set,where標簽的父子關系

    • foreach

      用來做迭代拼接的,通常會與SQL語句中的IN查詢條件結合使用,注意,到parameterType為List(鏈表)或者Array(數組),后面在引用時,參數名必須為list或者array。如在foreach標簽中,collection屬性則為需要迭代的集合,由于入參是個List,所以參數名必須為list

      <select id="batchFind" resultType="student" parameterType="list">SELECT * FROM student WHERE id in<foreach collection="list" item="item" open="(" separator="," close=")">#{item}</foreach> </select>
    • sql

      可將重復的SQL片段提取出來,然后在需要的地方,使用<include>標簽進行引用

      <select id="findUser" parameterType="user" resultType="user">SELECT * FROM user<include refid="whereClause"/> </select><sql id="whereClause"><where><if test user != null>AND username like '%${user.name}%'</if></where> </sql>
    • bind

      mybatis的動態SQL都是用OGNL表達式進行解析的,如果需要創建OGNL表達式以外的變量,可以用bind標簽

      <select id="selectBlogsLike" resultType="Blog"><bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />SELECT * FROM BLOGWHERE title LIKE #{pattern} </select>

    緩存

    • 一級緩存

      默認開啟,同一個SqlSesion級別共享的緩存,在一個SqlSession的生命周期內,執行2次相同的SQL查詢,則第二次SQL查詢會直接取緩存的數據,而不走數據庫,當然,若第一次和第二次相同的SQL查詢之間,執行了DML(INSERT/UPDATE/DELETE),則一級緩存會被清空,第二次查詢相同SQL仍然會走數據庫

      一級緩存在下面情況會被清除

      • 在同一個SqlSession下執行增刪改操作時(不必提交),會清除一級緩存
      • SqlSession提交或關閉時(關閉時會自動提交),會清除一級緩存
      • 對mapper.xml中的某個CRUD標簽,設置屬性flushCache=true,這樣會導致該MappedStatement的一級緩存,二級緩存都失效(一個CRUD標簽在mybatis中會被封裝成一個MappedStatement)
      • 在全局配置文件中設置 <setting name="localCacheScope" value="STATEMENT"/>,這樣會使一級緩存失效,二級緩存不受影響
    • 二級緩存

      默認關閉,可通過全局配置文件中的<settings name="cacheEnabled" value="true"/>開啟二級緩存總開關,然后在某個具體的mapper.xml中增加<cache />,即開啟了該mapper.xml的二級緩存。二級緩存是mapper級別的緩存,粒度比一級緩存大,多個SqlSession可以共享同一個mapper的二級緩存。注意開啟二級緩存后,SqlSession需要提交,查詢的數據才會被刷新到二級緩存當中

    關聯查詢

    使用<resultMap> 標簽以及<association>和<collection> 子標簽,進行關聯查詢,比較簡單

    延遲加載

    延遲加載是結合關聯查詢進行應用的。也就是說,只在<association>和<collection> 標簽上起作用

    對于關聯查詢,若不采用延遲加載策略,而是一次性將關聯的從信息都查詢出來,則在主信息比較多的情況下,會產生N+1問題,導致性能降低。比如用戶信息和訂單信息是一對多的關系,在查詢用戶信息時,設置了關聯查詢訂單信息,如不采用延遲加載策略,假設共有100個用戶,則我們查這100個用戶的基本信息只需要一次SQL查詢

    select * from user;

    若開啟了關聯查詢,且不是延遲加載,則對于這100個用戶,會發出100條SQL去查用戶對應的訂單信息,這樣會造成不必要的性能開銷(其實我認為稱之為1+N問題更為合適)

    select * from orders where u_id = 1; select * from orders where u_id = 2; .... select * from orders where u_id = 100;

    當我們可能只關心id=3的用戶的訂單信息,則很多的關聯信息是無用的,于是,采用延遲加載策略,可以按需加載從信息,在需要某個主信息對應的從信息時,再發送SQL去執行查詢,而不是一次性全部查出來,這樣能很好的提升性能。

    另外,針對N+1問題,除了采用延遲加載的策略按需進行關聯查詢。如果在某些場景下,確實需要查詢所有主信息關聯的從信息。在上面的例子中,就是如果確實需要把這100個用戶關聯的訂單信息全部查詢出來,那怎么辦呢?這里提供2個解決思路。

    1是采用連接查詢,只使用1條SQL即可,如下

    select * from user as u left join orders as o on u.id = o.u_id;

    但使用連接查詢查出來的結果是兩表的笛卡爾積,還需要自行進行數據的分組處理

    2是使用兩個步驟來完成,先執行一條SQL,查出全部的用戶信息,并把用戶的id放在一個集合中,然后第二條SQL采用IN關鍵字查詢即可。這種方式也可以簡化為子查詢,如下

    select * from orders where u_id in (select id from user);

    現在說回來,mybatis的延遲加載默認是關閉的,可以通過全局配置文件中的<setting name="lazyLoadingEnabled" value="true"/>來開啟,開啟后,所有的SELECT查詢,若有關聯對象,都會采用延遲加載的策略。當然,也可以對指定的某個CRUD標簽單獨禁用延遲加載策略,通過設置SELECT標簽中的fetchType=eager,則可以關閉該標簽的延遲加載。

    (還有一個侵入式延遲加載的概念,在配置文件中通過<setting name="aggressiveLazyLoading" value="true">來開啟,大概是說,訪問主對象中的主信息時,就會觸發延遲加載,將從信息查詢上來,這其實并不是真正意義的延遲加載,真正意義上的延遲加載應該是訪問主對象中的從信息時,才觸發延遲加載,去加載從信息,侵入式延遲加載默認是關閉的,一般情況下可以不用管他)

    注意,延遲加載在關聯查詢的場景下才有意義。需要配合<resultMap>標簽下的<association>和<collecction> 標簽使用

    <!-- StudentMapper.xml --> <resultMap id="studentExt" type="com.yogurt.po.StudentExt"><result property="id" column="id"/><result property="name" column="name"/><result property="score" column="score"/><result property="age" column="age"/><result property="gender" column="gender"/><!-- 當延遲加載總開關開啟時,resultMap下的association和collection標簽中,若通過select屬性指定嵌套查詢的SQL,則其fetchType默認是lazy的,當在延遲加載總開關開啟時,需要對個別的關聯查詢禁用延遲加載時,才有必要配置fetchType = eager --><!--column用于指定用于關聯查詢的列property用于指定要封裝到StudentExt中的哪個屬性javaType用于指定關聯查詢得到的對象select用于指定關聯查詢時,調用的是哪一個DQL--><association property="clazz" javaType="com.yogurt.po.Clazz" column="class_id"select="com.yogurt.mapper.ClassMapper.findById" fetchType="lazy"/></resultMap><select id="findLazy" parameterType="string" resultMap="studentExt">SELECT * FROM student WHERE name like '%${value}%';</select> <!-- com.yogurt.mapper.ClassMapper --> <select id="findById" parameterType="int" resultType="com.yogurt.po.Clazz">SELECT * FROM class WHERE id = #{id} </select> /** 用于封裝關聯查詢的對象 **/ public class StudentExt{private Integer id;private String name;private Integer score;private Integer age;private Integer gender;/** 關聯對象 **/private Clazz clazz;//getter/setter }

    逆向工程

    PageHelper分頁插件

    Mybatis Plus

    mybatis雖然非常方便,但也需要編寫大量的SQL語句,于是mybatis plus就應運而生了。它是一個mybatis增強工具,為了簡化開發,提高效率。搭配Spring-Boot食用簡直不要太爽。

    可以參考這篇文章 mybatis-plus一發入魂

    注:該文是一篇較為全面詳細的筆記,內容篇幅很長。當對mybatis的使用較為熟練后,可以查看這篇極為簡短的 mybatis精髓總結,從整體架構和源碼層面上把握mybatis。

    轉載從(4條消息) mybatis看這一篇就夠了,簡單全面一發入魂_vcj1009784814的博客-CSDN博客_mybatis看這一篇

    總結

    以上是生活随笔為你收集整理的Mybatis持久层开发的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    久久免费看 | 欧美另类sm图片 | 亚洲美女在线一区 | 国产成人精品999 | 日韩高清在线一区 | 国产99精品| 91在线中文字幕 | 在线精品观看 | 国产精品久久一区二区三区, | 狠狠色狠狠色综合系列 | 色综合久久66 | 色婷婷天天干 | 日日夜精品 | 国产视频亚洲视频 | 免费观看黄色av | 在线观看视频在线观看 | 天堂在线视频中文网 | 久久精品国产99国产 | 在线小视频你懂得 | 高清av中文字幕 | 亚洲精品国精品久久99热一 | 日韩资源在线播放 | 亚洲天堂毛片 | 91精品国产高清 | 免费视频a | 国产专区精品 | 99视频导航 | av在线8| av中文字幕在线看 | 99久久精品国产亚洲 | 欧美激情视频在线观看免费 | 精品自拍av| 国产日韩精品一区二区在线观看播放 | 国产精品黑丝在线观看 | 国产精品成人国产乱一区 | 在线观看91精品视频 | 天天综合网入口 | 国产欧美三级 | www.天天操 | 在线免费视频一区 | 亚洲综合在线观看视频 | 久久久久久久久久久免费视频 | 日韩视频www | 欧美精品日韩 | 99久久久国产精品免费观看 | 最近中文国产在线视频 | 中文字幕在线视频第一页 | 黄色一区二区在线观看 | 91成人在线观看喷潮 | av福利在线免费观看 | 亚洲天堂在线观看完整版 | 2024国产精品视频 | 麻豆视频免费播放 | 波多野结衣一区三区 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 91久久精品一区二区三区 | 亚洲伦理电影在线 | 五月天电影免费在线观看一区 | 久久天天躁狠狠躁夜夜不卡公司 | 国产高清免费视频 | 亚洲黄色免费观看 | 黄色三级免费看 | 日韩久久在线 | 国产高清不卡 | 亚洲干视频在线观看 | 四虎影视国产精品免费久久 | 青青草华人在线视频 | 天天色中文 | 在线免费色 | 亚洲h在线播放在线观看h | 欧美日韩亚洲精品在线 | 国产二区av | 久久av免费观看 | 男女视频91 | av观看网站| 久久不卡国产精品一区二区 | 婷婷激情在线观看 | 中国老女人日b | 国产精品入口久久 | 国产精品一区二区白浆 | 91视频麻豆 | 成人亚洲免费 | 亚洲欧美日韩精品久久奇米一区 | 成年人在线看视频 | 中文资源在线官网 | 国产伦理精品一区二区 | 免费午夜av | 日韩欧美国产免费播放 | 91九色视频在线 | 天天插天天射 | 成年人免费av | 成人资源在线 | 国产精品一区久久久久 | 国产日韩欧美在线看 | 中文字幕日韩国产 | 日韩三级成人 | 国产大片黄色 | 免费在线观看黄色网 | 五月天天天操 | 黄色性av| 免费一级特黄录像 | 中文字幕一区二区三区精华液 | 69精品视频在线观看 | 91视频下载 | 91精品秘密在线观看 | 97人人模人人爽人人少妇 | 国产伦精品一区二区三区… | 国产大尺度视频 | 国产午夜免费视频 | 天天舔天天搞 | 亚洲黄色免费观看 | 国产中文字幕在线观看 | 亚洲精品免费在线观看视频 | 日本69hd | 五月婷婷久久丁香 | 免费成人黄色av | 天天舔天天射天天操 | 天堂在线视频中文网 | 亚洲最新av在线网站 | 久久精品国产亚洲a | 国产午夜精品免费一区二区三区视频 | 国色天香av| 国产精品一区二区精品视频免费看 | 大片网站久久 | 免费人成在线观看网站 | 国产精品久久久久久久久费观看 | 九九国产精品视频 | 久久久久久久久久影视 | 久久久国产精品网站 | 国产精品久久久久av福利动漫 | 国产亚洲视频系列 | 亚洲va欧美va国产va黑人 | 国产福利一区在线观看 | 欧美亚洲专区 | 精品国产乱码久久久久久三级人 | 久久久久99999 | 97国产在线 | www.亚洲黄色 | 99在线免费观看视频 | 欧美极品少妇xbxb性爽爽视频 | 日韩在线色视频 | 精品国产免费人成在线观看 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | av在线专区 | 日日日爽爽爽 | 亚洲综合丁香 | 亚洲综合色丁香婷婷六月图片 | 中文字幕观看av | 亚洲精品乱码久久久久 | 午夜成人免费电影 | 久久精品国产亚洲aⅴ | 欧美精品国产综合久久 | 国产精品日韩在线观看 | 女人久久久久 | 久热只有精品 | 日韩av免费一区 | 亚洲日b视频 | 欧美精品中文字幕亚洲专区 | 中文字幕在线免费 | 国产午夜精品一区二区三区在线观看 | 97在线观看视频国产 | 成人av免费 | 亚洲精品综合欧美二区变态 | 久久亚洲精品国产亚洲老地址 | 一区二区三区免费在线观看视频 | 国产中文伊人 | 少妇bbw搡bbbb搡bbbb | 精品国内自产拍在线观看视频 | 9ⅰ精品久久久久久久久中文字幕 | 国产黄色片在线 | 免费观看www视频 | 精品在线观看一区二区 | 国产免费专区 | 香蕉久草在线 | 日韩在线观看小视频 | 香蕉在线视频观看 | 在线岛国av | 天天天天色射综合 | 在线天堂v | 国产成人三级在线播放 | 日本中文字幕系列 | 亚洲理论电影网 | 欧美91精品国产自产 | 免费中文字幕视频 | 日日射av | 黄色网中文字幕 | 久久久久成人免费 | 国产美女免费观看 | 精品国内自产拍在线观看视频 | 国产亚洲精品久久久久动 | 成 人 黄 色 视频 免费观看 | 深夜成人av| 午夜免费福利视频 | 蜜臀av夜夜澡人人爽人人 | 国产成人亚洲在线电影 | 中文日韩在线 | 久久99久久久久 | 国内精品久久久久 | 免费网址在线播放 | 欧美日韩亚洲精品在线 | 久久精品成人欧美大片古装 | 日韩91精品 | 97成人在线观看视频 | 色综合中文综合网 | 免费在线成人av | 999日韩| 综合激情网...| 欧美成人一区二区 | 在线免费观看国产视频 | 亚洲精品五月 | 国产拍揄自揄精品视频麻豆 | 国产99久久久国产精品免费二区 | 98超碰人人 | 成人全视频免费观看在线看 | 成人午夜精品久久久久久久3d | 色综合亚洲精品激情狠狠 | www.色com| 操久久网| 热久久免费视频 | 中文字幕av播放 | 午夜在线资源 | 成人啪啪18免费游戏链接 | 就操操久久 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 97超碰成人在线 | 国产精品免费视频观看 | 午夜视频日本 | 亚洲乱码精品久久久久 | 亚洲成人黄色网址 | 91高清免费看 | 亚洲精品视频免费 | 操操操日日日 | 综合网天天射 | 日日噜噜噜噜夜夜爽亚洲精品 | 五月天高清欧美mv | 欧美成人h版电影 | 久草色在线观看 | 狠狠躁夜夜a产精品视频 | 在线观看日韩精品视频 | www.夜夜骑.com | 香蕉视频亚洲 | 97超碰人人 | 精品亚洲免费 | 一区二区三区在线观看免费 | 欧美日韩国产精品爽爽 | 日韩精品视频在线观看免费 | 久久不射电影院 | 国产亚洲精品成人av久久影院 | 少妇性色午夜淫片aaaze | 高清有码中文字幕 | 狠狠地操 | 欧美精品在线一区 | 久久久久亚洲国产精品 | 探花视频在线观看免费版 | 四虎5151久久欧美毛片 | 亚洲精品在线资源 | 免费在线91| 国产偷国产偷亚洲清高 | 爱干视频 | 天堂va欧美va亚洲va老司机 | 一区二区丝袜 | 国产精品正在播放 | 国产日韩欧美视频在线观看 | 欧美analxxxx| 欧美一级专区免费大片 | 国内精品亚洲 | 99在线精品观看 | 欧美片一区二区三区 | 免费视频在线观看网站 | 日韩高清在线看 | 在线免费av播放 | 又粗又长又大又爽又黄少妇毛片 | 色综合天天综合网国产成人网 | 免费观看av | 美女视频黄的免费的 | 久久精品日产第一区二区三区乱码 | 激情五月婷婷激情 | 精品一区二区久久久久久久网站 | 色99视频| 香蕉日日 | 久久综合狠狠综合 | 免费在线激情电影 | 成年人视频在线免费 | 爱爱av网站| 国产精品久久久久久久久大全 | 中文字幕999 | 97成人精品视频在线播放 | 欧美超碰在线 | 国产亚洲精品久久久久久移动网络 | 国产91精品一区二区绿帽 | 免费一级毛毛片 | 久久视频中文字幕 | 91精品久久久久 | 91黄色在线视频 | 久久99国产精品自在自在app | 国产激情电影综合在线看 | 国产小视频在线免费观看 | 国产美腿白丝袜足在线av | 日韩久久影院 | 国产一区二区在线播放视频 | 国产精品手机看片 | 欧美性生活小视频 | 成人h动漫精品一区二 | 天天干天天草天天爽 | 国产精品久久久久久久久久久免费 | 色的网站在线观看 | 国产超碰在线观看 | 麻豆精品传媒视频 | 国产婷婷一区二区 | 欧美久久久久久久久久 | 国产露脸91国语对白 | www.五月婷婷.com | 国产精品一区二区三区免费视频 | 亚洲一区二区麻豆 | 果冻av在线| 天天操福利视频 | 亚洲综合国产精品 | 四虎影视www | 99精品观看| 97成人免费 | 91在线视频免费播放 | av在线免费观看黄 | 国产精品一区一区三区 | 国产精品每日更新 | 日韩中文字幕第一页 | 肉色欧美久久久久久久免费看 | 不卡电影免费在线播放一区 | 日韩在线视频线视频免费网站 | 久久午夜免费观看 | 国产一级久久久 | 色综合网在线 | 深爱激情婷婷网 | 国产区在线 | 国产日本在线观看 | 欧美国产日韩在线视频 | 日韩毛片在线一区二区毛片 | 精品久久久久久久 | 亚洲午夜精品一区二区三区电影院 | 91福利影院在线观看 | 成人免费观看网站 | 天天插狠狠干 | 久久精品高清视频 | 狠狠干成人综合网 | 国产精品成人自产拍在线观看 | 超碰在线人人艹 | 69夜色精品国产69乱 | 久久观看 | 香蕉视频在线视频 | 91视频首页| www一起操 | 日韩精品一区二区三区免费观看视频 | 国产在线1区 | 日本精品一区二区三区在线播放视频 | 狠狠色丁香久久综合网 | 又黄又爽又湿又无遮挡的在线视频 | 五月婷婷在线综合 | 91久久一区二区 | 亚洲成人av一区二区 | 97**国产露脸精品国产 | 亚洲国产中文字幕在线视频综合 | 午夜视频在线观看一区二区三区 | 欧美日韩国产在线一区 | 在线导航av | 久久激情网站 | 国产一区在线观看免费 | 婷婷社区五月天 | 日本xxxx裸体xxxx17 | 国产精品免费看 | 亚洲精品国产成人 | 久久五月婷婷丁香社区 | 热re99久久精品国产66热 | 麻花豆传媒mv在线观看 | 91在线视频网址 | av片在线观看| 在线观看av免费 | 欧美另类视频 | 狠狠色丁香久久综合网 | 天天综合久久综合 | 日本精品一区二区 | 久久久精品欧美一区二区免费 | 精品国产一区二区三区av性色 | 在线观看国产一区二区 | 国产精品视频久久久 | 免费在线播放视频 | 成人国产精品免费观看 | 在线观看亚洲 | 免费看国产曰批40分钟 | 成人黄大片视频在线观看 | 亚洲精品国产拍在线 | 手机看片99 | 国产美女精品人人做人人爽 | 午夜精品久久久久久 | 国产精品高潮呻吟久久av无 | 区一区二区三在线观看 | 国产99久久精品一区二区300 | av解说在线观看 | 97电影网手机版 | 国产91精品久久久久久 | 久久久免费毛片 | 亚洲成av人片一区二区梦乃 | 日韩午夜在线播放 | 中文字幕欲求不满 | 久久一级片 | 色国产视频 | 成人动漫一区二区三区 | 最新av在线播放 | 91成人精品一区在线播放 | 国产免费二区 | 国产精品美女 | 久久69精品 | 色婷婷综合久久久久 | 韩国av免费在线 | 国产最新在线视频 | 久久久国产精品一区二区三区 | 九九久久国产 | 久草综合在线观看 | 亚洲精品乱码久久久久久9色 | 激情综合五月网 | 青青河边草免费观看完整版高清 | 国产在线视频一区 | 91av视频在线免费观看 | 亚洲精品在线视频 | 五月天亚洲综合小说网 | av福利在线播放 | 亚洲精品美女在线观看播放 | 久热只有精品 | 日韩毛片在线一区二区毛片 | 免费看的黄色录像 | wwwwww黄| 国产aa精品| 欧美性大战 | 五月婷婷综合网 | 狠狠色丁香婷婷综合久小说久 | 免费视频 你懂的 | 国产精品美女视频网站 | 免费日韩一区二区 | 国产精品剧情在线亚洲 | av色影院| 日本精品视频一区 | 欧美成人基地 | 免费看黄在线 | 日韩av电影手机在线观看 | 视频在线观看入口黄最新永久免费国产 | 精品在线视频观看 | 免费成人在线电影 | 欧美一级黄大片 | 四虎在线视频 | 国精产品999国精产品岳 | 国产精品剧情在线亚洲 | 国产精品99久久99久久久二8 | 国产99一区视频免费 | 天天伊人狠狠 | 国产一区二区久久 | 激情久久一区二区三区 | 精品国产一区二区三区久久 | 草 免费视频 | 日日干综合 | 日本h视频在线观看 | 国产精品美女久久久久久 | 91最新网址在线观看 | 亚洲黄色在线 | 欧美激情综合五月色丁香 | 午夜精品久久久久久久99婷婷 | 激情欧美在线观看 | 69视频网站 | 国产黄色片网站 | 福利片免费看 | bbbb操bbbb| 久久国产精品一区二区三区 | 国产精品久久久影视 | 探花在线观看 | av在线播放国产 | 国产精品黄色 | 在线岛国av | 国产中文字幕在线视频 | 国产小视频免费在线网址 | 色综合中文字幕 | 草久久久久久久 | 久久久久久久久久久黄色 | 成人精品视频久久久久 | 制服丝袜天堂 | 免费看片网址 | 爱爱一区| 国产精品亚州 | 亚洲国产成人精品电影在线观看 | 毛片网站观看 | 久久社区视频 | 91激情在线视频 | a特级毛片| 国产免费高清视频 | 91看片淫黄大片一级在线观看 | 午夜成人影视 | 99在线精品视频观看 | 国产精品日韩在线播放 | 一区二区三区在线观看免费视频 | 午夜三级大片 | 色综合在 | 久久综合久久久 | 国产原创在线视频 | 波多野结衣视频一区二区 | 天天操夜夜看 | 久久成人国产精品一区二区 | 久久99精品国产一区二区三区 | 国产在线高清视频 | 日本最新高清不卡中文字幕 | 三级黄色片子 | 国产精品久久久久久久久搜平片 | 最新国产福利 | 久久激情视频 久久 | 四虎在线观看精品视频 | 国产精品国产自产拍高清av | 正在播放一区 | 在线免费观看黄色 | 最近中文字幕在线 | 天天干天天看 | 97视频免费观看2区 亚洲视屏 | 欧美国产精品久久久久久免费 | 亚洲天堂网视频在线观看 | 久久黄色网 | 国产精品五月天 | 麻豆国产网站入口 | 久久精品网站免费观看 | 久久精品一区二 | 日韩aⅴ视频 | 中文字幕日韩高清 | 成人av电影免费在线观看 | 91观看视频 | h视频在线看 | 国产第一福利 | av在线播放国产 | 国产一区二区三区免费视频 | 婷婷资源站| 天天拍天天干 | 最近中文字幕大全中文字幕免费 | 丝袜精品视频 | 日本久久精品 | 欧洲精品视频一区 | 欧美一区二区伦理片 | 日日弄天天弄美女bbbb | 成人av影视| 91在线蜜桃臀 | 最近中文国产在线视频 | 在线观看免费av片 | 欧美va在线观看 | 六月天综合网 | 日韩av不卡播放 | 黄色性av | 国产一二三区在线观看 | 91福利国产在线观看 | 91最新网址在线观看 | 免费视频91蜜桃 | 欧美午夜精品久久久久 | 五月天视频网 | 亚洲三级网 | 岛国大片免费视频 | 国产精品一区二区在线观看 | 精品国产乱子伦一区二区 | 中文字幕 婷婷 | 精品一区二区三区香蕉蜜桃 | 国产色综合天天综合网 | 亚洲一区二区三区在线看 | 亚洲视屏| 色偷偷男人的天堂av | 在线观看免费av片 | aaa日本高清在线播放免费观看 | 久草在线免费电影 | 丁香六月激情婷婷 | 在线国产视频一区 | 天天干天天操天天射 | 亚洲91中文字幕无线码三区 | 久久久国产一区 | 国产高清在线观看av | 韩国一区在线 | 成人小视频在线免费观看 | 欧美精品久久久久久久久久 | 77国产精品| 久久国产精品免费一区二区三区 | 天天操狠狠操 | av丝袜制服| 日本不卡一区二区 | 国产九九热视频 | 91视频xxxx| 久久久久久久久艹 | 91久久久国产精品 | 四虎成人免费观看 | a成人v| 日韩精品免费在线观看视频 | 综合久久综合久久 | 一区二区三区日韩在线观看 | 99夜色 | 精品久久久久一区二区国产 | av中文字幕在线播放 | 久久久一本精品99久久精品 | 在线免费av网站 | 97免费视频在线播放 | 亚洲精品美女在线观看播放 | 国产69精品久久久久久久久久 | 不卡的av在线播放 | 免费日韩在线 | 免费久久视频 | 97在线观看免费视频 | 久久精彩 | 亚洲综合日韩在线 | 91福利视频在线 | 97在线看片 | 日韩午夜电影院 | 狠狠干网址 | 亚洲 欧美 综合 在线 精品 | 国产在线精品一区二区不卡了 | 一区二区三区久久精品 | 少妇bbbb搡bbbb搡bbbb | 久章草在线 | 91爱爱中文字幕 | 91精彩在线视频 | 天天撸夜夜操 | 亚州国产精品 | 国内久久精品 | 97超碰伊人 | 91chinese在线 | 91大神免费视频 | 三级小视频在线观看 | 天堂入口网站 | 国产亚洲欧美一区 | 国产色在线 | 射射色| 久草免费福利在线观看 | 国产视频精选在线 | 去看片| 伊人干综合 | 操操操综合 | 2020天天干天天操 | 欧美极度另类 | 色综合久 | 国产精品久久久久久麻豆一区 | 国产二级视频 | 日韩在线免费小视频 | 伊人五月在线 | 精品福利av | 日韩欧美在线观看一区二区三区 | 久久精品视频一 | 天天操婷婷| 黄网站色 | 久久九九久久精品 | 天操夜夜操 | 国产精品成人一区二区三区 | 国产香蕉av | 欧美不卡视频在线 | 成人一级 | 国产精品中文字幕在线观看 | 免费看片亚洲 | 手机色在线 | 丁香综合 | 久久久久国产精品一区 | 九九日九九操 | 97人人精品 | 免费h视频 | 国产在线无 | 成年人黄色在线观看 | 亚洲精品美女久久17c | 免费看片成人 | 亚洲精品资源在线观看 | 日韩免费在线观看视频 | 欧日韩在线视频 | 丁香激情综合国产 | 国产精品久久久久999 | 黄网站免费大全入口 | 日日干日日色 | 91麻豆精品一区二区三区 | 久久免费视频在线观看30 | 99视频这里只有 | 99视频免费观看 | 欧美日高清视频 | 日本韩国在线不卡 | 五月av在线| 国产美女主播精品一区二区三区 | 国产高清免费在线观看 | 国产精品久久久久久久久久免费看 | 不卡的av在线| 国产成人无码AⅤ片在线观 日韩av不卡在线 | 亚洲日韩精品欧美一区二区 | 日韩免费大片 | 伊人午夜 | 久久久精选 | 激情视频免费在线 | 亚洲综合视频在线播放 | 天天操天天干天天干 | 99精品欧美一区二区三区 | 波多野结衣在线视频免费观看 | av7777777| 天天av天天| 一区二区不卡视频在线观看 | 美女免费网视频 | 91视频免费看 | 亚洲综合视频网 | 五月婷婷综合激情 | 久久精品牌麻豆国产大山 | 激情综合网婷婷 | 欧美国产日韩一区二区三区 | 欧美做受69 | 又爽又黄又无遮挡网站动态图 | 乱男乱女www7788 | 欧美午夜寂寞影院 | 中文免费| 欧美大jb| 高清国产午夜精品久久久久久 | 欧美一区二区三区在线 | 中文字幕在线看视频国产中文版 | 国产91全国探花系列在线播放 | 国产精品免费视频一区二区 | 日韩一级成人av | 视频一区二区在线 | 国产玖玖精品视频 | 日本在线观看一区二区 | 久久久久久视频 | 国产精品自产拍在线观看网站 | 免费成人在线观看视频 | 欧美-第1页-屁屁影院 | 午夜久久美女 | 国产一区在线视频观看 | 久久精品一级片 | 蜜臀久久99精品久久久久久网站 | 在线观看av国产 | 精品99在线视频 | 久久免费公开视频 | 亚洲精品日韩一区二区电影 | 国产精品一区二区久久久 | 日韩免费中文 | 中文字幕色播 | 午夜免费福利视频 | 免费观看一区二区 | 在线观看中文字幕亚洲 | 国产91影视| 91成年视频| 成年人av在线播放 | 国产精品av在线免费观看 | 日韩a在线看 | 另类五月激情 | 97影视 | 在线成人高清电影 | 精品专区一区二区 | 天天爱天天色 | 天天操比| www天天干| 91黄色在线看 | 久久美女电影 | 亚洲伦理中文字幕 | 久久久www成人免费毛片 | 国产成人在线观看免费 | 亚洲国产高清在线 | 久九视频 | 国产亚洲成av人片在线观看桃 | 日本精品久久久一区二区三区 | 亚洲国产免费网站 | 亚洲精品久久久久久久不卡四虎 | 2023亚洲精品国偷拍自产在线 | 亚洲综合欧美日韩狠狠色 | 在线免费观看麻豆 | 蜜桃av久久久亚洲精品 | 777久久久 | 国产成人精品一区二区三区 | 日韩视频一区二区三区在线播放免费观看 | 99热在线精品观看 | 国产美女精品视频 | 久色伊人 | 一区二区三区在线免费观看 | 欧美日韩国产一区二区三区在线观看 | 黄色福利| 中文字幕在线观看亚洲 | 免费三级大片 | 四虎精品成人免费网站 | 69av视频在线 | 日韩视频中文字幕 | 亚洲综合在线五月天 | 精品日韩在线 | 一区 二区电影免费在线观看 | 国产大片免费久久 | 成年人免费看片网站 | 日本久久久久久科技有限公司 | 天天弄天天干 | 国产精品一区二区三区视频免费 | 久日视频| 在线91精品 | 欧洲亚洲精品 | 亚洲精品免费看 | 亚洲伊人网在线观看 | 免费人成在线观看网站 | 91视频黄色 | 99久国产 | 免费视频久久久 | av黄色一级片 | 久久国产美女视频 | 国产精品成人一区 | 日韩精品免费一区二区在线观看 | 久久99久久99 | 精品日韩在线 | 久久精品综合网 | 色成人亚洲网 | 日韩精品一区二区三区电影 | 国产精品久久久久免费 | 96精品视频 | www.亚洲在线 | 日韩美女高潮 | 国产精品手机播放 | 24小时日本在线www免费的 | 久久久免费少妇 | 亚洲精品免费在线观看视频 | 在线观看亚洲视频 | 去干成人网 | 亚洲午夜大片 | 成人黄色小说在线观看 | 精品视频免费久久久看 | 婷婷在线精品视频 | 西西4444www大胆无视频 | 国产精品爽爽久久久久久蜜臀 | 日韩免费成人av | 国产成人久久久77777 | 狠狠的干狠狠的操 | 人人讲| 激情小说网站亚洲综合网 | 91香蕉国产在线观看软件 | 日日夜日日干 | 精品视频免费久久久看 | 99日韩精品| 日韩在线观看不卡 | 欧美久草网| 视频一区二区三区视频 | 日韩成人av在线 | 免费av小说 | 久久网站免费 | 久久电影日韩 | 久久国产精品久久久 | 国产视频精品在线 | 久久五月天色综合 | 伊人五月综合 | 97精品一区 | 国产色综合天天综合网 | 国产又粗又猛又色又黄网站 | 婷婷色中文字幕 | 在线观看中文av | 久久久久日本精品一区二区三区 | 高潮毛片无遮挡高清免费 | 男女激情网址 | 国产精品视频内 | 91香蕉视频 | 91在线免费播放视频 | 天天碰天天操视频 | 婷婷亚洲综合五月天小说 | 美女黄网站视频免费 | 在线视频日韩 | 成人久久免费视频 | 国产日韩精品一区二区三区在线 | 在线视频久 | 成人app在线免费观看 | 一级片黄色片网站 | 久久99国产一区二区三区 | 成人a毛片 | 国产精品久久综合 | 日韩视频1 | 黄色三级av| 日本护士撒尿xxxx18 | 中文字幕亚洲国产 | 五月天天在线 | 久章草在线观看 | 亚洲欧洲国产日韩精品 | 精品久久久久久亚洲综合网 | 亚州精品天堂中文字幕 | 特级xxxxx欧美| 中文字幕影视 | 久久精品视频观看 | 成人在线免费看视频 | 成x99人av在线www | 色偷偷中文字幕 | 久久国产电影院 | 久久一区二区三区日韩 | 天天操欧美 | 久久精彩免费视频 | 青春草国产视频 | 久久欧洲视频 | 中文字幕在线影视资源 | 亚洲国产精品久久久久 | 天天天操操操 | av在线免费播放网站 | 色在线最新 | 岛国片在线 | 99久久影视 | 欧美亚洲成人xxx | 色九色 | av片子在线观看 | 亚洲成人家庭影院 | 久久国产精品色婷婷 | 国产午夜一区 | 最新日韩在线观看视频 | 蜜臀av在线一区二区三区 | 久久综合一本 | 97精品国自产拍在线观看 | www黄免费| 91免费视频国产 | 国产精品二区在线 | 在线观看中文字幕亚洲 | 99久久一区 | 中文av日韩 | 欧美另类交在线观看 | 奇米四色影狠狠爱7777 | 91香蕉视频黄 | 午夜精品一区二区三区免费 | 91久久国产精品 | 91久久一区二区 | 97在线视频免费播放 | 激情深爱五月 | 男女激情麻豆 | 精品免费久久久久 | 69绿帽绿奴3pvideos | 一级做a爱片性色毛片www | 中文字幕高清在线播放 | 成人免费观看网址 | 日日操日日插 | 黄色成人av| 一二三区视频在线 | 国产福利91精品 | 成人午夜黄色影院 | 中文字幕视频三区 | 亚洲黄色av | 欧美a级免费视频 | 麻豆果冻剧传媒在线播放 | 国产区精品 | 性色av一区二区三区在线观看 | 精品国产一区二区三区在线 | av色综合网 | 国产一区免费 | 操操操av | 国精产品999国精产品视频 | 99久久日韩精品免费热麻豆美女 | 干天天 | 97碰在线 | 麻豆国产视频 | 在线国产欧美 | 亚洲成人av在线 | 久草在线资源免费 | 349k.cc看片app| 国际精品久久久久 | 日日干,天天干 | 中文字幕一区二区三区乱码在线 | 在线观看成人网 | 精品女同一区二区三区在线观看 | 日本性久久 | 久草免费新视频 | 精品国产一二三四区 | a视频在线| av丁香| 五月婷婷综合网 | 操操操综合 | 亚洲精品国产区 | 日韩久久精品一区二区三区 | 天天综合天天做天天综合 | 亚洲aⅴ久久精品 | 亚洲精品三级 | 色诱亚洲精品久久久久久 | 69人人 | 欧美在线1 | 中文字幕在线资源 | 国产一区二区手机在线观看 | www免费视频com━ | 国产一区二区手机在线观看 | 中中文字幕av在线 | 亚洲精品99久久久久久 | 激情丁香 | 亚洲激情在线观看 | 91在线精品秘密一区二区 | 欧美中文字幕第一页 | 日本精品一区二区三区在线播放视频 | 国产精品日韩在线 | av在线电影网站 | 狠狠干干 | 天天操天天艹 | 毛片一区二区 | 久草在线视频在线 | 国产亚洲成av人片在线观看桃 | 国产精品久久久久久久久久妇女 | 婷婷综合亚洲 | 久久久国产精品免费 | 草莓视频在线观看免费观看 | 丁香高清视频在线看看 | 亚洲精品1234区 | 久久九九精品 | 视频一区在线免费观看 | 婷婷久草 | 国产一级黄色片免费看 | 久久免费看片 | 国产精品网站 | www.香蕉| 成人免费视频播放 | 久久精品99国产 | 91激情视频在线 | 久久久久久久久久网站 | 日韩精品不卡在线观看 | 欧美精品一二三 | 激情欧美日韩一区二区 | 国产在线精品观看 |