久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

Mybatis_plus基礎教程(總結篇)

瀏覽:69日期:2023-10-22 14:49:36
一.簡介

官網網址:http://mp.baomidou.com/參考教程:http://mp.baomidou.com/guide/

二.特性

無侵入:只做增強不做改變,引入它不會對現有工程產生影響,如絲般順滑損耗?。簡蛹磿詣幼⑷牖?CURD,性能基本無損耗,直接面向對象操作強大的 CRUD 操作:內置通用 Mapper、通用 Service,僅僅通過少量配置即可實現單表大部分 CRUD 操作,更有強大的條件構造器,滿足各類使用需求支持 Lambda 形式調用:通過 Lambda 表達式,方便的編寫各類查詢條件,無需再擔心字段寫錯支持多種數據庫:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer2005、SQLServer 等多種數據庫支持主鍵自動生成:支持多達 4 種主鍵策略(內含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解決主鍵問題支持 XML 熱加載:Mapper 對應的 XML 支持熱加載,對于簡單的 CRUD 操作,甚至可以無 XML 啟動支持 ActiveRecord 模式:支持 ActiveRecord 形式調用,實體類只需繼承 Model 類即可進行強大的 CRUD 操作支持自定義全局通用操作:支持全局通用方法注入( Write once, use anywhere )支持關鍵詞自動轉義:支持數據庫關鍵詞(order、key…)自動轉義,還可自定義關鍵詞內置代碼生成器:采用代碼或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 層代碼,支持模板引擎,更有超多自定義配置等您來使用內置分頁插件:基于 MyBatis 物理分頁,開發者無需關心具體操作,配置好插件之后,寫分頁等同于普通 List 查詢內置性能分析插件:可輸出 Sql 語句以及其執行時間,建議開發測試時啟用該功能,能快速揪出慢查詢內置全局攔截插件:提供全表 delete 、 update 操作智能分析阻斷,也可自定義攔截規則,預防誤操作內置 Sql 注入剝離器:支持 Sql 注入剝離,有效預防 Sql 注入攻擊

三.MyBatis_plus入門

①創建并初始化數據庫mybatis_plus

②創建 User 表其表結構如下:

Mybatis_plus基礎教程(總結篇)

其對應的數據庫 Schema 腳本如下:

DROP TABLE IF EXISTS user;CREATE TABLE user( id BIGINT(20) NOT NULL COMMENT ’主鍵ID’, name VARCHAR(30) NULL DEFAULT NULL COMMENT ’姓名’, age INT(11) NULL DEFAULT NULL COMMENT ’年齡’, email VARCHAR(50) NULL DEFAULT NULL COMMENT ’郵箱’, PRIMARY KEY (id));

其對應的數據庫 Data 腳本如下:

DELETE FROM user;INSERT INTO user (id, name, age, email) VALUES(1, ’Jone’, 18, ’test1@baomidou.com’),(2, ’Jack’, 20, ’test2@baomidou.com’),(3, ’Tom’, 28, ’test3@baomidou.com’),(4, ’Sandy’, 21, ’test4@baomidou.com’),(5, ’Billie’, 24, ’test5@baomidou.com’);四.初始化工程

使用 Spring Initializr 快速初始化一個 Spring Boot 工程

Group:com.atguiguArtifact:mybatis-plus版本:2.2.1.RELEASE

五.添加依賴

①引入依賴spring-boot-starter、spring-boot-starter-test添加:mybatis-plus-boot-starter、MySQL、lombok、在項目中使用Lombok可以減少很多重復代碼的書寫。比如說getter/setter/toString等方法的編寫

<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <!--mybatis-plus--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.0.5</version> </dependency> <!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--lombok用來簡化實體類--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>

注意:引入 MyBatis-Plus 之后請不要再次引入 MyBatis 以及 MyBatis-Spring,以避免因版本差異導致的問題。

②idea中安裝lombok插件1).idea2020版本

Mybatis_plus基礎教程(總結篇)

六.配置

在 application.properties 配置文件中添加 MySQL 數據庫的相關配置:

mysql5:

#mysql數據庫連接spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plusspring.datasource.username=rootspring.datasource.password=123456

mysql8以上(spring boot 2.1):注意:driver和url的變化

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8spring.datasource.username=rootspring.datasource.password=123456

注意:1、這里的 url 使用了 ?serverTimezone=GMT%2B8 后綴,因為Spring Boot 2.1 集成了 8.0版本的jdbc驅動,這個版本的 jdbc 驅動需要添加這個后綴,否則運行測試用例報告如下錯誤:

java.sql.SQLException: The server time zone value ‘Öйú±ê׼ʱ¼ä’ is unrecognized or represents more

2、這里的 driver-class-name 使用了 com.mysql.cj.jdbc.Driver ,在 jdbc 8 中 建議使用這個驅動,之前的 com.mysql.jdbc.Driver 已經被廢棄,否則運行測試用例的時候會有 WARN 信息

七.編寫代碼

①主類在 Spring Boot 啟動類中添加 @MapperScan 注解,掃描 Mapper 文件夾注意:掃描的包名根據實際情況修改

@SpringBootApplication@MapperScan('com.mybatisplus.mapper')public class MybatisPlusApplication { ......}

②實體創建包 entity 編寫實體類 User.java(此處使用了 Lombok 簡化代碼)

//@Data:該注解使用在類上,該注解會提供getter、setter、equals、canEqual、hashCode、toString方法。@Datapublic class User { private Long id; private String name; private Integer age; private String email;}

@Data:該注解使用在類上,該注解會提供getter、setter、equals、canEqual、hashCode、toString方法。Lombok使用參考:https://blog.csdn.net/motui/article/details/79012846

③mapper

創建包 mapper 編寫Mapper 接口: UserMapper.java

public interface UserMapper extends BaseMapper<User> { }八.開始使用

添加測試類,進行功能測試:

@SpringBootTestpublic class MybatisPlusApplicationTests { @Autowired private UserMapper userMapper; @Test public void testSelectList() { System.out.println(('----- selectAll method test ------')); //UserMapper 中的 selectList() 方法的參數為 MP 內置的條件封裝器 Wrapper //所以不填寫就是無任何條件 List<User> users = userMapper.selectList(null); users.forEach(System.out::println); }}

注意:

IDEA在 userMapper 處報錯,因為找不到注入的對象,因為類是動態創建的,但是程序可以正確的執行。

為了避免報錯,可以在 dao 層 的接口上添加----- @Repository

控制臺輸出:

User(id=1, name=Jone, age=18, email=test1@baomidou.com)User(id=2, name=Jack, age=20, email=test2@baomidou.com)User(id=3, name=Tom, age=28, email=test3@baomidou.com)User(id=4, name=Sandy, age=21, email=test4@baomidou.com)User(id=5, name=Billie, age=24, email=test5@baomidou.com)

通過以上幾個簡單的步驟,我們就實現了 User 表的 CRUD 功能,甚至連 XML 文件都不用編寫!

九.配置日志

查看sql輸出日志:在application.properties中加:

#mybatis日志mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

在輸出臺中就有日志了

Mybatis_plus基礎教程(總結篇)

十.MyBatisPlus的CRUD 接口 1、主鍵策略

(1)ID_WORKERMyBatis-Plus默認的主鍵策略是:ID_WORKER 全局唯一ID參考資料:分布式系統唯一ID生成方案匯總:https://www.cnblogs.com/haoxinyue/p/5208136.html

(2)自增策略要想主鍵自增需要配置如下主鍵策略①.需要在創建數據表的時候設置主鍵自增實體字段中配置 @TableId(type = IdType.AUTO)

在User實體類中的id 上加

@TableId(type = IdType.AUTO)private Long id;

要想影響所有實體的配置,可以設置全局主鍵配置

#全局設置主鍵生成策略mybatis-plus.global-config.db-config.id-type=auto

其它主鍵策略:分析 IdType 源碼可知

@Getterpublic enum IdType { /** * 數據庫ID自增 */ AUTO(0), /** * 該類型為未設置主鍵類型 */ NONE(1), /** * 用戶輸入ID * 該類型可以通過自己注冊自動填充插件進行填充 */ INPUT(2), /* 以下3種類型、只有當插入對象ID 為空,才自動填充。 */ /** * 全局唯一ID (idWorker) */ ID_WORKER(3), /** * 全局唯一ID (UUID) */ UUID(4), /** * 字符串全局唯一ID (idWorker 的字符串表示) */ ID_WORKER_STR(5); private int key; IdType(int key) { this.key = key; }}2.插入操作

在User實體類中加

//@TableId:MyBatis-Plus默認的主鍵策略是:ID_WORKER 全局唯一ID @TableId(type = IdType.ID_WORKER) private Long id;

在測試類中

public class MybatisPlusApplicationTests { @Autowired private UserMapper userMapper; public void testInsert(){ User user = new User(); user.setName('Helen'); user.setAge(18); user.setEmail('55317332@qq.com'); int result = userMapper.insert(user); System.out.println(result); //影響的行數 System.out.println(user); //id自動回填 }

注意:數據庫插入id值默認為:全局唯一id

Mybatis_plus基礎教程(總結篇)

3.update

1、根據Id更新操作**注意:**update時生成的sql自動是動態sql:UPDATE user SET age=? WHERE id=?

@Test public void testUpdateById(){ User user = new User(); user.setId(1L); user.setAge(28); int result = userMapper.updateById(user); System.out.println(result); }

2、自動填充項目中經常會遇到一些數據,每次都使用相同的方式填充,例如記錄的創建時間,更新時間等。我們可以使用MyBatis Plus的自動填充功能,完成這些字段的賦值工作:

(1)數據庫表中添加自動填充字段在User表中添加datetime類型的新的字段 create_time、update_time(2)實體上添加注解

@Datapublic class User { @TableId(type = IdType.ID_WORKER) private Long id; private String name; private Integer age; private String email;//在數據庫中是create_time 在User實體類中是createTime, _t自動轉換T @TableField( fill=FieldFill.INSERT) private Date createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; }

(3)實現元對象處理器接口注意:不要忘記添加 @Component 注解

package com.handler;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;import org.apache.ibatis.reflection.MetaObject;import org.springframework.stereotype.Controller;import java.util.Date;@Component public class MyMetaObjectHandler implements MetaObjectHandler { /** * 插入時時間 * @param metaObject */ @Override public void insertFill(MetaObject metaObject) { this.setFieldValByName('createTime',new Date(),metaObject); this.setFieldValByName('updateTime',new Date(),metaObject); } /** * 修改時時間 * @param metaObject */ @Override public void updateFill(MetaObject metaObject) { this.setFieldValByName('updateTime',new Date(),metaObject); }}

(4)再次運行 測試 結果

Mybatis_plus基礎教程(總結篇)

4.樂觀鎖

**主要適用場景:**當要更新一條記錄的時候,希望這條記錄沒有被別人更新,也就是說實現線程安全的數據更新樂觀鎖實現方式:

①取出記錄時,獲取當前version②更新時,帶上這個version③執行更新時, set version = newVersion where version = oldVersion④如果version不對,就更新失敗

(1)數據庫中添加version字段`在這里插入代碼片

ALTER TABLE `user` ADD COLUMN `version` INT

Mybatis_plus基礎教程(總結篇)(2)實體類添加version字段 :并添加 @Version 注解

@TableField(fill = FieldFill.INSERT)3private Integer version;

Mybatis_plus基礎教程(總結篇)

(3)元對象處理器接口添加version的insert默認值

@Controllerpublic class MyMetaObjectHandler implements MetaObjectHandler { /** * 插入時時間 * @param metaObject */ @Override public void insertFill(MetaObject metaObject) { this.setFieldValByName('createTime',new Date(),metaObject); this.setFieldValByName('updateTime',new Date(),metaObject); //看這里 this.setFieldValByName('version',1,metaObject); } /** * 修改時時間 * @param metaObject */ @Override public void updateFill(MetaObject metaObject) { this.setFieldValByName('updateTime',new Date(),metaObject); }}

特別說明:

支持的數據類型只有 int,Integer,long,Long,Date,Timestamp,LocalDateTime整數類型下 newVersion = oldVersion + 1newVersion 會回寫到 entity 中僅支持 updateById(id) 與 update(entity, wrapper) 方法在 update(entity, wrapper) 方法下, wrapper 不能復用!!!

(4)在 MybatisPlusConfig 中注冊 Bean創建配置類

package com.config;import com.baomidou.mybatisplus.core.injector.ISqlInjector;import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;import org.mybatis.spring.annotation.MapperScan;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Profile;import org.springframework.stereotype.Controller;@Configuration@MapperScan('com.mapper')public class MyConfig { /** * 樂觀鎖插件 */ @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); } }

(5)測試樂觀鎖可以修改成功測試后分析打印的sql語句,將version的數值進行了加1操作

/** * 測試 樂觀鎖插件 */@Testpublic void testOptimisticLocker() { //查詢 User user = userMapper.selectById(1L); //修改數據 user.setName('Helen Yao'); user.setEmail('helen@qq.com'); //執行更新 userMapper.updateById(user);}

(5)測試樂觀鎖修改失敗

/** * 測試樂觀鎖插件 失敗 */@Testpublic void testOptimisticLockerFail() { //查詢 User user = userMapper.selectById(1L); //修改數據 user.setName('Helen Yao1'); user.setEmail('helen@qq.com1'); //模擬取出數據后,數據庫中version實際數據比取出的值大,即已被其它線程修改并更新了version user.setVersion(user.getVersion() - 1); //執行更新 userMapper.updateById(user);}5.select

1、根據id查詢記錄

@Testpublic void testSelectById(){ User user = userMapper.selectById(1L); System.out.println(user);}

2、通過多個id批量查詢完成了動態sql的foreach的功能

@Testpublic void testSelectBatchIds(){ List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3)); users.forEach(System.out::println);}

3、簡單的條件查詢通過map封裝查詢條件(不怎么用 看看就行)

@Testpublic void testSelectByMap(){ HashMap<String, Object> map = new HashMap<>(); map.put('name', 'Helen'); map.put('age', 18); List<User> users = userMapper.selectByMap(map); users.forEach(System.out::println);}

**注意:**map中的key對應的是數據庫中的列名。例如數據庫user_id,實體類是userId,這時map的key需要填寫user_id

4、分頁MyBatis Plus自帶分頁插件,只要簡單的配置即可實現分頁功能(1)創建配置類此時可以刪除主類中的 @MapperScan 掃描注解

@Configuration@MapperScan('com.mapper')public class MyConfig { /** * 分頁插件 */ @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } }

(2)測試selectPage分頁(自己用的)測試:最終通過page對象獲取相關數據

/** * 分頁查詢 */ @Test void pages(){ //1.創建page對象 //傳入兩個參數:當前 頁 和 每頁顯示記錄數 Page<User> page=new Page<User>(1,5); //調用mp分頁查詢的方法 //調用mp分頁查詢過程中,底層封裝 //把分頁所有數據封裝到page對象里面 userMapper.selectPage(page,null); //通過page對象獲取分頁數據 System.out.println(page.getCurrent()); System.out.println(page.getRecords()); System.out.println(page.getSize()); System.out.println(page.getTotal()); System.out.println(page.getPages()); System.out.println(page.hasNext()); System.out.println(page.hasPrevious()); }

控制臺sql語句打?。篠ELECT id,name,age,email,create_time,update_time FROM user LIMIT 0,5

(3)測試selectMapsPage分頁:結果集是Map(zjd沒有用過)

@Testpublic void testSelectMapsPage() { Page<User> page = new Page<>(1, 5); IPage<Map<String, Object>> mapIPage = userMapper.selectMapsPage(page, null); //注意:此行必須使用 mapIPage 獲取記錄列表,否則會有數據類型轉換錯誤 mapIPage.getRecords().forEach(System.out::println); System.out.println(page.getCurrent()); System.out.println(page.getPages()); System.out.println(page.getSize()); System.out.println(page.getTotal()); System.out.println(page.hasNext()); System.out.println(page.hasPrevious());}6.delete

1、根據id刪除記錄

@Testpublic void testDeleteById(){ int result = userMapper.deleteById(8L); System.out.println(result);}

2、批量刪除

@Test public void testDeleteBatchIds() { int result = userMapper.deleteBatchIds(Arrays.asList(8, 9, 10)); System.out.println(result); }

3、簡單的條件查詢刪除

@Testpublic void testDeleteByMap() { HashMap<String, Object> map = new HashMap<>(); map.put('name', 'Helen'); map.put('age', 18); int result = userMapper.deleteByMap(map); System.out.println(result);}

4、*邏輯刪除

物理刪除:真實刪除,將對應數據從數據庫中刪除,之后查詢不到此條被刪除數據邏輯刪除:假刪除,將對應數據中代表是否被刪除字段狀態修改為“被刪除狀態”,之后在數據庫中仍舊能看到此條數據記錄(1)數據庫中添加 deleted字段

ALTER TABLE `user` ADD COLUMN `deleted` boolean

Mybatis_plus基礎教程(總結篇)

(2)實體類添加deleted 字段并加上 @TableLogic 注解 和 @TableField(fill = FieldFill.INSERT) 注解

@TableLogic@TableField(fill = FieldFill.INSERT)private Integer deleted;

(3)元對象處理器接口添加deleted的insert默認值

@Controllerpublic class MyMetaObjectHandler implements MetaObjectHandler { /** * 插入時時間 * @param metaObject */ @Override public void insertFill(MetaObject metaObject) { this.setFieldValByName('createTime',new Date(),metaObject); this.setFieldValByName('updateTime',new Date(),metaObject); this.setFieldValByName('version',1,metaObject); //看這里******** this.setFieldValByName('deleted',0,metaObject); } /** * 修改時時間 * @param metaObject */ @Override public void updateFill(MetaObject metaObject) { this.setFieldValByName('updateTime',new Date(),metaObject); }}

(4)application.properties 加入配置此為默認值,如果你的默認值和mp默認的一樣,該配置可無

mybatis-plus.global-config.db-config.logic-delete-value=1mybatis-plus.global-config.db-config.logic-not-delete-value=0

(5)在 MyConfig 中注冊 Bean

@Beanpublic ISqlInjector sqlInjector() { return new LogicSqlInjector();}

(6)測試邏輯刪除測試后發現,數據并沒有被刪除,deleted字段的值由0變成了1測試后分析打印的sql語句,是一條update**注意:**被刪除數據的deleted 字段的值必須是 0,才能被選取出來執行邏輯刪除的操作

/** * 測試 邏輯刪除 */@Testpublic void testLogicDelete() { int result = userMapper.deleteById(1L); System.out.println(result);}

(7)測試邏輯刪除后的查詢MyBatis Plus中查詢操作也會自動添加邏輯刪除字段的判斷

/** * 測試 邏輯刪除后的查詢: * 不包括被邏輯刪除的記錄 */@Testpublic void testLogicDeleteSelect() { User user = new User(); List<User> users = userMapper.selectList(null); users.forEach(System.out::println);}

測試后分析打印的sql語句,包含 WHERE deleted=0SELECT id,name,age,email,create_time,update_time,deleted FROM user WHERE deleted=0

7.性能分析

性能分析攔截器,用于輸出每條 SQL 語句及其執行時間SQL 性能執行分析,開發環境使用,超過指定時間,停止運行。有助于發現問題

1、配置插件(1)參數說明參數:maxTime: SQL 執行最大時長,超過自動停止運行,有助于發現問題。參數:format: SQL是否格式化,默認false。(2)在 MyConfig 中配置

/** * SQL 執行性能分析插件 * 開發環境使用,線上不推薦。 maxTime 指的是 sql 最大執行時長 * * 三種環境 *dev: 開發環境 * test: 測試環境 * prod: 生產環境 * * */ @Bean @Profile({'dev','test'})// 設置 dev test 環境開啟 public PerformanceInterceptor performanceInterceptor() { PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor(); performanceInterceptor.setMaxTime(500);//ms/毫秒,超過此處設置的ms則sql不執行 performanceInterceptor.setFormat(true); return performanceInterceptor; }

(3)Spring Boot 中設置dev環境

#環境設置:dev、test、prodspring.profiles.active=dev

2、測試(1)常規測試

/** * 測試 性能分析插件 */@Testpublic void testPerformance() { User user = new User(); user.setName('我是Helen'); user.setEmail('helen@sina.com'); user.setAge(18); userMapper.insert(user);}

輸出:

Mybatis_plus基礎教程(總結篇)

(2)將maxTime 改小之后再次進行測試

performanceInterceptor.setMaxTime(5);//ms,超過此處設置的ms不執行

如果執行時間過長,則拋出異常:The SQL execution time is too large,輸出:

Mybatis_plus基礎教程(總結篇)

8.其它

如果想進行復雜條件查詢,那么需要使用條件構造器 Wapper,涉及到如下方法1、delete2、selectOne3、selectCount4、selectList5、selectMaps6、selectObjs7、update

十一.條件構造器_wapper介紹 1.wapper介紹

Mybatis_plus基礎教程(總結篇)

Wrapper : 條件構造抽象類,最頂端父類AbstractWrapper : 用于查詢條件封裝,生成 sql 的 where 條件QueryWrapper : Entity 對象封裝操作類,不是用lambda語法UpdateWrapper : Update 條件封裝,用于Entity對象更新操作AbstractLambdaWrapper : Lambda 語法使用 Wrapper統一處理解析 lambda 獲取 column。LambdaQueryWrapper :看名稱也能明白就是用于Lambda語法使用的查詢WrapperLambdaUpdateWrapper : Lambda 更新封裝Wrapper

2.AbstractWrapper

注意:以下條件構造器的方法入參中的 column 均表示數據庫字段1、ge、gt、le、lt、isNull、isNotNull

@Testpublic void testDelete() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper .isNull('name') .ge('age', 12) .isNotNull('email'); int result = userMapper.delete(queryWrapper); System.out.println('delete return count = ' + result);}

SQL:UPDATE user SET deleted=1 WHERE deleted=0 AND name IS NULL AND age >= ? AND email IS NOT NULL

2、eq、ne注意:seletOne 返回的是一條實體記錄,當出現多條時會報錯

@Testpublic void testSelectOne() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.eq('name', 'Tom'); User user = userMapper.selectOne(queryWrapper); System.out.println(user);}

SELECT id,name,age,email,create_time,update_time,deleted,version FROM user WHERE deleted=0 AND name = ?3、between、notBetween包含大小邊界

@Testpublic void testSelectCount() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.between('age', 20, 30); Integer count = userMapper.selectCount(queryWrapper); System.out.println(count);}

SELECT COUNT(1) FROM user WHERE deleted=0 AND age BETWEEN ? AND ?4、allEq

@Testpublic void testSelectList() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); Map<String, Object> map = new HashMap<>(); map.put('id', 2); map.put('name', 'Jack'); map.put('age', 20); queryWrapper.allEq(map); List<User> users = userMapper.selectList(queryWrapper); users.forEach(System.out::println);}

SELECT id,name,age,email,create_time,update_time,deleted,versionFROM user WHERE deleted=0 AND name = ? AND id = ? AND age = ?

5、like、notLike、likeLeft、likeRightselectMaps返回Map集合列表

@Testpublic void testSelectMaps() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper .notLike('name', 'e') .likeRight('email', 't'); List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);//返回值是Map列表 maps.forEach(System.out::println);}

SELECT id,name,age,email,create_time,update_time,deleted,versionFROM user WHERE deleted=0 AND name NOT LIKE ? AND email LIKE ?

6、in、notIn、inSql、notinSql、exists、notExists

in、notIn:①notIn(“age”,{1,2,3})—>age not in (1,2,3)②notIn(“age”, 1, 2, 3)—>age not in (1,2,3)inSql、notinSql:可以實現子查詢①例: inSql(“age”, “1,2,3,4,5,6”)—>age in (1,2,3,4,5,6)②例: inSql(“id”, “select id from table where id < 3”)—>id in (select id from table where id < 3)

@Testpublic void testSelectObjs() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); //queryWrapper.in('id', 1, 2, 3); queryWrapper.inSql('id', 'select id from user where id < 3'); List<Object> objects = userMapper.selectObjs(queryWrapper);//返回值是Object列表 objects.forEach(System.out::println);}

SELECT id,name,age,email,create_time,update_time,deleted,versionFROM user WHERE deleted=0 AND id IN (select id from user where id < 3)

7、or、and注意:這里使用的是 UpdateWrapper不調用or則默認為使用 and 連

@Testpublic void testUpdate1() { //修改值 User user = new User(); user.setAge(99); user.setName('Andy'); //修改條件 UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>(); userUpdateWrapper .like('name', 'h') .or() .between('age', 20, 30); int result = userMapper.update(user, userUpdateWrapper); System.out.println(result);}

UPDATE user SET name=?, age=?, update_time=? WHERE deleted=0 AND name LIKE ? OR age BETWEEN ? AND ?

8、嵌套or、嵌套and這里使用了lambda表達式,or中的表達式最后翻譯成sql時會被加上圓括號

@Testpublic void testUpdate2() { //修改值 User user = new User(); user.setAge(99); user.setName('Andy'); //修改條件 UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>(); userUpdateWrapper .like('name', 'h') .or(i -> i.eq('name', '李白').ne('age', 20)); int result = userMapper.update(user, userUpdateWrapper); System.out.println(result);}

UPDATE user SET name=?, age=?, update_time=?WHERE deleted=0 AND name LIKE ?OR ( name = ? AND age <> ? )

9、orderBy、orderByDesc、orderByAsc

@Testpublic void testSelectListOrderBy() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.orderByDesc('id'); List<User> users = userMapper.selectList(queryWrapper); users.forEach(System.out::println);}

SELECT id,name,age,email,create_time,update_time,deleted,versionFROM user WHERE deleted=0 ORDER BY id DESC

10、last直接拼接到 sql 的最后注意:只能調用一次,多次調用以最后一次為準 有sql注入的風險,請謹慎使用

@Testpublic void testSelectListLast() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.last('limit 1'); List<User> users = userMapper.selectList(queryWrapper); users.forEach(System.out::println);}

}SELECT id,name,age,email,create_time,update_time,deleted,versionFROM user WHERE deleted=0 limit 1

11、指定要查詢的列

@Testpublic void testSelectListColumn() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.select('id', 'name', 'age'); List<User> users = userMapper.selectList(queryWrapper); users.forEach(System.out::println);}

SELECT id,name,age FROM user WHERE deleted=0

12、set、setSql最終的sql會合并 user.setAge(),以及 userUpdateWrapper.set() 和 setSql() 中 的字段

@Testpublic void testUpdateSet() { //修改值 User user = new User(); user.setAge(99); //修改條件 UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>(); userUpdateWrapper .like('name', 'h') .set('name', '老李頭')//除了可以查詢還可以使用set設置修改的字段 .setSql(' email = ’123@qq.com’');//可以有子查詢 int result = userMapper.update(user, userUpdateWrapper);}

UPDATE user SET age=?, update_time=?, name=?, email = ‘123@qq.com’ WHERE deleted=0 AND name LIKE ?

(自己打的)

//mp實現復雜查詢操作 @Test public void testSelectQuery() { //創建QueryWrapper對象 QueryWrapper<User> wrapper = new QueryWrapper<>(); //通過QueryWrapper設置條件 //ge、gt、le、lt //查詢age>=30記錄 //第一個參數字段名稱,第二個參數設置值 wrapper.ge('age',30); //eq:等于、ne:不等于 //wrapper.eq('name','lilei'); //wrapper.ne('name','lilei'); //between:兩者之間 //查詢年齡 20-30 // wrapper.between('age',20,30); //like //wrapper.like('name','岳'); //orderByDesc // wrapper.orderByDesc('id'); //last //wrapper.last('limit 1'); //指定要查詢的列// wrapper.select('id','name'); List<User> users = userMapper.selectList(wrapper); for (User user : users) { System.out.println(user); } }

總結

到此這篇關于Mybatis_plus基礎教程(總結篇)的文章就介紹到這了,更多相關Mybatis plus基礎內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Mybatis 數據庫
相關文章:
主站蜘蛛池模板: 超碰激情| 国产三级毛片 | 久久青青| 噜噜噜视频在线观看 | 风间由美一区二区三区在线观看 | 精品国产一区二区三区久久久 | 欧美一区 | 一二三区精品 | 凹凸日日摸日日碰夜夜 | 夜夜操操操 | 午夜www | 91免费视频在线 | 欧美日本韩国一区二区三区 | 欧美成人一区二区三区片免费 | 粉嫩高清一区二区三区精品视频 | 欧美日韩高清不卡 | 午夜寂寞影视在线观看 | 国产在线一区二区三区 | 亚洲精品一区二区在线观看 | 永久免费av | 国产精品一级 | 成人福利视频网 | 亚洲精品福利在线观看 | 免费网站看v片在线a | 国产日韩一区二区三区 | 亚洲va欧美va天堂v国产综合 | 成人a在线视频免费观看 | 欧美最猛性xxxxx亚洲精品 | 久久久精品电影 | 国产98色在线 | 九九视频这里只有精品 | 99re国产精品视频 | 亚洲午夜性视频 | 欧美激情精品久久久久久 | 久久中文字幕一区 | 欧美日韩高清在线一区 | 精品国产一区二区三区高潮视 | 久久久www| 国产精品久久久久久久久久妇女 | 亚洲一区二区在线免费观看 | 怡红院成人影院 | 亚洲视频综合 | 99亚洲 | 综合99 | 日韩成人免费 | 99久久婷婷国产综合精品电影 | 狠狠艹| 国产超碰人人模人人爽人人添 | 9191视频 | 久久精精品 | 亚洲一区二区三区免费视频 | 精品一级 | 国产免费天天看高清影视在线 | 不卡日韩在线 | 97色综合 | 一级片大全 | t66y最新地址一地址二69 | 成人高清视频免费观看 | 欧美日韩激情在线一区二区三区 | 午夜影院毛片 | 日韩一区电影 | 久国久产久精永久网页 | 国产亲子乱弄免费视频 | 中文字幕亚洲精品 | 欧美成人一区二区三区 | 日韩城人网站 | 欧美成人精品一区二区三区 | 一区二区视频在线观看 | 色呦呦网站在线观看 | av7777| 国产精品69毛片高清亚洲 | 日本三级电影天堂 | 免费欧美一级 | 欧美大片免费高清观看 | 色精品视频 | 色综久久 | www.日韩大片 | 国产成人精品综合 | av女人的天堂 | 国产三区在线观看视频 | 精品国产91乱码一区二区三区 | 欧美一区二区大片 | 国产视频综合在线 | 精品www| 中文字幕视频在线 | 欧美一区二区三区 | 国产一二三四在线 | 超碰免费在线观看 | 亚洲男人网 | 欧美日韩电影一区二区 | 成人毛片在线观看视频 | а天堂中文最新一区二区三区 | 国产视频二| 蜜桃久久av | 91国内 | 山岸逢花在线观看无删减 | 国产成人一区二区三区 | 久久99精品久久久久蜜臀 | 成人精品一区二区三区 | 久久精品日| 精品日韩在线 | 538在线精品 | 亚洲三级在线观看 | 欧美日韩电影一区二区三区 | 日本黄网站在线观看 | 亚洲成人免费 | 亚洲精品国产9999久久久久 | 看片地址 | 久久99国产精品久久99大师 | 久在线 | 亚洲女人的天堂 | 精品国产一区二区在线 | a级片视频在线观看 | 99国产精品久久久久久久成人热 | 91精品久久久久久久 | 中文字幕网在线 | 免费在线一区二区 | 精品入口麻豆88视频 | 男人天堂视频网 | 伊人夜夜躁av伊人久久 | 色综合久久久久 | 亚洲精品久久久久久久久久久 | 日本特黄特色aaa大片免费 | 午夜影院免费版 | 四虎成人在线播放 | 日韩精品久久久久久 | 大伊人久久 | 一二三四区视频在线观看 | 欧美日韩六区 | 久久99精品久久久久久噜噜 | 国产性猛交xxxx免费看久久 | 久久成人av | 国产福利在线免费 | 日本三级精品视频 | 久久草视频 | 欧美日韩在线观看视频 | 精品欧美一区二区三区久久久 | 欧美一级网站 | 久草.com| 日本亚洲一区 | 伊人在线 | 五月激情六月婷婷 | 亚洲一区二区在线播放 | 亚洲精品亚洲人成人网 | 影音先锋中文字幕一区 | 热久久免费视频 | 免费毛片网站 | 黄色a视频| 亚洲乱码一区二区三区在线观看 | 不用播放器的av | 黄色小视频在线观看 | 一级欧美一级日韩片 | 久久久精品一区二区 | 精品伦精品一区二区三区视频 | 久久人人爽人人爽 | 久久99这里只有精品 | 欧美在线视频一区 | 久久成人精品 | 中文字幕av一区二区三区 | 91精品久久久久久综合五月天 | 国产精品久久a | 久久成人一区 | 日本欧美在线观看 | av大片| 欧美日产国产成人免费图片 | 91九色视频国产 | 91视频国产网站 | 精品久久久久久久 | 久久久久国产视频 | 欧美日韩中文字幕 | 亚洲综合视频 | 久久久成 | 亚洲精品一区二区三区在线播放 | 91免费在线视频 | 久久成人免费视频 | 久久av综合| 狠狠色综合久久丁香婷婷 | 国产高清在线a视频大全 | 精品国产91亚洲一区二区三区www | 91日日| 国产精品一区二区在线看 | 国产精品视频一二三区 | 国产视频一区二区 | 国产精品久久久精品 | 人人做人人澡人人爽欧美 | 久久精品久久久久久久久久久久久 | 嫩草影院在线观看91麻豆 | 欧美精品一区二区三区视频 | gogo熟少妇大胆尺寸 | 一道本一区二区三区 | 国产九九九 | 50人群体交乱视频 | 欧美日韩亚洲高清 | 亚洲精品电影在线观看 | 中文字幕在线免费 | 福利网站在线观看 | 久久国产精品系列 | 亚洲日本韩国在线观看 | 欧美日韩一区二区三区视频 | 免费网站看v片在线a | 欧美成人a| 真人一级毛片 | 久久99国产精品久久99果冻传媒 | 色婷婷综合久久久中文字幕 | 亚洲第1页 | 日韩免费 | 亚洲国产精品久久久 | 国产精品久久久久久久久免费 | 国产精品欧美日韩 | 99国产精品久久久 | 97精品国产97久久久久久免费 | 亚洲xx站 | 亚洲精品国产剧情久久9191 | 日韩一区二区免费视频 | 国产精品久久久久久久久久久久久 | 国产精品一区三区 | 国产精品久久国产精麻豆99网站 | 999成人网 | 国产精品一区在线观看 | 日韩欧美国产精品综合嫩v 国产高清av在线一区二区三区 | 做a视频免费观看 | 午夜精品久久久久 | 777色狠狠一区二区三区 | 成人动慢| 中文字幕在线观看www | 国产欧美视频在线 | 国产玖玖 | 免费看的毛片 | 久久久久国产精品 | 亚洲嫩草 | 国产成人小视频 | 日韩精品免费观看 | 黄视频免费在线 | 欧美成人激情视频 | 国内精品在线视频 | 亚洲 精品 综合 精品 自拍 | 在线观看av片| 午夜精品视频在线观看 | 凹凸日日摸日日碰夜夜 | 精品国模一区二区三区欧美 | 久久久久高清 | 天天干夜夜爽 | 最新日韩在线观看视频 | 中文字幕欧美日韩 | 国产精品久久久久久久一区探花 | 精品久久久久久久久久久久久久 | 毛片在线免费 | 高清在线一区二区 | 国产精品夜夜春夜夜爽久久电影 | 97视频久久 | h小视频 | 成人涩涩日本国产一区 | 国产激情91久久精品导航 | 久草久草久草 | 欧美.com | 高清视频一区 | 91精产国品一二三区在线观看 | 国产在线不卡一区 | 97成人在线 | 91视频免费看片 | 国产男女爽爽爽免费视频 | 在线视频中文字幕 | www.久久.com | 黄色片网站在线观看 | 欧美精品三区 | 国产精品一区三区 | 日日网| 国产精品18久久久久久久久 | 日本中文字幕电影 | 精品久久久久久久久久 | 成人精品在线观看 | 99在线免费观看 | 老黄网站在线观看 | 欧美中文字幕 | 亚洲一区二区视频在线播放 | 国产1区在线观看 | 狠狠夜夜 | 一区二区视频 | 伊人网站| 久热中文 | 亚洲成人综合在线 | 欧美一级黄 | 毛片特级 | 可以在线看的黄色网址 | 国产免费av网站 | 毛片a片| 日日精品| 久久综合一区二区 | av成人在线观看 | 91在线视频免费观看 | 激情六月综合 | 欧美一区二区黄色片 | 午夜视频在线观看网站 | 性一级录像片片视频免费看 | 综合二区 | 久久久99精品免费观看 | 黄视频免费在线 | 一级日批片 | 91亚洲精品视频 | 日本高清无卡码一区二区久久 | 国产精品无码久久久久 | 国产高清一区二区 | 精品一区二区三区久久 | 999在线视频免费观看 | 色婷婷亚洲一区二区三区 | 日本午夜在线 | 99精品视频在线观看 | 羞羞视频免费在线观看 | 欧美日韩国产一区二区三区在线观看 | 91亚洲国产成人久久精品网站 | 高清不卡一区 | 国产真实精品久久二三区 | 91精品一区二区 | 亚洲一区中文字幕 | 天天操综合网 | 久久视频精品 | 亚洲天堂一区 | 日韩中字幕 | 色视频久久 | 久久久久久久久久久精 | 韩国精品主播一区二区在线观看 | 大香一网| 亚洲一区二区在线 | 在线a级毛片 | 青青草在线免费视频 | 97精品视频在线 | 国产精品69毛片高清亚洲 | 九九热有精品 | 婷婷成人免费视频 | 99精品视频免费在线观看 | 成人深夜福利在线观看 | av激情在线 | 中文久久 | 精品国产一区二区三区久久久蜜月 | 成人福利网| 欧美黄视频 | 亚洲第一中文字幕 | 久久激情网站 | www久久久 | 欧美成人小视频 | 亚洲美女视频 | 伊人在线 | 国产xvideos免费视频播放 | 亚洲免费在线观看 | 97在线观看视频 | 日本丶国产丶欧美色综合 | 久久久精品久久久 | 激情久久av一区av二区av三区 | 天堂在线视频 | 国产在视频一区二区三区吞精 | 色视频www在线播放国产人成 | 99热激情| 91精品国产综合久久久蜜臀粉嫩 | 草久av| av电影中文字幕在线观看 | 亚洲欧美日韩精品久久奇米色影视 | 成人精品鲁一区一区二区 | 在线视频自拍 | 日韩高清黄色 | 欧美成人精品一区二区三区 | 午夜av电影| 国产久| 中文精品一区二区三区 | 人操人人人 | 美日韩精品视频 | 毛片毛片毛片 | 久久久日韩精品一区二区三区 | 久久久精品456亚洲影院 | 久久一区二区三区四区 | 欧美日韩视频在线 | 久草 在线| 一级久久久久 | 九热精品| 国产高清精品在线 | 亚洲精品二三区 | 亚洲www永久成人夜色 | 国产精品美女久久久久久免费 | 国产精品国产a级 | 亚洲www视频 | 成年人在线看片 | 中字一区| 久久久美女 | 成人av网站在线观看 | 日韩电影一区二区三区 | 国产女人爽到高潮免费视频 | av在线免费观看一区二区 | 亚洲v日韩v综合v精品v | 黄色精品一区二区 | 日韩6699人妻熟女毛片 | 国产精品主播 | 欧美成人一区二区三区片免费 | 久久久久久久av | 成视频年人免费看黄网站 | 欧美一区二区三区在线 | 亚洲精品国产综合区久久久久久久 | 久久这里只有精品免费 | 超碰在线播 | 国产亚洲精品久久久久久久 | 天堂在线一区二区 | www.成人国产 | 国产精品久久免费视频 | 国产婷婷在线视频 | 亚洲视频在线观看 | 久久美女视频 | 刺激网| 欧美一区不卡 | 在线观看你懂的视频 | 暖暖成人免费视频 | 亚洲毛片网 | 色婷婷综合在线视频 | 色狠狠一区| 人人九九精 | 99精品网站 | 久久国产高清 | 精品一区二区三区免费看 | 日韩精品一区二区三区老鸭窝 | 91久久国产精品 | caoporn国产精品免费公开 | 日本黄色一级片免费看 | 在线91| 成人精品一区 | 在线观看亚洲一区 | 欧美一区二区在线看 | 亚洲一区二区在线播放 | 成人国产在线 | 久久91精品国产 | 99这里只有精品 | 成人免费crm一区二区 | 91麻豆精品国产91久久久资源速度 | 午夜在线观看影院 | 性色视频在线观看 | 91一区| 免费观看羞羞视频网站 | 国产精品大全 | 密色视频 | 天堂欧美城网站网址 | 国产在线精品一区二区 | 91精品久久久久久久久中文字幕 | 色约约精品免费看视频 | 毛片网站免费在线观看 | 国产一在线 | 亚洲成人中文字幕 | 午夜久久 | 黄色小视频在线观看 | 日本精品视频在线观看 | 亚洲精品一区二区三区蜜桃久 | 伊人免费在线观看高清版 | 久久久久国产一区二区三区四区 | av网站在线免费观看 | 欧美一区不卡 | а天堂中文最新一区二区三区 | av综合站 | 亚洲一区二区在线播放 | 综合久久久| 91高清视频 | 亚洲看片网站 | 91中文在线观看 | 曰韩毛片 | 在线观看91视频 | 欧美另类久久 | 亚洲精品一区在线观看 | 欧洲一级毛片 | 久久色av| 国产成人av一区二区三区 | 大象视频成人在线观看 | 午夜精品影院 | 国产精一区| 一区二区三区在线 | 欧 | 91久久国产综合久久 | 亚洲欧洲日韩 | 亚洲综合首页 | 亚洲电影一区二区 | 亚洲人成在线播放 | 国产aaa毛片 | 亚洲精品亚洲人成人网 | 精品久久久久久久久久久久 | 久久久国产精品 | 天天躁日日躁aaaaxxxx | 精品无人乱码区1区2区3区 | 久久9热 | 精品美女在线 | 亚洲一二三 | 成人av免费在线观看 | 一级毛片大全免费播放 | 伊人网91| 中文字幕一区在线观看视频 | 欧美精品乱码久久久久久按摩 | 亚洲不卡在线 | 操操操av| 天天久久 | 欧美盗摄| 九色porny丨国产精品 | 息与子猛烈交尾一区二区 | 国产精品久久久久久久久久免费看 | 久久久久国产精品 | 色综合天天综合网国产成人网 | 黄网在线免费观看 | 六月婷婷久久 | 福利电影在线 | 成人免费在线观看视频 | 国产精品久久99 | 国产免费一区二区三区网站免费 | 国产精品精品视频一区二区三区 | 欧美色爽 | 久久亚洲精品综合 | 97高清国语自产拍 | 日韩激情综合网 | 国产一区二区三区精品久久久 | 国产精品对白一区二区三区 | 日本涩涩网站 | 午夜精品久久久久久久星辰影院 | 热久久这里只有精品 | www.久草| 欧美日本一区二区三区 | 久久精品无码一区二区三区 | 日日精品| 欧美成人激情视频 | 中文字幕成人av | 五月天婷婷精品 | 久久精选视频 | 亚洲一区二区三区免费视频 | 国产成人精品久久二区二区 | 欧美日韩大陆 | 能免费看av的网站 | 特黄视频| 精品久久精品久久 | 日韩在线中文字幕视频 | 91精品国产综合久久久久久丝袜 | 午夜午夜精品一区二区三区文 | 在线亚洲人成电影网站色www | 国产久 | 午夜精品一区二区三区在线视频 | 成人欧美一区二区三区在线播放 | 精品国产区 | 极品女神高潮呻吟av久久 | 神马久久久久久 | 91尤物网站网红尤物福利 | 欧美精品一区二区三区一线天视频 | 精品久久久久久久久久久 | 超碰av在线 | 免费国产在线视频 | 91视频分类 | 性免费网站 | 一区二区三区国产精品 | 国产人成精品一区二区三 | 黄色a在线观看 | 性做久久久久久久免费看 | 免费高潮视频95在线观看网站 | 自拍视频网站 | 亚洲视频免费在线观看 | 精品一区二区三区视频 | 欧美福利视频 | 日日操天天操 | 久久久国产视频 | 欧美日韩在线一区 | 国产一区二区三区在线免费观看 | 久久精品久久久 | www.国产精品.com | 在线亚洲免费 | 蜜臀av在线播放一区二区三区 | 精品在线一区二区 | 一区视频在线 | 成人免费视频播放 | 天天插天天 | 午夜精品久久久久久久久久久久久 | 欧美激情a∨在线视频播放 中文字幕网在线 | 久久久综合亚洲91久久98 | 99久久精品免费看国产免费粉嫩 | 乳色吐息在线观看 | a级毛片免费高清视频 | 欧美日本高清视频 | 成人午夜免费视频 | 免费观看羞羞视频网站 | 精品一区二区三区四区 | 特a级片 | 北条麻妃99精品青青久久主播 | 精品国产一区二区三区成人影院 | 精品欧美一区二区在线观看 | 国产精品视屏 | av看片网 | 三级黄色片在线播放 | 国产精品久久久久久二区 | 日本一区二区不卡 | 欧美一区二区三区在线 | 欧美日韩国产一区二区三区不卡 | 日韩成年视频 | 国产人妖一区 | 久热精品在线视频 | 欧洲成人在线 | 成人1区2区| 欧美一级免费 | 亚洲日韩中文字幕一区 | av网站免费观看 | 亚洲欧美日韩国产综合精品二区 | 日韩欧美专区 | 国产成人精品一区二区三区视频 | 综合久久综合 | 久久免费国产精品 | 欧美三级网 | 蜜桃comaaa| 亚洲 欧美日韩 国产 中文 | 日韩中文一区二区 | 欧美日韩在线不卡 | 欧美一级片免费在线观看 | 日韩在线视频观看 | 日本中文字幕在线视频 | 国产视频久久久久 | 亚洲精品亚洲人成人网 | 国产成人av电影 | 午夜精品一区二区三区免费视频 | 国产精品久久久久不卡 | 亚洲精品9999 | 91精品国产福利在线观看 | the蜜臀av入口 | 亚洲另类小视频 |