精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

SpringBoot 整合 Mybatis 實現數據表增刪改查,保姆級教程!

開發 前端
本文主要圍繞利用 Mybatis 框架來實現對數據庫表的快速訪問操作,與 Spring Boot JPA 相比,Mybatis 在使用上更加靈活,對數據表的操作就像在本地數據庫寫 SQL 一樣方便,對于業務復雜的查詢場景,它比 Spring Boot JPA 要靈活很多。

01、背景介紹

在上一篇文章中,我們介紹了利用 Spring Boot JPA 來實現對數據庫的訪問操作,雖然它在國外廣泛流行,但是在國內流行程度遠不如 MyBatis。

原因在于,在 ORM 框架中其實還有另一個翹楚,那就是剛剛說到的 MyBatis,它的實現方式與 Spring Boot JPA 完全不同,MyBatis 框架不會幫助用戶動態生成 SQL 語句,它把 SQL 的編寫工作完全交給了用戶,開發者可以像在本地數據庫中寫 SQL 語句一樣快速的完成對數據庫表的操作,非常易于新人上手,唯一的缺點就是配置工作量很大,好在有代碼生成器,可以幫助開發者減輕不少的開發工作量。

ORM 框架發展至今,只剩下兩家了,一個是以Hibernate為代表,開發者可以不用寫一句 SQL 就可以輕松完成對數據庫的訪問操作;另一個是以MyBatis為代表,開發者可以根據自己的業務需求靈活的編寫動態 SQL 完成對數據庫的訪問操作。

總的來說,兩者各有特點,如果當前業務所有的業務操作都是單表并且沒有很復雜的查詢要求,那么采用 Spring Boot JPA 來開發,效率會更高;如果業務很復雜,各表之間經常需要連表查詢,那么采用MyBatis來開發會是一個非常好的選擇。在企業級系統開發中,因為業務比較復雜,國內采用MyBatis來開發的項目相對比較多些。

今天這篇文章我們就具體來說說如何在 Spring Boot 中整合 MyBatis 完成數據庫表的增刪改查操作。

02、應用實踐

2.1、工程配置

首先,在pom.xml文件中引入mybatis-spring-boot-starter依賴,具體如下:

<!--spring boot mybatis支持-->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.0.0</version>
</dependency>
<!--mysql 驅動-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

關于mybatis-spring-boot-starter與Spring Boot的版本對應關系,可以參考如下:

  • 1.3.x版本:適用于 MyBatis 3.4+、Java 6+、Spring Boot 1.5
  • 2.0.x版本:適用于 MyBatis 3.5+、Java 8+、Spring Boot 2.0/2.1
  • 2.1.x版本:適用于 MyBatis 3.5+、Java 8+、Spring Boot 2.1+

本項目采用的是Spring Boot 2.1.0構建,因此選擇2.0.0版本。

然后,在application.properties文件中添加數據源信息和相關的MyBatis配置參數,內容如下:

# 數據源配置
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

# 打印SQL語句
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

MyBatis支持兩種開發模式。

  • 第一種:基于注解的配置實現
  • 第二種:基于XML的配置實現

下面我們一起來這兩種具體的應用方式。

2.2、基于注解的配置實現

基于注解的配置實現,簡單的說就是采用注解來開發,具體實現如下。

2.2.1、創建數據庫表

首先,mybatis框架不會幫助我們根據實體類自動生成目標數據庫表,因此我們需要事先設計好數據庫表結構,在此我們以角色表tb_role為例,具體創建命令如下。

CREATE TABLE `tb_role` (
  `id` int(11) unsigned NOT NULL COMMENT '主鍵ID',
  `role_name` varchar(50) DEFAULT NULL COMMENT '角色名稱',
  `create_time` datetime DEFAULT NULL COMMENT '創建時間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2.2.2、編寫對應的實體類

package com.example.springboot.entity;

public class Role {

    /**
     * 主鍵ID
     */
    private Integer id;

    /**
     * 角色名稱
     */
    private String roleName;

    /**
     * 創建時間
     */
    private Date createTime;

    // set、get方法等...
}

2.2.3、編寫對應的 Mapper 接口

package com.example.springboot.mapper;

public interface RoleMapper {

    @Select("select * from tb_role")
    @Results({
            @Result(property = "id",  column = "id"),
            @Result(property = "roleName",  column = "role_name"),
            @Result(property = "createTime", column = "create_time")
    })
    List<Role> findAll();

    @Select("select * from tb_role where id =#{id}")
    @Results({
            @Result(property = "id",  column = "id"),
            @Result(property = "roleName",  column = "role_name"),
            @Result(property = "createTime", column = "create_time")
    })
    Role findById(@Param("id") Integer id);

    @Insert("insert into tb_role(id, role_name, create_time) VALUES(#{id}, #{roleName}, #{createTime})")
    int insert(Role role);

    @Update("update tb_role set role_name=#{roleName} WHERE id=#{id}")
    int update(Role role);

    @Delete("delete from tb_role where id =#{id}")
    int delete(@Param("id") Integer id);
}

2.2.4、添加 Mapper 接口掃描路徑

默認創建的 Mapper 接口無法被自動加載到 Spring IOC 容器中,因此需要在Application啟動類上,添加 Mapper 接口的包掃描路徑,可以通過@MapperScan注解來完成注入,具體如下。

@MapperScan("com.example.springboot.mapper")
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

2.2.5、單元測試

最后,我們編寫單元測試來驗證一下內容的正確性,代碼如下:

@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
public class RoleMapperJunit {

    @Autowired
    private RoleMapper roleMapper;

    @Test
    public void test(){
        // 新增數據
        roleMapper.insert(new Role(1, "開發工程師", new Date()));
        roleMapper.insert(new Role(2, "測試工程師", new Date()));
        roleMapper.insert(new Role(3, "項目經理", new Date()));

        // 查詢數據
        List<Role> roleList = roleMapper.findAll();
        System.out.println("第一次查詢全部數據結果:" + roleList.toString());

        System.out.println("----------------------");

        // 修改單條數據
        roleMapper.update(new Role(1, "技術經理"));

        // 單條查詢
        Role role = roleMapper.findById(1);
        System.out.println("查詢[id=1]結果:" + role.toString());

        System.out.println("----------------------");

        // 刪除單條數據
        roleMapper.delete(1);

        // 查詢數據
        List<Role> roleList1 = roleMapper.findAll();
        System.out.println("第二次查詢全部數據結果:" + roleList1.toString());
    }
}

運行單元測試,輸出結果如下!

第一次查詢全部數據結果:[Role{id=1, roleName='開發工程師', createTime=Sun Apr 28 11:44:52 CST 2024}, Role{id=2, roleName='測試工程師', createTime=Sun Apr 28 11:44:52 CST 2024}, Role{id=3, roleName='項目經理', createTime=Sun Apr 28 11:44:52 CST 2024}]
----------------------
查詢[id=1]結果:Role{id=1, roleName='技術經理', createTime=Sun Apr 28 11:44:52 CST 2024}
----------------------
第二次查詢全部數據結果:[Role{id=2, roleName='測試工程師', createTime=Sun Apr 28 11:44:52 CST 2024}, Role{id=3, roleName='項目經理', createTime=Sun Apr 28 11:44:52 CST 2024}]

至此,基于注解模式的實現方式已經介紹完畢了。

如果有一定開發經歷的同學可能會感覺到,基于注解方式的開發模式雖然簡單,但是弊端也很大,假如查詢的時候,需要連接的表很多,字段也多,代碼可讀性就變得很差,因此大多數情況下,開發者會更傾向于選擇基于 XML 的配置實現方式開發,原因是它的可讀性更高。

2.3、基于XML的配置實現

基于 XML 的配置實現,是一種最常用的開發模式,具體實現如下。

2.3.1、創建數據庫表

與上面類似,我們創建一張新表tb_menu來介紹,具體創建命令如下。

CREATE TABLE `tb_menu` (
  `id` int(11) unsigned NOT NULL COMMENT '主鍵ID',
  `menu_name` varchar(50) DEFAULT NULL COMMENT '菜單名稱',
  `create_time` datetime DEFAULT NULL COMMENT '創建時間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2.3.2、編寫對應的實體類

package com.example.springboot.entity;

public class Menu {

    /**
     * 主鍵ID
     */
    private Integer id;

    /**
     * 菜單名稱
     */
    private String menuName;

    /**
     * 創建時間
     */
    private Date createTime;

    // set、get方法等...
}

2.3.3、編寫對應的 Mapper 接口

與上面基于注解的開發模式類似,只是少了注解配置。

package com.example.springboot.mapper;

public interface MenuMapper {

    List<Menu> findAll();

    Menu findById(@Param("id") Integer id);

    int insert(Menu role);

    int update(Menu role);

    int delete(@Param("id") Integer id);
}

2.3.4、創建 XML 映射文件

在src/main/resources/mybatis/mapper目錄下創建MenuMapper.xml文件,并與 Mapper 接口建立映射關系,內容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.springboot.mapper.MenuMapper">

    <!--BaseResultMap-->
    <resultMap id="BaseResultMap" type="com.example.springboot.entity.Menu" >
        <id column="id" property="id" jdbcType="INTEGER" />
        <result column="menu_name" property="menuName" jdbcType="VARCHAR" />
        <result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
    </resultMap>

    <!--Base_Column_List-->
    <sql id="Base_Column_List">
        id
        ,menu_name
        ,create_time
    </sql>

    <select id="findAll" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List"/>
        from tb_menu
        order by id
    </select>

    <select id="findById" resultMap="BaseResultMap" parameterType="java.lang.Integer">
        select
        <include refid="Base_Column_List"/>
        from tb_menu
        where id = #{id,jdbcType=INTEGER}
    </select>

    <insert id="insert" parameterType="com.example.springboot.entity.Menu">
        insert into tb_menu(id, menu_name, create_time)
        values(#{id}, #{menuName}, #{createTime})
    </insert>

    <update id="update" parameterType="com.example.springboot.entity.Menu">
        update tb_menu
        set menu_name = #{menuName,jdbcType=VARCHAR}
        where id = #{id,jdbcType=INTEGER}
    </update>

    <delete id="delete" parameterType="java.lang.Integer">
        delete from tb_menu
        where id = #{id,jdbcType=INTEGER}
    </delete>

</mapper>

2.3.5、創建 Mybatis 全局配置文件

在src/main/resources/mybatis目錄下創建mybatis-config.xml文件,可以全局配置 mybatis 相關屬性信息,示例如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <settings>
        <!-- 指定MyBatis所用日志的具體實現,STDOUT_LOGGING:表示打印到控制臺-->
        <setting name="logImpl" value="STDOUT_LOGGING" />
    </settings>

    <typeAliases>
        <!--配置類型別名可為Java類型設置一個縮寫名字,以便于在xml中通過簡寫來代替全限定類名-->
        <typeAlias alias="Integer" type="java.lang.Integer" />
        <typeAlias alias="Long" type="java.lang.Long" />
        <typeAlias alias="HashMap" type="java.util.HashMap" />
        <typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap" />
        <typeAlias alias="ArrayList" type="java.util.ArrayList" />
        <typeAlias alias="LinkedList" type="java.util.LinkedList" />
    </typeAliases>

</configuration>

更多的配置屬性,可以參考這篇文章。

2.3.6、添加 Mapper 接口掃描路徑

同上,需要在Application啟動類上添加 Mapper 接口的包掃描路徑,如果已添加,可以忽略。

@MapperScan("com.example.springboot.mapper")
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

2.3.7、配置 XML 文件掃描路徑

與基于注解的開發模式稍有不同,我們還需要在application.properties文件中配置 Mybatis 相關的 XML 文件掃描目錄,否則啟動報錯,內容如下:

# 配置mybatis全局配置文件掃描
mybatis.config-location=classpath:mybatis/mybatis-config.xml
# 配置mybatis的xml配置文件掃描目錄
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
# 打印SQL語句,需要注射掉這個mybatis全局屬性配置,否則啟動報錯
#mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

2.3.8、單元測試

最后,我們編寫單元測試來驗證一下內容的正確性,代碼如下:

public class MenuMapperJunit {

    @Autowired
    private MenuMapper menuMapper;

    @Test
    public void test(){
        // 新增數據
        menuMapper.insert(new Menu(1, "用戶菜單", new Date()));
        menuMapper.insert(new Menu(2, "角色菜單", new Date()));
        menuMapper.insert(new Menu(3, "系統菜單", new Date()));

        // 查詢數據
        List<Menu> menuList = menuMapper.findAll();
        System.out.println("第一次查詢全部數據結果:" + menuList.toString());

        System.out.println("----------------------");

        // 修改單條數據
        menuMapper.update(new Menu(1, "項目菜單"));

        // 單條查詢
        Menu menu = menuMapper.findById(1);
        System.out.println("查詢[id=1]結果:" + menu.toString());

        System.out.println("----------------------");

        // 刪除單條數據
        menuMapper.delete(1);

        // 查詢數據
        List<Menu> menuList1 = menuMapper.findAll();
        System.out.println("第二次查詢全部數據結果:" + menuList1.toString());
    }
}

運行單元測試,輸出結果如下!

第一次查詢全部數據結果:[Menu{id=1, menuName='用戶菜單', createTime=Sun Apr 28 14:24:49 CST 2024}, Menu{id=2, menuName='角色菜單', createTime=Sun Apr 28 14:24:49 CST 2024}, Menu{id=3, menuName='系統菜單', createTime=Sun Apr 28 14:24:50 CST 2024}]
----------------------
查詢[id=1]結果:Menu{id=1, menuName='項目菜單', createTime=Sun Apr 28 14:24:49 CST 2024}
----------------------
第二次查詢全部數據結果:[Menu{id=2, menuName='角色菜單', createTime=Sun Apr 28 14:24:49 CST 2024}, Menu{id=3, menuName='系統菜單', createTime=Sun Apr 28 14:24:50 CST 2024}]

至此,基于 XML 模式的實現方式已經介紹完畢了。

實際開發過程中,如果不需要自定義全局配置 Mybatis 數據,也可以省掉創建 Mybatis 全局配置文件這一步。

03、小結

本文主要圍繞利用 Mybatis 框架來實現對數據庫表的快速訪問操作,與 Spring Boot JPA 相比,Mybatis 在使用上更加靈活,對數據表的操作就像在本地數據庫寫 SQL 一樣方便,對于業務復雜的查詢場景,它比 Spring Boot JPA 要靈活很多。而且可維護性更高。

如果是企業級的 web 項目,推薦采用 Mybatis 框架作為持久層。

04、參考

  1. https://mybatis.net.cn/
責任編輯:武曉燕 來源: 潘志的研發筆記
相關推薦

2024-08-29 08:58:30

JPA編寫數據操

2025-09-02 01:40:00

2021-10-20 09:04:21

Spring Beanscope數據庫

2020-05-28 16:50:59

源碼分析 MybatisJava

2012-04-19 10:06:16

ibmdw

2019-11-07 15:39:36

數據庫MySQL文章

2021-07-05 09:24:06

MySQL SQL 語句數據庫

2023-02-27 07:37:56

Curl操作SQL

2024-11-18 00:22:34

2012-04-12 09:23:15

達夢數據庫

2023-06-07 08:08:37

MybatisSpringBoot

2009-11-13 15:54:26

ADO.NET數據庫操

2023-06-08 08:13:43

2022-12-01 11:41:24

2022-12-12 11:47:34

WindowsPySpark服務器

2024-07-26 10:50:51

SpringScrew數據庫

2022-04-28 07:31:41

Springkafka數據量

2020-10-29 08:39:45

JSONJava對象

2025-04-11 10:13:00

數據庫APIFastAPI

2021-05-19 09:53:16

SpringbootMyBatisMySQL
點贊
收藏

51CTO技術棧公眾號

中文有码一区| 国产日产一区二区| 亚洲一区二区三区高清不卡| 日韩精品中文字幕视频在线| 日本在线观看a| 婷婷成人激情| 成人免费va视频| 人人做人人澡人人爽欧美| 亚洲黄色网址大全| 亚洲国产中文在线二区三区免| 亚洲成人综合网站| 天天综合色天天综合色hd| 国产精品无码专区av免费播放| 精品不卡视频| 国产一区二区三区精品久久久| 国产又粗又长又爽又黄的视频| 91九色在线播放| 中文字幕欧美国产| 国产精品美女久久久久av福利| 波多野结衣大片| 国产一区亚洲| 国产亚洲综合久久| 性农村xxxxx小树林| 高清无码一区二区在线观看吞精| 国产一区二区三区精品在线| 亚洲经典视频| 欧美色窝79yyyycom| 亚洲理论电影在线观看| 91社区在线观看| 波多野结衣在线一区| 国产日韩中文字幕| 手机看片久久久| 欧美日韩三区| 久久久国产精品视频| 亚洲av无码国产精品久久| 美女精品久久| 欧美日本国产视频| 成人在线激情网| 国产直播在线| 一区二区三区在线播| 中文字幕一区二区三区在线乱码| 青青青草原在线| 白白色亚洲国产精品| 97se亚洲综合| 国产精品玖玖玖| 麻豆精品国产91久久久久久| 热久久免费国产视频| 日本三级视频在线| 欧美三级在线| 久久99热精品这里久久精品| 国产精品久久国产精麻豆96堂| 国产91久久精品一区二区| 亚洲国产天堂久久综合网| 国产免费a级片| 亚洲网一区二区三区| 日韩欧美综合一区| 极品人妻一区二区| 日韩区欧美区| 欧美成人伊人久久综合网| 超碰在线免费av| 99热只有这里有精品| 拍真实国产伦偷精品| 国产精品丝袜黑色高跟| 色婷婷精品国产一区二区三区| 九色在线观看| 久久久99免费| 亚洲韩国在线| 素人av在线| 亚洲色图另类专区| 国产日产欧美一区二区| 91高清在线观看视频| 亚洲女女做受ⅹxx高潮| 一级特黄妇女高潮| 麻豆福利在线观看| 午夜久久久影院| 怡红院av亚洲一区二区三区h| а√天堂资源官网在线资源| 亚洲成av人片在线观看无码| 色欲av无码一区二区人妻| 特黄毛片在线观看| 在线免费观看成人短视频| 久久99999| 精品国产第一国产综合精品| 日韩女优电影在线观看| 日本黄色免费观看| 精品久久网站| 久久成年人免费电影| 69精品久久久| 久久亚洲欧美| 91精品美女在线| 国精产品乱码一区一区三区四区| jiyouzz国产精品久久| 欧洲亚洲一区二区三区四区五区| 日本视频在线| 亚洲亚洲人成综合网络| 丰满人妻中伦妇伦精品app| 国内欧美日韩| 亚洲精品一区二区在线观看| 国产一二三四五区| 中文字幕亚洲精品乱码| 国产69久久精品成人| 在线免费观看日韩视频| 成人免费毛片app| 丝袜足脚交91精品| 好吊日av在线| 欧美三片在线视频观看 | 国产欧美一区二区色老头| 国产成人在线精品| 亚洲av无码乱码国产精品| 久久亚洲一区二区三区四区| 波多野结衣三级在线| 国产99在线观看| 欧美裸体一区二区三区| 亚洲欧美日本一区| 欧美精品麻豆| 国产精品高潮粉嫩av| 懂色av成人一区二区三区| 亚洲国产成人在线| 老太脱裤子让老头玩xxxxx| 成人在线免费av| 日韩精品在线观| 麻豆成人在线视频| 麻豆专区一区二区三区四区五区| 国产伦精品一区二区三区视频免费 | 欧美性爽视频| 欧美日本乱大交xxxxx| 国产伦精品一区二区三区妓女 | 日韩视频中文字幕| 日韩免费不卡视频| 国产精品资源网| 亚洲日本精品| 欧美日韩视频免费观看| 亚洲国产欧美精品| 久久久精品视频在线| 狠狠色狠狠色综合系列| www.欧美日本韩国| 大乳在线免费观看| 午夜久久电影网| 成人在线短视频| 日韩久久久久| 国产成人亚洲综合| 日本天堂在线| 第一福利永久视频精品| 久久久久中文字幕亚洲精品| 91精品啪在线观看国产18| 国产精品电影观看| 国产二区在线播放| 在线免费亚洲电影| 国产精品理论在线| 美女网站视频久久| 亚洲午夜久久久影院伊人| 91精品国产经典在线观看| 亚洲精品一线二线三线无人区| 免费在线看黄网址| 成人国产视频在线观看| 僵尸世界大战2 在线播放| 亚洲三级av| 欧美激情一级精品国产| 亚洲精品人妻无码| 亚洲自拍偷拍图区| 国产清纯白嫩初高中在线观看性色| 亚洲精品成人| 风间由美久久久| av手机免费在线观看| 亚洲国产欧美在线成人app| 亚洲免费在线观看av| 91在线视频网址| 日本精品www| 欧洲激情综合| 国产精品久久久久久久久男| av在线播放网站| 欧美日韩第一区日日骚| 疯狂试爱三2浴室激情视频| 国产风韵犹存在线视精品| 国产一区二区四区| 先锋影音国产精品| 国产精品福利片| 美女隐私在线观看| 精品国产制服丝袜高跟| 西西44rtwww国产精品| 久久精品亚洲精品国产欧美kt∨| 五月天婷婷激情视频| 国产电影一区二区在线观看| 成人av资源网| 极品美女一区| 久久精品视频导航| 无码精品黑人一区二区三区 | 99精品视频在线免费播放| 欧美极品少妇xxxxx| 久久国产精品高清一区二区三区| 欧美日韩国产高清一区| www青青草原| 久久这里只精品最新地址| 午夜两性免费视频| 亚洲福利电影| 亚洲国产精品日韩| 成人性生交大片免费看中文视频| 国产97免费视| 羞羞视频在线观看免费| 亚洲天堂网在线观看| 国产三级伦理片| 色综合咪咪久久| 欧美xxxx黑人xyx性爽| 久久久久久电影| 欧美性猛交xx| 轻轻草成人在线| 国产精品成人久久电影| 99精品美女| 久久久久天天天天| 精品三级国产| 国产精品第100页| 超碰成人av| 久久国产精彩视频| 成人午夜影视| 日韩精品在线第一页| 精品国产九九九| 欧美性感一类影片在线播放| 永久免费看片在线播放| 一色桃子久久精品亚洲| 国产特黄级aaaaa片免| 成人综合婷婷国产精品久久免费| 午夜精品中文字幕| 日韩精品欧美成人高清一区二区| 国产xxxx振车| 伊人久久大香线| 亚洲一区二区三区免费看| 日韩人体视频| 国产精品一区二区三区在线| 精品一区二区三区四区五区| 国产精品视频久久久| 天堂8中文在线最新版在线| 久久全球大尺度高清视频| av网址在线| 久久久999精品| 日本在线免费| 日韩在线精品视频| 国产女主播在线直播| 亚洲美女又黄又爽在线观看| 天堂网在线中文| 精品福利二区三区| 成人爽a毛片一区二区| 欧美一区二区三区视频在线观看| 亚洲午夜激情视频| 精品视频资源站| 成人黄色片在线观看| 在线免费观看日韩欧美| 亚洲午夜无码久久久久| 欧美综合天天夜夜久久| 亚洲精品国产无码| 欧洲另类一二三四区| 成人小视频在线播放| 日本韩国精品在线| 波多野结衣不卡| 欧美在线免费播放| 美女黄页在线观看| 欧美精品丝袜中出| 国产永久免费视频| 欧美一区二区三区在| 国产ts变态重口人妖hd| 日韩一二三区不卡| 亚洲AV无码精品国产| 精品国产电影一区二区| 风流老熟女一区二区三区| 精品对白一区国产伦| 色婷婷av一区二区三| 日韩av影视在线| 黄色片在线免费观看| 日韩在线视频观看| 大片免费在线观看| 欧美精品久久久久| 在线一区av| 国产精品久久久久久久久久久久久久| 精品免费av一区二区三区| 国产欧美精品久久久| 日本高清精品| 国产呦系列欧美呦日韩呦| 色棕色天天综合网| 一区二区冒白浆视频| 欧美精品成人| 久久精品免费一区二区| 秋霞影院一区二区| 国产成人精品一区二区三区在线观看| av在线免费不卡| 欧美性猛交xxxx乱| 亚洲少妇最新在线视频| 五月婷婷一区二区| 狠狠色狠狠色综合日日五| 在线观看国产成人| 精品免费99久久| 韩日视频在线| 久久在线观看视频| 在线精品亚洲欧美日韩国产| 成人久久久久久久| 青青一区二区| 亚洲精品国产精品久久| 亚洲欧洲视频| 四季av一区二区三区| 9久草视频在线视频精品| 日韩欧美综合一区| 日本三级网站在线观看| 欧美日韩一二三| 色哟哟国产精品色哟哟| 少妇精69xxtheporn| 美女视频在线免费| 成人深夜直播免费观看| 亚洲三级精品| 国产精品久久久久久久久电影网| 日韩国产精品91| 亚洲一级片免费观看| 国产欧美日韩精品一区| 国产一卡二卡在线播放| 欧美精品一卡二卡| 黄色国产在线| 性金发美女69hd大尺寸| 中文幕av一区二区三区佐山爱| 国产精品我不卡| 久久久久久久久久久久久久久久久久 | 国产精品黄页免费高清在线观看| 一区二区三区免费在线看| 亚洲成色最大综合在线| 一区二区三区成人精品| 蜜桃视频无码区在线观看| 中文在线一区二区| 香蕉影院在线观看| 亚洲国产一区二区三区在线观看| 成人在线免费看黄| 国产日韩中文字幕在线| 精品高清在线| 精品视频一区二区在线| av色综合久久天堂av综合| 午夜写真片福利电影网| 7777精品伊人久久久大香线蕉| 91涩漫在线观看| 国产精品r级在线| 色婷婷综合久久久久久| 成人免费性视频| 成人自拍视频在线| 欧美精品99久久久| 日韩欧美高清在线| av毛片在线| 亚洲一区二区三区四区视频| 午夜影院欧美| 亚洲综合123| 亚洲精品视频在线观看免费| 一本到在线视频| 日韩中文字幕网| 欧美大陆国产| 正义之心1992免费观看全集完整版| 日本成人中文字幕在线视频| 日本美女xxx| 欧美日韩国产天堂| √天堂资源地址在线官网| 国产精品亚洲激情| 国产精品久久久久一区二区三区厕所| 三区视频在线观看| 亚洲欧美另类小说| av网站在线免费看| 欧美肥婆姓交大片| 成人涩涩网站| 亚洲午夜精品久久久久久人妖| 97久久超碰国产精品| 男人天堂视频网| 深夜福利91大全| 精品久久免费| 欧美 国产 综合| 国产亚洲人成网站| 一级黄在线观看| 欧美猛交ⅹxxx乱大交视频| 超碰精品在线观看| 亚洲一区二区三区av无码| 2021国产精品久久精品| 亚洲精品91天天久久人人| 俺去了亚洲欧美日韩| 中文字幕一区日韩精品| 国产午夜大地久久| 欧美高清在线一区二区| 成 人片 黄 色 大 片| 91av免费观看91av精品在线| jizzjizz欧美69巨大| 国产探花在线观看视频| 婷婷开心激情综合| аⅴ资源新版在线天堂| 7777精品久久久大香线蕉小说| 99精品国产在热久久下载| 日本少妇xxxxx| 日韩一区二区三区视频| 欧美a级在线观看| 亚洲国产一区二区在线 | av网站有哪些| 欧美色精品在线视频| 里番在线播放| 相泽南亚洲一区二区在线播放 | 香蕉网在线播放| 欧美日韩高清在线播放| 绿色成人影院| av动漫免费观看| 97久久超碰国产精品| 99久久国产免费| 国产国产精品人在线视| 国产精品v亚洲精品v日韩精品|