国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Spring Boot+Mybatis+Druid+PageHelper實現多數據源并分頁的方法

Spring Boot+Mybatis+Druid+PageHelper實現多數據源并分頁的方法

2021-04-27 11:50虛無境 Java教程

這篇文章主要給大家介紹了關于Spring Boot+Mybatis+Druid+PageHelper實現多數據源并分頁的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們來一起看看吧

前言

本篇文章主要講述的是springboot整合mybatis、druid和pagehelper 并實現多數據源和分頁。其中springboot整合mybatis這塊,在之前的一篇文章的中已經講述了,這里就不過多說明了。重點是講述在多數據源下的如何配置使用druid和pagehelper 。

druid介紹和使用

在使用druid之前,先來簡單的了解下druid。

druid是一個數據庫連接池。druid可以說是目前最好的數據庫連接池!因其優秀的功能、性能和擴展性方面,深受開發人員的青睞。

druid已經在阿里巴巴部署了超過600個應用,經過一年多生產環境大規模部署的嚴苛考驗。druid是阿里巴巴開發的號稱為監控而生的數據庫連接池!

同時druid不僅僅是一個數據庫連接池,druid 核心主要包括三部分:

  • 基于filter-chain模式的插件體系。
  • druiddatasource 高效可管理的數據庫連接池。
  • sqlparser

druid的主要功能如下:

  1. 是一個高效、功能強大、可擴展性好的數據庫連接池。
  2. 可以監控數據庫訪問性能。
  3. 數據庫密碼加密
  4. 獲得sql執行日志
  5. 擴展jdbc

介紹方面這塊就不再多說,具體的可以看官方文檔。

那么開始介紹druid如何使用。

首先是maven依賴,只需要添加druid這一個jar就行了。

?
1
2
3
4
5
<dependency>
 <groupid>com.alibaba</groupid>
 <artifactid>druid</artifactid>
 <version>1.1.8</version>
 </dependency>

配置方面,主要的只需要在application.properties或application.yml添加如下就可以了。

說明:因為這里我是用來兩個數據源,所以稍微有些不同而已。druid 配置的說明在下面中已經說的很詳細了,這里我就不在說明了。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
## 默認的數據源
 
master.datasource.url=jdbc:mysql://localhost:3306/springboot?useunicode=true&characterencoding=utf8&allowmultiqueries=true
master.datasource.username=root
master.datasource.password=123456
master.datasource.driverclassname=com.mysql.jdbc.driver
 
 
## 另一個的數據源
cluster.datasource.url=jdbc:mysql://localhost:3306/springboot_test?useunicode=true&characterencoding=utf8
cluster.datasource.username=root
cluster.datasource.password=123456
cluster.datasource.driverclassname=com.mysql.jdbc.driver
 
# 連接池的配置信息
# 初始化大小,最小,最大
spring.datasource.type=com.alibaba.druid.pool.druiddatasource
spring.datasource.initialsize=5
spring.datasource.minidle=5
spring.datasource.maxactive=20
# 配置獲取連接等待超時的時間
spring.datasource.maxwait=60000
# 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒
spring.datasource.timebetweenevictionrunsmillis=60000
# 配置一個連接在池中最小生存的時間,單位是毫秒
spring.datasource.minevictableidletimemillis=300000
spring.datasource.validationquery=select 1 from dual
spring.datasource.testwhileidle=true
spring.datasource.testonborrow=false
spring.datasource.testonreturn=false
# 打開pscache,并且指定每個連接上pscache的大小
spring.datasource.poolpreparedstatements=true
spring.datasource.maxpoolpreparedstatementperconnectionsize=20
# 配置監控統計攔截的filters,去掉后監控界面sql無法統計,'wall'用于防火墻
spring.datasource.filters=stat,wall,log4j
# 通過connectproperties屬性來打開mergesql功能;慢sql記錄
spring.datasource.connectionproperties=druid.stat.mergesql=true;druid.stat.slowsqlmillis=5000

成功添加了配置文件之后,我們再來編寫druid相關的類。

首先是masterdatasourceconfig.java這個類,這個是默認的數據源配置類。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
@configuration
@mapperscan(basepackages = masterdatasourceconfig.package, sqlsessionfactoryref = "mastersqlsessionfactory")
public class masterdatasourceconfig {
 
 static final string package = "com.pancm.dao.master";
 static final string mapper_location = "classpath:mapper/master/*.xml";
 
 @value("${master.datasource.url}")
 private string url;
 
 @value("${master.datasource.username}")
 private string username;
 
 @value("${master.datasource.password}")
 private string password;
 
 @value("${master.datasource.driverclassname}")
 private string driverclassname;
 
 
 
 
 @value("${spring.datasource.initialsize}")
 private int initialsize;
 
 @value("${spring.datasource.minidle}")
 private int minidle;
 
 @value("${spring.datasource.maxactive}")
 private int maxactive;
 
 @value("${spring.datasource.maxwait}")
 private int maxwait;
 
 @value("${spring.datasource.timebetweenevictionrunsmillis}")
 private int timebetweenevictionrunsmillis;
 
 @value("${spring.datasource.minevictableidletimemillis}")
 private int minevictableidletimemillis;
 
 @value("${spring.datasource.validationquery}")
 private string validationquery;
 
 @value("${spring.datasource.testwhileidle}")
 private boolean testwhileidle;
 
 @value("${spring.datasource.testonborrow}")
 private boolean testonborrow;
 
 @value("${spring.datasource.testonreturn}")
 private boolean testonreturn;
 
 @value("${spring.datasource.poolpreparedstatements}")
 private boolean poolpreparedstatements;
 
 @value("${spring.datasource.maxpoolpreparedstatementperconnectionsize}")
 private int maxpoolpreparedstatementperconnectionsize;
 
 @value("${spring.datasource.filters}")
 private string filters;
 
 @value("{spring.datasource.connectionproperties}")
 private string connectionproperties;
 
 
 @bean(name = "masterdatasource")
 @primary
 public datasource masterdatasource() {
 druiddatasource datasource = new druiddatasource();
 datasource.seturl(url);
 datasource.setusername(username);
 datasource.setpassword(password);
 datasource.setdriverclassname(driverclassname);
 
 //具體配置
 datasource.setinitialsize(initialsize);
 datasource.setminidle(minidle);
 datasource.setmaxactive(maxactive);
 datasource.setmaxwait(maxwait);
 datasource.settimebetweenevictionrunsmillis(timebetweenevictionrunsmillis);
 datasource.setminevictableidletimemillis(minevictableidletimemillis);
 datasource.setvalidationquery(validationquery);
 datasource.settestwhileidle(testwhileidle);
 datasource.settestonborrow(testonborrow);
 datasource.settestonreturn(testonreturn);
 datasource.setpoolpreparedstatements(poolpreparedstatements);
 datasource.setmaxpoolpreparedstatementperconnectionsize(maxpoolpreparedstatementperconnectionsize);
 try {
 datasource.setfilters(filters);
 } catch (sqlexception e) {
 e.printstacktrace();
 }
 datasource.setconnectionproperties(connectionproperties);
 return datasource;
 }
 
 @bean(name = "mastertransactionmanager")
 @primary
 public datasourcetransactionmanager mastertransactionmanager() {
 return new datasourcetransactionmanager(masterdatasource());
 }
 
 @bean(name = "mastersqlsessionfactory")
 @primary
 public sqlsessionfactory mastersqlsessionfactory(@qualifier("masterdatasource") datasource masterdatasource)
 throws exception {
 final sqlsessionfactorybean sessionfactory = new sqlsessionfactorybean();
 sessionfactory.setdatasource(masterdatasource);
 sessionfactory.setmapperlocations(new pathmatchingresourcepatternresolver()
 .getresources(masterdatasourceconfig.mapper_location));
 return sessionfactory.getobject();
 }
}

其中這兩個注解說明下:

**@primary** :標志這個 bean 如果在多個同類 bean 候選時,該 bean
優先被考慮。多數據源配置的時候注意,必須要有一個主數據源,用 @primary 標志該 bean。

**@mapperscan**: 掃描 mapper 接口并容器管理。

需要注意的是sqlsessionfactoryref 表示定義一個唯一 sqlsessionfactory 實例。

上面的配置完之后,就可以將druid作為連接池使用了。但是druid并不簡簡單單的是個連接池,它也可以說是一個監控應用,它自帶了web監控界面,可以很清晰的看到sql相關信息。

在springboot中運用druid的監控作用,只需要編寫statviewservlet和webstatfilter類,實現注冊服務和過濾規則。這里我們可以將這兩個寫在一起,使用**@configuration**和**@bean**。

為了方便理解,相關的配置說明也寫在代碼中了,這里就不再過多贅述了。

代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@configuration
public class druidconfiguration {
 
 @bean
 public servletregistrationbean druidstatviewservle() {
 //注冊服務
 servletregistrationbean servletregistrationbean = new servletregistrationbean(
 new statviewservlet(), "/druid/*");
 // 白名單(為空表示,所有的都可以訪問,多個ip的時候用逗號隔開)
 servletregistrationbean.addinitparameter("allow", "127.0.0.1");
 // ip黑名單 (存在共同時,deny優先于allow)
 servletregistrationbean.addinitparameter("deny", "127.0.0.2");
 // 設置登錄的用戶名和密碼
 servletregistrationbean.addinitparameter("loginusername", "pancm");
 servletregistrationbean.addinitparameter("loginpassword", "123456");
 // 是否能夠重置數據.
 servletregistrationbean.addinitparameter("resetenable", "false");
 return servletregistrationbean;
 }
 
 @bean
 public filterregistrationbean druidstatfilter() {
 filterregistrationbean filterregistrationbean = new filterregistrationbean(
 new webstatfilter());
 // 添加過濾規則
 filterregistrationbean.addurlpatterns("/*");
 // 添加不需要忽略的格式信息
 filterregistrationbean.addinitparameter("exclusions",
 "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
 system.out.println("druid初始化成功!");
 return filterregistrationbean;
 }
}

編寫完之后,啟動程序,在瀏覽器輸入:http://127.0.0.1:8084/druid/index.html ,然后輸入設置的用戶名和密碼,便可以訪問web界面了。

多數據源配置

在進行多數據源配置之前,先分別在springboot和springboot_test的mysql數據庫中執行如下腳本。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- springboot庫的腳本
 
create table `t_user` (
 `id` int(11) not null auto_increment comment '自增id',
 `name` varchar(10) default null comment '姓名',
 `age` int(2) default null comment '年齡',
 primary key (`id`)
) engine=innodb auto_increment=15 default charset=utf8
 
-- springboot_test庫的腳本
 
create table `t_student` (
 `id` int(11) not null auto_increment,
 `name` varchar(16) default null,
 `age` int(11) default null,
 primary key (`id`)
) engine=innodb auto_increment=2 default charset=utf8

注:為了偷懶,將兩張表的結構弄成一樣了!不過不影響測試!

在application.properties中已經配置這兩個數據源的信息,上面已經貼出了一次配置,這里就不再貼了。

這里重點說下 第二個數據源的配置。和上面的masterdatasourceconfig.java差不多,區別在與沒有使用**@primary** 注解和名稱不同而已。需要注意的是masterdatasourceconfig.java對package和mapper的掃描是精確到目錄的,這里的第二個數據源也是如此。那么代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
@configuration
@mapperscan(basepackages = clusterdatasourceconfig.package, sqlsessionfactoryref = "clustersqlsessionfactory")
public class clusterdatasourceconfig {
 
 static final string package = "com.pancm.dao.cluster";
 static final string mapper_location = "classpath:mapper/cluster/*.xml";
 
 @value("${cluster.datasource.url}")
 private string url;
 
 @value("${cluster.datasource.username}")
 private string username;
 
 @value("${cluster.datasource.password}")
 private string password;
 
 @value("${cluster.datasource.driverclassname}")
 private string driverclass;
 
 // 和masterdatasourceconfig一樣,這里略
 
 @bean(name = "clusterdatasource")
 public datasource clusterdatasource() {
 druiddatasource datasource = new druiddatasource();
 datasource.seturl(url);
 datasource.setusername(username);
 datasource.setpassword(password);
 datasource.setdriverclassname(driverclass);
 
 // 和masterdatasourceconfig一樣,這里略 ...
 return datasource;
 }
 
 @bean(name = "clustertransactionmanager")
 public datasourcetransactionmanager clustertransactionmanager() {
 return new datasourcetransactionmanager(clusterdatasource());
 }
 
 @bean(name = "clustersqlsessionfactory")
 public sqlsessionfactory clustersqlsessionfactory(@qualifier("clusterdatasource") datasource clusterdatasource)
 throws exception {
 final sqlsessionfactorybean sessionfactory = new sqlsessionfactorybean();
 sessionfactory.setdatasource(clusterdatasource);
 sessionfactory.setmapperlocations(new pathmatchingresourcepatternresolver().getresources(clusterdatasourceconfig.mapper_location));
 return sessionfactory.getobject();
 }
}

成功寫完配置之后,啟動程序,進行測試。

分別在springboot和springboot_test庫中使用接口進行添加數據。

t_user

?
1
2
3
4
post http://localhost:8084/api/user
{"name":"張三","age":25}
{"name":"李四","age":25}
{"name":"王五","age":25}

t_student

?
1
2
3
4
post http://localhost:8084/api/student
{"name":"學生a","age":16}
{"name":"學生b","age":17}
{"name":"學生c","age":18}

成功添加數據之后,然后進行調用不同的接口進行查詢。

請求:

?
1
get http://localhost:8084/api/user?name=李四

返回:

?
1
2
3
4
5
{
 "id": 2,
 "name": "李四",
 "age": 25
}

請求:

?
1
get http://localhost:8084/api/student?name=學生c

返回:

?
1
2
3
4
5
{
 "id": 1,
 "name": "學生c",
 "age": 16
}

通過數據可以看出,成功配置了多數據源了。

pagehelper 分頁實現

pagehelper是mybatis的一個分頁插件,非常的好用!這里強烈推薦!?。?/p>

pagehelper的使用很簡單,只需要在maven中添加pagehelper這個依賴就可以了。
maven的依賴如下:

?
1
2
3
4
5
<dependency>
 <groupid>com.github.pagehelper</groupid>
 <artifactid>pagehelper-spring-boot-starter</artifactid>
 <version>1.2.3</version>
</dependency>

注:這里我是用springboot版的!也可以使用其它版本的。

添加依賴之后,只需要添加如下配置或代碼就可以了。

第一種,在application.propertiesapplication.yml添加

?
1
2
3
4
5
pagehelper:
helperdialect: mysql
offsetaspagenum: true
rowboundswithcount: true
reasonable: false

第二種,在mybatis.xml配置中添加

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<bean id="sqlsessionfactory" class="org.mybatis.spring.sqlsessionfactorybean">
<property name="datasource" ref="datasource" />
<!-- 掃描mapping.xml文件 -->
<property name="mapperlocations" value="classpath:mapper/*.xml"></property>
<!-- 配置分頁插件 -->
<property name="plugins">
<array>
 <bean class="com.github.pagehelper.pagehelper">
 <property name="properties">
 <value>
 helperdialect=mysql
 offsetaspagenum=true
 rowboundswithcount=true
 reasonable=false
 </value>
 </property>
 </bean>
</array>
</property>
</bean>

第三種,在代碼中添加,使用**@bean**注解在啟動程序的時候初始化。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@bean
public pagehelper pagehelper(){
pagehelper pagehelper = new pagehelper();
properties properties = new properties();
//數據庫
properties.setproperty("helperdialect", "mysql");
//是否將參數offset作為pagenum使用
properties.setproperty("offsetaspagenum", "true");
//是否進行count查詢
properties.setproperty("rowboundswithcount", "true");
//是否分頁合理化
properties.setproperty("reasonable", "false");
pagehelper.setproperties(properties);
}

因為這里我們使用的是多數據源,所以這里的配置稍微有些不同。我們需要在sessionfactory這里配置。這里就對masterdatasourceconfig.java進行相應的修改。在mastersqlsessionfactory方法中,添加如下代碼。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@bean(name = "mastersqlsessionfactory")
@primary
public sqlsessionfactory mastersqlsessionfactory(@qualifier("masterdatasource") datasource masterdatasource)
 throws exception {
final sqlsessionfactorybean sessionfactory = new sqlsessionfactorybean();
sessionfactory.setdatasource(masterdatasource);
sessionfactory.setmapperlocations(new pathmatchingresourcepatternresolver()
 .getresources(masterdatasourceconfig.mapper_location));
//分頁插件
interceptor interceptor = new pageinterceptor();
properties properties = new properties();
//數據庫
properties.setproperty("helperdialect", "mysql");
//是否將參數offset作為pagenum使用
properties.setproperty("offsetaspagenum", "true");
//是否進行count查詢
properties.setproperty("rowboundswithcount", "true");
//是否分頁合理化
properties.setproperty("reasonable", "false");
interceptor.setproperties(properties);
sessionfactory.setplugins(new interceptor[] {interceptor});
 
return sessionfactory.getobject();
}

注:其它的數據源也想進行分頁的時候,參照上面的代碼即可。

這里需要注意的是reasonable參數,表示分頁合理化,默認值為false。如果該參數設置為 true 時,pagenum<=0 時會查詢第一頁,pagenum>pages(超過總數時),會查詢最后一頁。默認false 時,直接根據參數進行查詢。

設置完pagehelper 之后,使用的話,只需要在查詢的sql前面添加pagehelper.startpage(pagenum,pagesize); ,如果是想知道總數的話,在查詢的sql語句后買呢添加 page.gettotal()就可以了。

代碼示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
public list<t> findbylistentity(t entity) {
 list<t> list = null;
 try {
  page<?> page =pagehelper.startpage(1,2);
  system.out.println(getclassname(entity)+"設置第一頁兩條數據!");
  list = getmapper().findbylistentity(entity);
  system.out.println("總共有:"+page.gettotal()+"條數據,實際返回:"+list.size()+"兩條數據!");
 } catch (exception e) {
  logger.error("查詢"+getclassname(entity)+"失敗!原因是:",e);
 }
 return list;
 }

代碼編寫完畢之后,開始進行最后的測試。

查詢t_user表的所有的數據,并進行分頁。

請求:

?
1
get http://localhost:8084/api/user

返回:

?
1
2
3
4
5
6
7
8
9
10
11
12
[
 {
 "id": 1,
 "name": "張三",
 "age": 25
 },
 {
 "id": 2,
 "name": "李四",
 "age": 25
 }
]

控制臺打印:

開始查詢...
user設置第一頁兩條數據!
2018-04-27 19:55:50.769 debug 6152 --- [io-8084-exec-10] c.p.d.m.userdao.findbylistentity_count   : ==>  preparing: select count(0) from t_user where 1 = 1
2018-04-27 19:55:50.770 debug 6152 --- [io-8084-exec-10] c.p.d.m.userdao.findbylistentity_count   : ==> parameters:
2018-04-27 19:55:50.771 debug 6152 --- [io-8084-exec-10] c.p.d.m.userdao.findbylistentity_count   : <==      total: 1
2018-04-27 19:55:50.772 debug 6152 --- [io-8084-exec-10] c.p.dao.master.userdao.findbylistentity  : ==>  preparing: select id, name, age from t_user where 1=1 limit ?
2018-04-27 19:55:50.773 debug 6152 --- [io-8084-exec-10] c.p.dao.master.userdao.findbylistentity  : ==> parameters: 2(integer)
2018-04-27 19:55:50.774 debug 6152 --- [io-8084-exec-10] c.p.dao.master.userdao.findbylistentity  : <==      total: 2
總共有:3條數據,實際返回:2兩條數據!

查詢t_student表的所有的數據,并進行分頁。

請求:

?
1
get http://localhost:8084/api/student

返回:

?
1
2
3
4
5
6
7
8
9
10
11
12
[
 {
 "id": 1,
 "name": "學生a",
 "age": 16
 },
 {
 "id": 2,
 "name": "學生b",
 "age": 17
 }
]

控制臺打印:

開始查詢...
studnet設置第一頁兩條數據!
2018-04-27 19:54:56.155 debug 6152 --- [nio-8084-exec-8] c.p.d.c.s.findbylistentity_count         : ==>  preparing: select count(0) from t_student where 1 = 1
2018-04-27 19:54:56.155 debug 6152 --- [nio-8084-exec-8] c.p.d.c.s.findbylistentity_count         : ==> parameters:
2018-04-27 19:54:56.156 debug 6152 --- [nio-8084-exec-8] c.p.d.c.s.findbylistentity_count         : <==      total: 1
2018-04-27 19:54:56.157 debug 6152 --- [nio-8084-exec-8] c.p.d.c.studentdao.findbylistentity      : ==>  preparing: select id, name, age from t_student where 1=1 limit ?
2018-04-27 19:54:56.157 debug 6152 --- [nio-8084-exec-8] c.p.d.c.studentdao.findbylistentity      : ==> parameters: 2(integer)
2018-04-27 19:54:56.157 debug 6152 --- [nio-8084-exec-8] c.p.d.c.studentdao.findbylistentity      : <==      total: 2
總共有:3條數據,實際返回:2兩條數據!

查詢完畢之后,我們再來看druid 的監控界面。在瀏覽器輸入:http://127.0.0.1:8084/druid/index.html

Spring Boot+Mybatis+Druid+PageHelper實現多數據源并分頁的方法

可以很清晰的看到操作記錄!

如果想知道更多的druid相關知識,可以查看官方文檔!

結語

這篇終于寫完了,在進行代碼編寫的時候,碰到過很多問題,然后慢慢的嘗試和找資料解決了。本篇文章只是很淺的介紹了這些相關的使用,在實際的應用可能會更復雜。

參考文章:https://www.bysocket.com/?p=1712

durid官方地址:https://github.com/alibaba/druid

pagehelper官方地址:https://github.com/pagehelper/mybatis-pagehelper

項目我放到github上面去了: https://github.com/xuwujing/springboot

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:https://www.cnblogs.com/xuwujing/p/8964927.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: av黄网 | 国偷自产一区二区免费视频 | 欧洲精品码一区二区三区免费看 | 久久久国产一区二区三区 | 色视频网站在线观看 | 91九色在线 | 一区福利| 91视频在线| 91免费版在线观看 | 精品久久一二三区 | 春色导航| 国产97在线 | 免费 | 欧美日韩亚洲一区 | 亚洲福利社区 | 成人免费在线播放 | 欧美国产一区二区 | 日韩在线播放一区二区三区 | av电影一区二区 | 激情国产精品 | 日韩国产精品一区二区三区 | 国产精品久久久 | 韩国精品一区二区 | 日韩精品中文字幕在线观看 | 国产一区二区三区高清 | 午夜精品久久久久久久星辰影院 | 99精品久久久久久久免费 | 久久久精品视频国产 | 亚洲午夜电影 | 亚洲国产精品99久久久久久久久 | 国产精品毛片无码 | 97久久香蕉国产线看观看 | 欧洲在线一区 | 久久综合久久久 | 亚洲精选一区二区 | 国产高清一区二区 | 亚洲的天堂| 欧美日韩专区 | 日韩一区中文字幕 | 色姑娘综合网 | av电影一区二区 | 成人在线国产 |