黄a在线观看-黄a在线-黄a大片-黄色片在线看-黄色毛片免费-黄色大片网站

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Mybatis_plus基礎(chǔ)教程(總結(jié)篇)

瀏覽:75日期:2023-10-22 14:49:36
一.簡(jiǎn)介

官網(wǎng)網(wǎng)址:http://mp.baomidou.com/參考教程:http://mp.baomidou.com/guide/

二.特性

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

三.MyBatis_plus入門

①創(chuàng)建并初始化數(shù)據(jù)庫(kù)mybatis_plus

②創(chuàng)建 User 表其表結(jié)構(gòu)如下:

Mybatis_plus基礎(chǔ)教程(總結(jié)篇)

其對(duì)應(yīng)的數(shù)據(jù)庫(kù) 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));

其對(duì)應(yīng)的數(shù)據(jù)庫(kù) 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 快速初始化一個(gè) Spring Boot 工程

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

五.添加依賴

①引入依賴spring-boot-starter、spring-boot-starter-test添加:mybatis-plus-boot-starter、MySQL、lombok、在項(xiàng)目中使用Lombok可以減少很多重復(fù)代碼的書寫。比如說(shuō)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用來(lái)簡(jiǎn)化實(shí)體類--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>

注意:引入 MyBatis-Plus 之后請(qǐng)不要再次引入 MyBatis 以及 MyBatis-Spring,以避免因版本差異導(dǎo)致的問(wèn)題。

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

Mybatis_plus基礎(chǔ)教程(總結(jié)篇)

六.配置

在 application.properties 配置文件中添加 MySQL 數(shù)據(jù)庫(kù)的相關(guān)配置:

mysql5:

#mysql數(shù)據(jù)庫(kù)連接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 后綴,因?yàn)镾pring Boot 2.1 集成了 8.0版本的jdbc驅(qū)動(dòng),這個(gè)版本的 jdbc 驅(qū)動(dòng)需要添加這個(gè)后綴,否則運(yùn)行測(cè)試用例報(bào)告如下錯(cuò)誤:

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

2、這里的 driver-class-name 使用了 com.mysql.cj.jdbc.Driver ,在 jdbc 8 中 建議使用這個(gè)驅(qū)動(dòng),之前的 com.mysql.jdbc.Driver 已經(jīng)被廢棄,否則運(yùn)行測(cè)試用例的時(shí)候會(huì)有 WARN 信息

七.編寫代碼

①主類在 Spring Boot 啟動(dòng)類中添加 @MapperScan 注解,掃描 Mapper 文件夾注意:掃描的包名根據(jù)實(shí)際情況修改

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

②實(shí)體創(chuàng)建包 entity 編寫實(shí)體類 User.java(此處使用了 Lombok 簡(jiǎn)化代碼)

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

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

③mapper

創(chuàng)建包 mapper 編寫Mapper 接口: UserMapper.java

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

添加測(cè)試類,進(jìn)行功能測(cè)試:

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

注意:

IDEA在 userMapper 處報(bào)錯(cuò),因?yàn)檎也坏阶⑷氲膶?duì)象,因?yàn)轭愂莿?dòng)態(tài)創(chuàng)建的,但是程序可以正確的執(zhí)行。

為了避免報(bào)錯(cuò),可以在 dao 層 的接口上添加----- @Repository

控制臺(tái)輸出:

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)

通過(guò)以上幾個(gè)簡(jiǎn)單的步驟,我們就實(shí)現(xiàn)了 User 表的 CRUD 功能,甚至連 XML 文件都不用編寫!

九.配置日志

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

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

在輸出臺(tái)中就有日志了

Mybatis_plus基礎(chǔ)教程(總結(jié)篇)

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

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

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

在User實(shí)體類中的id 上加

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

要想影響所有實(shí)體的配置,可以設(shè)置全局主鍵配置

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

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

@Getterpublic enum IdType { /** * 數(shù)據(jù)庫(kù)ID自增 */ AUTO(0), /** * 該類型為未設(shè)置主鍵類型 */ NONE(1), /** * 用戶輸入ID * 該類型可以通過(guò)自己注冊(cè)自動(dòng)填充插件進(jìn)行填充 */ INPUT(2), /* 以下3種類型、只有當(dāng)插入對(duì)象ID 為空,才自動(dòng)填充。 */ /** * 全局唯一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實(shí)體類中加

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

在測(cè)試類中

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); //影響的行數(shù) System.out.println(user); //id自動(dòng)回填 }

注意:數(shù)據(jù)庫(kù)插入id值默認(rèn)為:全局唯一id

Mybatis_plus基礎(chǔ)教程(總結(jié)篇)

3.update

1、根據(jù)Id更新操作**注意:**update時(shí)生成的sql自動(dòng)是動(dòng)態(tài)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、自動(dòng)填充項(xiàng)目中經(jīng)常會(huì)遇到一些數(shù)據(jù),每次都使用相同的方式填充,例如記錄的創(chuàng)建時(shí)間,更新時(shí)間等。我們可以使用MyBatis Plus的自動(dòng)填充功能,完成這些字段的賦值工作:

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

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

(3)實(shí)現(xiàn)元對(duì)象處理器接口注意:不要忘記添加 @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 { /** * 插入時(shí)時(shí)間 * @param metaObject */ @Override public void insertFill(MetaObject metaObject) { this.setFieldValByName('createTime',new Date(),metaObject); this.setFieldValByName('updateTime',new Date(),metaObject); } /** * 修改時(shí)時(shí)間 * @param metaObject */ @Override public void updateFill(MetaObject metaObject) { this.setFieldValByName('updateTime',new Date(),metaObject); }}

(4)再次運(yùn)行 測(cè)試 結(jié)果

Mybatis_plus基礎(chǔ)教程(總結(jié)篇)

4.樂(lè)觀鎖

**主要適用場(chǎng)景:**當(dāng)要更新一條記錄的時(shí)候,希望這條記錄沒有被別人更新,也就是說(shuō)實(shí)現(xiàn)線程安全的數(shù)據(jù)更新樂(lè)觀鎖實(shí)現(xiàn)方式:

①取出記錄時(shí),獲取當(dāng)前version②更新時(shí),帶上這個(gè)version③執(zhí)行更新時(shí), set version = newVersion where version = oldVersion④如果version不對(duì),就更新失敗

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

ALTER TABLE `user` ADD COLUMN `version` INT

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

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

Mybatis_plus基礎(chǔ)教程(總結(jié)篇)

(3)元對(duì)象處理器接口添加version的insert默認(rèn)值

@Controllerpublic class MyMetaObjectHandler implements MetaObjectHandler { /** * 插入時(shí)時(shí)間 * @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); } /** * 修改時(shí)時(shí)間 * @param metaObject */ @Override public void updateFill(MetaObject metaObject) { this.setFieldValByName('updateTime',new Date(),metaObject); }}

特別說(shuō)明:

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

(4)在 MybatisPlusConfig 中注冊(cè) Bean創(chuàng)建配置類

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 { /** * 樂(lè)觀鎖插件 */ @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); } }

(5)測(cè)試樂(lè)觀鎖可以修改成功測(cè)試后分析打印的sql語(yǔ)句,將version的數(shù)值進(jìn)行了加1操作

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

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

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

1、根據(jù)id查詢記錄

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

2、通過(guò)多個(gè)id批量查詢完成了動(dòng)態(tài)sql的foreach的功能

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

3、簡(jiǎn)單的條件查詢通過(guò)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對(duì)應(yīng)的是數(shù)據(jù)庫(kù)中的列名。例如數(shù)據(jù)庫(kù)user_id,實(shí)體類是userId,這時(shí)map的key需要填寫user_id

4、分頁(yè)MyBatis Plus自帶分頁(yè)插件,只要簡(jiǎn)單的配置即可實(shí)現(xiàn)分頁(yè)功能(1)創(chuàng)建配置類此時(shí)可以刪除主類中的 @MapperScan 掃描注解

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

(2)測(cè)試selectPage分頁(yè)(自己用的)測(cè)試:最終通過(guò)page對(duì)象獲取相關(guān)數(shù)據(jù)

/** * 分頁(yè)查詢 */ @Test void pages(){ //1.創(chuàng)建page對(duì)象 //傳入兩個(gè)參數(shù):當(dāng)前 頁(yè) 和 每頁(yè)顯示記錄數(shù) Page<User> page=new Page<User>(1,5); //調(diào)用mp分頁(yè)查詢的方法 //調(diào)用mp分頁(yè)查詢過(guò)程中,底層封裝 //把分頁(yè)所有數(shù)據(jù)封裝到page對(duì)象里面 userMapper.selectPage(page,null); //通過(guò)page對(duì)象獲取分頁(yè)數(shù)據(jù) 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()); }

控制臺(tái)sql語(yǔ)句打印:SELECT id,name,age,email,create_time,update_time FROM user LIMIT 0,5

(3)測(cè)試selectMapsPage分頁(yè):結(jié)果集是Map(zjd沒有用過(guò))

@Testpublic void testSelectMapsPage() { Page<User> page = new Page<>(1, 5); IPage<Map<String, Object>> mapIPage = userMapper.selectMapsPage(page, null); //注意:此行必須使用 mapIPage 獲取記錄列表,否則會(huì)有數(shù)據(jù)類型轉(zhuǎn)換錯(cuò)誤 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、根據(jù)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、簡(jiǎn)單的條件查詢刪除

@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、*邏輯刪除

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

ALTER TABLE `user` ADD COLUMN `deleted` boolean

Mybatis_plus基礎(chǔ)教程(總結(jié)篇)

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

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

(3)元對(duì)象處理器接口添加deleted的insert默認(rèn)值

@Controllerpublic class MyMetaObjectHandler implements MetaObjectHandler { /** * 插入時(shí)時(shí)間 * @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); } /** * 修改時(shí)時(shí)間 * @param metaObject */ @Override public void updateFill(MetaObject metaObject) { this.setFieldValByName('updateTime',new Date(),metaObject); }}

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

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

(5)在 MyConfig 中注冊(cè) Bean

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

(6)測(cè)試邏輯刪除測(cè)試后發(fā)現(xiàn),數(shù)據(jù)并沒有被刪除,deleted字段的值由0變成了1測(cè)試后分析打印的sql語(yǔ)句,是一條update**注意:**被刪除數(shù)據(jù)的deleted 字段的值必須是 0,才能被選取出來(lái)執(zhí)行邏輯刪除的操作

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

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

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

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

7.性能分析

性能分析攔截器,用于輸出每條 SQL 語(yǔ)句及其執(zhí)行時(shí)間SQL 性能執(zhí)行分析,開發(fā)環(huán)境使用,超過(guò)指定時(shí)間,停止運(yùn)行。有助于發(fā)現(xiàn)問(wèn)題

1、配置插件(1)參數(shù)說(shuō)明參數(shù):maxTime: SQL 執(zhí)行最大時(shí)長(zhǎng),超過(guò)自動(dòng)停止運(yùn)行,有助于發(fā)現(xiàn)問(wèn)題。參數(shù):format: SQL是否格式化,默認(rèn)false。(2)在 MyConfig 中配置

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

(3)Spring Boot 中設(shè)置dev環(huán)境

#環(huán)境設(shè)置:dev、test、prodspring.profiles.active=dev

2、測(cè)試(1)常規(guī)測(cè)試

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

輸出:

Mybatis_plus基礎(chǔ)教程(總結(jié)篇)

(2)將maxTime 改小之后再次進(jìn)行測(cè)試

performanceInterceptor.setMaxTime(5);//ms,超過(guò)此處設(shè)置的ms不執(zhí)行

如果執(zhí)行時(shí)間過(guò)長(zhǎng),則拋出異常:The SQL execution time is too large,輸出:

Mybatis_plus基礎(chǔ)教程(總結(jié)篇)

8.其它

如果想進(jìn)行復(fù)雜條件查詢,那么需要使用條件構(gòu)造器 Wapper,涉及到如下方法1、delete2、selectOne3、selectCount4、selectList5、selectMaps6、selectObjs7、update

十一.條件構(gòu)造器_wapper介紹 1.wapper介紹

Mybatis_plus基礎(chǔ)教程(總結(jié)篇)

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

2.AbstractWrapper

注意:以下條件構(gòu)造器的方法入?yún)⒅械?column 均表示數(shù)據(jù)庫(kù)字段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 返回的是一條實(shí)體記錄,當(dāng)出現(xiàn)多條時(shí)會(huì)報(bào)錯(cuò)

@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:可以實(shí)現(xiàn)子查詢①例: 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不調(diào)用or則默認(rèn)為使用 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、嵌套o(hù)r、嵌套and這里使用了lambda表達(dá)式,or中的表達(dá)式最后翻譯成sql時(shí)會(huì)被加上圓括號(hào)

@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 的最后注意:只能調(diào)用一次,多次調(diào)用以最后一次為準(zhǔn) 有sql注入的風(fēng)險(xiǎn),請(qǐng)謹(jǐn)慎使用

@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會(huì)合并 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設(shè)置修改的字段 .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實(shí)現(xiàn)復(fù)雜查詢操作 @Test public void testSelectQuery() { //創(chuàng)建QueryWrapper對(duì)象 QueryWrapper<User> wrapper = new QueryWrapper<>(); //通過(guò)QueryWrapper設(shè)置條件 //ge、gt、le、lt //查詢age>=30記錄 //第一個(gè)參數(shù)字段名稱,第二個(gè)參數(shù)設(shè)置值 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); } }

總結(jié)

到此這篇關(guān)于Mybatis_plus基礎(chǔ)教程(總結(jié)篇)的文章就介紹到這了,更多相關(guān)Mybatis plus基礎(chǔ)內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

相關(guān)文章:
主站蜘蛛池模板: 久久99网站 | 免费国产黄网站在线观看视频 | 日本中文字幕第一页 | 欧美另类视频在线 | 夜夜高潮天天爽欧美国产亚洲一区 | 91精品国产91久久久久久吃药 | 亚洲色无码国产精品网站可下载 | 少妇做爰免费视频网站 | 999国内精品视频免费 | 久久久久综合网 | 97超碰人人草 | 少妇啊灬啊别停灬用力啊房东 | 啦啦啦中文在线视频免费观看 | 苍井优三级在线观看 | 天天干,夜夜操 | 国产精品美女久久久久久久 | 狠狠色婷婷久久综合频道毛片 | 久久亚洲国产成人精品性色 | 久久久久99人妻一区二区三区 | 妩媚尤物娇喘无力呻吟在线视频 | 欧美伊人影院 | 亚洲精品国产av天美传媒 | 一二三四在线视频观看社区 | 人人干天天干 | 夜夜爽夜夜| 日产精品久久久一区二区福利 | 又粗又硬又大又爽免费视频播放 | 国产全肉乱妇杂乱视频男男 | 欧美日韩激情在线一区二区三区 | 情侣酒店偷拍一区二区在线播放 | 非洲黑人狂躁日本妞视频 | 九九精品视频在线 | 欧美成人精品一区二区男人小说 | 日韩在线视频观看 | 欧美乱大交xxxxx潮喷l头像 | 亚洲美女一区 | 午夜大片 | 日本亚洲欧洲无免费码在线 | 亚洲高清福利 | 在线免费观看国产精品 | 国产猛男猛女52精品视频 | 97在线免费视频 | 99精品众筹模特自拍视频 | 国产禁女女网站免费看 | 色 亚洲 日韩 国产 综合 | 麻豆一级片| 成人午夜高潮a∨猛片 | 国产一二三精品 | 一区二区精品视频在线观看 | 日本公妇乱淫xxxⅹ 日本公妇乱淫免费 | 中文在线观看免费网站 | 成人试看120秒体验区 | 欧美在线一区视频 | 日韩女优在线视频 | 欧美午夜性生活 | 久久露脸国语精品国产91 | 污视频网站免费在线观看 | 香港a毛片 | 国产黄色小视频在线观看 | 精品欧美日韩 | 国产综合99 | 精品午夜福利在线观看 | 男女超级黄aaa大片免费 | 香蕉国产在线视频 | 黄片毛片av | 乱人伦中文字幕成人网站在线 | 欧美性在线视频 | 久久人人爽爽爽人久久久 | 人妻无码一区二区三区 | 欧美一卡二卡三卡四卡视频区 | 少妇人妻av毛片在线看 | 亚洲国产一区二区三区在线观看 | lutube成人福利在线观看污 | 一本之道ay免费 | 国产 字幕 制服 中文 在线 | 中文字幕高清在线观看 | 九九在线精品视频 | 欧美性大交 | 国产精品99久久久久的智能播放 | 又色又爽又黄高潮的免费视频 | 欧美中文日韩 | 色噜噜av男人的天堂 | 欧美一卡二卡三卡四卡视频区 | 最新国自产拍小视频 | 免费看黄色三级三级 | 日韩黄色在线 | 日本成人一区二区 | 国产一区二区三区日韩精品 | 国产成人精品一区二区三区网站观看 | 九七影院在线观看免费观看电视 | 黄a无码片内射无码视频 | 亚洲成av人在线观看网站 | 91黑丝美女 | 7777奇米四色成人眼影 | 麻豆视频精品 | 亚洲日韩一区二区三区 | 无码人妻精品一区二区在线视频 | 日本久久成人 | 色无极亚洲 | 无套内内射视频网站 | 国产精品无码av不卡顿 | 少妇啊灬啊别停灬用力啊免费视频 | 色拍拍在线精品视频 | 国产精品国产三级国产aⅴ下载 | 国产伦精品视频一区二区三区 | 成人三级无码视频在线观看 | 激情综合在线 | 麻豆一区二区99久久久久 | 丝袜足控一区二区三区 | 69亚洲乱| 日韩一区二区三区视频在线观看 | 亚洲国产无线乱码在线观看 | a天堂中文网 | 人妻中文无码久热丝袜 | 国产精品系列在线观看 | 亚洲狠狠爱 | 精品免费二区三区三区高中清不卡 | 精品少妇一区二区三区在线观看 | 欧美一区二区在线视频 | 欧美aaaaaaaaaa| 国产永久免费观看久久黄av片 | 极品人妻少妇一区二区三区 | 欧美你懂得 | 韩日av在线播放 | 国产精品国产三级在线专区 | 可以免费看成人啪啪过程的软件 | 欧美人与禽zozzo性之恋的特点 | 精品无码成人网站久久久久久 | 精品无码一区二区三区爱欲九九 | 中文字幕高清在线 | 日韩成人在线影院 | 久久精品视频2 | 亚洲午夜天堂吃瓜在线 | 好吊妞这里有精品 | 一出一进一爽一粗一大视频 | 亚洲精品中文字幕乱码三区 | 人妻在厨房被色诱 中文字幕 | 国产精品永久久久 | 国产一级大片在线观看 | 国产天堂一区 | 丝袜福利视频 | 欧美xxxx胸大| 蜜臀久久99精品久久久无需会员 | 欧美黄色大全 | 美国色综合 | 日韩欧美在线综合网 | 91精品国产aⅴ一区 91精品国产爱久久丝袜脚 | 国产精品久久久久婷婷二区次 | 青青操在线观看 | 国产国语熟妇视频在线观看 | 日本极品视频 | 国产精品6999成人免费视频 | 欧美激情综合色综合啪啪五月 | 成人在线观看一区 | 五月婷婷中文字幕 | 国产又粗又猛又爽又黄的视频软件 | 亚洲影视中文字幕 | 大尺度分娩网站在线观看 | 91丨九色丨91啦蝌蚪老版 | 少妇高潮淫片免费观看 | 北条麻妃在线一区二区免费播放 | 88福利视频| 国内揄拍国产精品人妻门事件 | 这里只有精品国产 | 中国成人毛片 | 国产精品久久久久7777 | 2021国产精品视频 | 欧美一级专区 | 精品美女www爽爽爽视频 | 农民人伦一区二区三区 | 在线播放色 | 久久一日本道色综合久久 | 毛片麻豆| 国产一级一级一级 | 午夜欧美精品久久久久久久 | 99久久久国产精品无码免费 | 亚洲一卡二卡在线 | 天天干夜夜嗨 | 国产福利短视频 | 成年人在线网站 | 一区二区三区在线观看视频 | 国产农村乱对白刺激视频 | 久久丫精品忘忧草西安产品 | 内射人妻少妇无码一本一道 | 亚洲伊人久久综合影院 | 制服丝袜一区 | 自拍偷在线精品自拍偷99九色 | 精品少妇一区 | 亚洲中文字幕久久无码精品 | 日韩视频在线观看免费视频 | www视频在线免费观看 | 国产95在线 | 欧美啪啪网站 | 妇子乱av一区二区三区 | 精品国产a | 日本黄a三级三级三级 | 亚洲精品乱码久久久久久日本蜜臀 | 天天干天天草天天 | 亚洲午夜在线观看 | 香蕉一级视频 | 国产女高清在线看免费观看 | 朝鲜女人性猛交 | 亚洲免费影院 | 精品人伦一区二区三区四区蜜桃牛 | 日本久久网 | 亚洲精品成人片在线观看精品字幕 | 97超碰人人网 | 亚洲国产精品第一区二区 | 久久人人爽天天玩人人妻精品 | 亚洲第一色区 | 国产免费极品av吧在线观看 | 国产精品一品二区三区四区18 | 怡红院综合网 | 精品视频入口 | 国产亚洲精品久久久久久大师 | 国产成人精品女人久久久 | 91激情网 | 男男车车的车车网站w98免费 | 日本猛少妇色xxxxx猛叫 | 日韩欧美一区在线观看 | 亚洲优女在线 | 日本少妇做爰大尺裸体视频 | 色偷偷av老熟女 | 天天摸天天做天天爽婷婷 | 国产后进极品圆润翘臀在后面玩 | 九九视频九九热 | 国产-第1页-浮力影院 | 亚洲一区二区三区四区 | 日韩免费看 | 一区二区三区在线观看免费 | 山东熟女啪啪哦哦叫 | 日本亚洲一区二区 | 欧美黄色性 | 人妻中文字幕在线网站 | 中文字幕高清免费日韩视频在线 | 啪啪免费网站 | 欧美成人影院亚洲综合图 | 日本视频网站在线观看 | 欧美成人26uuu欧美毛片 | 日本少妇毛耸耸毛多水多 | 国产精品久久一区二区三区 | 久久久久免费观看 | 国产精品又黄又爽又色无遮挡 | 国产卡一卡二 | 午夜大尺度做爰激吻视频 | 国产让女高潮的av毛片 | 久久精品人妻无码一区二区三区 | 一本大道久久a久久精品综合1 | 免费a v视频 | 久久精品国产清高在天天线 | 激情爱爱网 | 亚洲午夜精品在线 | 成人做爰桃子窝窝a视频 | 国产精品高清在线 | 在线超碰91 | 亚欧美日韩 | 一级黄色片网站 | 又黄又爽又刺激久久久久亚洲精品 | 波多野结衣一区 | 午夜国产一区二区三区四区 | 国产成人高潮免费观看精品 | 天天都色 | 欧美人与动牲交xxxxbbbb | 日韩精品视 | 国产丝袜av| 久久久新视频 | 97色在线观看 | 欧美三级又粗又硬 | 午夜网站视频 | 日韩资源 | 野外偷拍做爰全过程 | a级毛片黄免费观看 m | 综合色在线视频 | 亚洲精品免费在线观看视频 | 国产国产精品人在线视 | 久久好在线视频 | 久久人妖 | 88av在线| 在线观看视频免费入口 | 成人免费视频网站在线看 | 日韩欧美高清在线视频 | 蜜桃视频欧美 | 成人福利av | 亚洲中文字幕精品久久 | 亚洲精品四区 | 美女张开腿让男人桶爽 | 亚洲欧美成人aⅴ大片 | 在线播放高清视频www | 麻豆影院免费夜夜爽日日澡 | 国产粉嫩在线 | 国产亚洲欧美日韩在线一区二区三区 | 漂亮少妇激烈床戏 | 柠檬福利视频导航 | 综合五月激情二区视频 | 麻豆视频精品 | 国产精品国产三级国产专区51 | 久久精品免费一区二区 | 9cao| 天天综合网7799精品视频 | 国产成人精 | 精品无码一区二区三区的天堂 | 国产小视频免费观看 | 亚洲午夜精品一区 | 九七人人爽 | 欧美成本人视频 | 成人 黄 色 免费播放 | 国产交换配乱淫视频a | 久久精品视频1 | 欧美韩一区 | 国内精品久久久久久久影视红豆 | 黄色一级视频在线观看 | 精精国产xxxx视频在线 | 亚洲网站免费看 | 国产剧情自拍 | 免费色视频 | 人人狠狠综合久久亚洲 | 天堂网视频在线 | 国产又粗又猛又爽又黄的视频文字 | 张津瑜国内精品www在线 | 一本一本久久a久久精品综合不卡 | a毛片在线 | 少妇做爰免费视频了 | 欧美日韩免费做爰视频 | 一区二区三区激情 | 国产在线视频资源 | 91精品视频一区二区 | 亚洲一区免费观看 | 免费中文av| www成人国产高清内射 | 国产成人综合精品无码 | 久久综合九色综合欧美狠狠 | 精品欧美一区二区精品久久 | 亚洲清纯国产 | 体内谢xxxxx视少妇频 | 一本色道综合久久欧美日韩精品 | 极品久久久久久 | 色666| 欧美jizzhd精品欧美巨大 | 亚洲欧美综合色 | 日本在线观看免费 | 涩涩网站在线观看 | 四虎视频在线精品免费网址 | 久久婷婷色一区二区三区asmr | 麻豆av影视 | 亚洲日韩中文字幕在线播放 | 亚洲伦理网| a级黄色毛片视频 | 中文毛片 | 五月深爱网 | 免费精品无码av片在线观看 | 精品国产乱码一区二区 | youporn免费视频成人软件 | 成+人+黄+色有声+小说免费 | 日本熟妇色一本在线视频 | 国产无套粉嫩白浆内的人物介绍 | 人人人射 | 色福利在线 | 亚洲视频天天射 | 人妻无码久久一区二区三区免费 | 97色伦图片97综合影院 | 欧美丰满大乳大屁股毛片图片 | 狠狠撸在线视频 | 欧美三级视频 | 日本少妇丰满大bbb的小乳沟 | 潘金莲性xxxxhd | 国产精品综合久久久久久 | 中文字幕乱码中文乱码777 | 999国产| 美女av一区二区三区 | 中文字幕av网 | 欧美亚洲日本国产黑白配 | 成人做爰桃子窝窝a视频 | 亚洲国产在| 国产精品性视频一区二区 | 亚洲精品无码专区在线在线播放 | 一区二区高清视频在线观看 | 深夜国产在线 | 欧美大片在线看 | 夜精品a片一区二区三区无码白浆 | 屁屁国产草草影院ccyycom | 亚洲日韩aⅴ在线视频 | 日韩成人av毛片 | 久久精品无码精品免费专区 | 在线观看视频色 | 亚洲天天做 | 亚洲国产精品国自产拍av | 一级黄色a毛片 | 7777精品久久久大香线蕉小说 | 一区二区视频 | 色屁屁www影院免费观看 | 久福利| 国外av网站 | 乱肉放荡艳妇视频6399 | 美女三级黄色片 | 日韩成人午夜影院 | 中文字幕国产剧情 | 日韩黄色短视频 | 无码播放一区二区三区 | 久久久av亚洲男天堂 | 国产免费观看黄av片 | 自拍偷拍麻豆 | 日本打白嫩屁股视频 | 亚洲 小说 欧美 激情 另类 | 亚洲精品久久久久久中文传媒 | 日本三级网址 | 中文亚洲字幕 | 精品国产一区二区三区四区精华 | 6080亚洲精品一区二区 | 无码137片内射在线影院 | 亚洲日韩va无码中文字幕 | 精品一区二区三区免费视频 | 久久er热在这里只有精品66 | 国产一级特黄 | 台湾乡村少妇伦理 | 欧美黑人一级视频 | 国产对白不带套毛片av | 夜噜噜| 国产成a人亚洲精品在线观看 | 免费毛片网 | 免费观看a毛片 | 在线日韩中文字幕 | 黄色资源在线 | 天美传媒一区二区 | 动漫av一区二区在线观看 | 男女草比视频 | 黑人糟蹋人妻hd中文字幕 | 婷婷爱五月天 | 国语对白做受xxxxx在线中国 | 亚洲精品在线观看网站 | 欧美性欧美zzzzzzzzz | 杨幂一区二区三区免费看视频 | 性欧美亚洲xxxx乳在线观看 | 波多野结衣在线视频播放 | 人妻体内射精一区二区 | 国产乱淫av免费观看 | 欧美日韩中文 | 午夜免费男女aaaa片 | 天美乌鸦星空mv高清正版播放 | 久久精品免费一区二区 | av网站导航 | 亚洲欧美日本在线 | sb少妇高潮二区久久久久 | 黄色性大片 | 欧美日本久久 | 欧美黑人又粗又大久久久 | 国产性生活 | 国产精品无码一区二区在线看 | 亚洲一页 | 在线观看国产成人av片 | 午夜少妇影院 | 美女100%视频免费观看 | 欧美午夜理伦三级在线观看吃奶汁 | 国产第8页 | 情趣内衣a∨片在线观看 | 日日日网站 | av在线有码 | 无码中文人妻在线一区二区三区 | 国产精品99久久免费 | 高h av| www.涩涩爱| yy8男人的天堂| 国产又粗又猛又爽视频上高潮69 | 欧美激情乱人伦 | 色噜噜狠狠色综合av | 色欲色av免费观看 | 日日噜噜噜噜夜夜爽亚洲精品 | 欧亚日韩精品一区二区在线 | 精品偷自拍另类在线观看 | 99视频在线观看视频 | 综合久久久久久久久 | 精品无码国产一区二区三区麻豆 | xxxx69国产| 99这里只有精品 | 无码高潮爽到爆的喷水视频 | 国产精品久久久久一区二区 | 人妻久久久一区二区三区 | 国产成人av一区二区三区在线观看 | 国产福利精品视频 | 91精品国产综合久久久久 | 国自产拍偷拍福利精品免费一 | 久久国产一区 | 嫩草影院菊竹影院 | 久久99亚洲精品久久久久 | 青青操在线观看视频 | 91丨九色丨蝌蚪丨丝袜 | 日韩国产欧美一区二区三区 | 韩国日本在线观看 | 精品无人国产偷自产在线 | 国产桃色视频 | 噜噜在线视频 | 古风h啪肉h文 | 在线国产91| 黄色片在线观看视频 | 蜜桃视频网站 | 免费观看又污又黄的网站 | 久久久www成人免费无遮挡大片 | 在线精品亚洲欧美日韩国产 | 免费午夜拔丝袜www在线看 | 强辱丰满人妻hd中文字幕 | 国产91在线观看 | 色呦色呦色精品 | av毛片久久久久午夜福利hd | 亚洲人a成www在线影院 | 亚洲丝袜av | 一道本av在线 | 色婷婷综合中文久久一本 | 中文字幕我不卡在线看 | 91精品观看| 国产不卡精品 | 噜噜在线视频 | 国产精品无码专区在线观看 | 国产浮力第一页草草影院 | 99久久一区| 亚洲精品一区二区三区蜜臀 | 媚药一区二区三区四区 | 极品少妇一区二区 | 狠操av| 91久久精品一区二区三区大 | 毛片av中文字幕一区二区 | 日韩天天看 | 久久久久久久人妻无码中文字幕爆 | 人妻无码中文字幕 | 日干夜操| 不卡视频一区二区 | 国产韩国精品一区二区三区久久 | 小荡货奶真大水多好紧视频 | 五月婷六月丁香狠狠躁狠狠爱 | 色婷婷国产精品 | 亚洲精品国偷自产在线99人热 | 蜜臀av无码精品人妻色欲 | 一道本久久 | www久久久久久久 | 黄色片免费观看 | 国产三级欧美三级 | 亚洲综合在线免费 | 中文字幕乱码在线 | 一道本在线观看 | 91天堂在线| 中国农村少妇xxxx视频 | 亚洲精品乱码久久久久久蜜桃不卡 | 亚洲五月婷 | 亚洲va中文字幕无码久久 | 午夜狠狠干 | 成人在线视频免费 | 欧洲mv日韩mv国产 | 97人人模人人爽人人少妇 | 国产精品视频全国免费观看 | 久久综合给合久久狠狠狠色97 | 日本大肚子孕妇交xxx | 欧美精品一区二区三区久久久 | 草草草在线观看 | 精品三区| 97在线精品| 小拗女一区二区三区 | av观看一区 | 国产精品xnxxcom | 又湿又紧又大又爽a视频 | 国产精品99久久久久 | 国产国语老龄妇女a片 | av中文字幕免费在线观看 | 伊人精品在线观看 | 久久婷婷五月综合97色 | 丰满妇女毛茸茸刮毛 | 日韩人妻无码一区二区三区 | 91大片淫黄大片在线天堂 | 人妖ts福利视频一二三区 | 精品久久一二三区 | 狠狠色综合网站久久久久久久 | 99久久免费国产精精品 | 中国黄色片子 | 中文字幕人成乱码在线观看 | 雨宫琴音一区二区三区 | 不卡毛片在线观看 | 长腿校花无力呻吟娇喘的视频 | 亚洲 中文 欧美 日韩 在线观看 | 色欲网天天无码av | 黄瓜视频91 | 亚洲熟女少妇一区二区 | 色婷婷激情五月 | 综合国产视频 | 在线观看亚洲专区 | 国产九九精品 | 松岛枫av在线一区二区 | 精品久久久久成人码免费动漫 | 亚洲熟伦熟女新五十路熟妇 | 国产成人精品网 | 欧美日韩久久婷婷 | 黑人操少妇 | 国产三级欧美三级日产三级99 | 中文字幕乱偷在线小说 | 国产欧美精品一区二区三区 | 一本久道高清无码视频 | 又黄又爽又色视频 | 精品一区久久久 | 午夜精品久久久久久久99热黄桃 | 极品少妇xxxx精品少妇小说 | 国内精品少妇 | 欧美综合在线观看视频 | 国产莉萝无码av在线播放 | 国产高潮又爽又刺激的视频免费 | 欧美性xxxx极品hd欧美风情 | 中文免费视频 | 中文字幕乱码熟女人妻水蜜桃 | 亚洲国产精品成人综合色在线婷婷 | 荫道bbwbbb高潮潮喷 | 久久精品桃花av综合天堂 | 欧洲一区二区三区四区 | 国产成人久久精品麻豆二区 | 日韩伦理av | 欧美成人精品激情在线观看 | 一本一道久久a久久综合蜜桃 | 亚洲欧美日韩一级 | 国产最新毛片 | 男女激情视频免费观看刺激 | 色综合av综合无码综合网站 |