前言:
本文使用xml方式进行多数据源配置,与SqlSessionFactory指定数据源(配置类)方式相比,原理一致,但是传统的xml方式更复杂,大量的xml配置加重的工作量,同时也违背了springboot的初衷(减少繁琐的配置)
附上SqlSessionFactory指定数据源的链接:springboot多数据源配置-通过SqlSessionFactory指定的数据源来操作指定目录的XML文件的方式(附带源码)
以MySQL和Oracle两个数据库为例
目录
3.2、在dataSource文件夹下,新建两个数据源对应的配置文件
3.2.1、datasource-mysql-demo.properties文件
3.2.2、datasource-oracle-demo.properties文件
3.2.3、datasource-defualt.properties文件
3.3.1、spring-datasource-mysql.xml文件
3.3.2、spring-datasource-oracle.xml文件
3.4、在spring文件夹中,新建spring-context.xml配置文件
3.5、在springboot启动类上,指定spring配置文件加载的位置
3.6、在mybatisConfig文件夹下,新建mybatis-config.xml文件(mybatis配置文件)
5.3、在resource/mybatis目录下,新建2个数据源对应的2个存放xml文件的文件夹
1、准备工作
1.1、项目中使用的基本清单
- springboot 2.3.7.RELEASE
- MySQL 5.7.38
- Oracle 19
- mybatis-plus
1.2、两种数据库分别新建两个测试表
建表如下:
1.2.1、MySQL建表及初始化数据语句
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`age` int(11) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
INSERT INTO `user` VALUES (1, '张三', 18);
INSERT INTO `user` VALUES (2, '李四', 19);
INSERT INTO `user` VALUES (3, '王五', 20);
INSERT INTO `user` VALUES (4, '赵六', 19);
INSERT INTO `user` VALUES (5, '老七', 17);
INSERT INTO `user` VALUES (6, '芈八子', 18);
INSERT INTO `user` VALUES (7, '久久', 99);
1.2.2、Oracle建表及初始化数据语句
--Oracle测试表
CREATE TABLE city (
id number(10) not null,
name varchar2(40),
parent varchar2(40)
);
insert into city(id,name,parent) values(1,'广州','广东');
insert into city(id,name,parent) values(1,'深圳','广东');
insert into city(id,name,parent) values(1,'厦门','福建');
insert into city(id,name,parent) values(1,'长沙','湖南');
commit;
1.3、数据库基本信息如下
数据库类型 | 数据库名称 | 账号 | 密码 |
---|---|---|---|
MySQL | demo | root | root |
Oracle | demo2 | root | 123456 |
2、搭建springboot项目
这里我就略过了,我使用的版本为2.3.7.RELEASE
这里附上项目所需的maven依赖,如下(注意Druid与mybatis的版本):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.0</version>
</dependency>
<!-- mybatis版本必须与druid版本兼容,否则无法创建DataSource -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.72</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.1</version>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
<scope>runtime</scope>
</dependency>
<!-- Oracle驱动 -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.4.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</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>
3、配置开始
步骤如下
3.1、在resource目录下,新建以下4个文件夹
说明:
文件夹名称 | 作用 |
dataSource |
存放数据源配置信息的properties或yaml文件 |
mybatis |
SQL语句执行的xml文件存放位置 |
mybatisConfig |
mybatis相关配置文件存放位置 |
spring |
spring配置文件存放位置,多数据源的xml文件存放位置 |
注意:以上3个文件都可以配置在resource下的application.properties中的(我这里拆分后,可能比较麻烦,当数据源越来越多时,建议拆分)
3.2、在dataSource文件夹下,新建两个数据源对应的配置文件
如:
MySQL数据库,我新建了一个datasource-mysql-demo.properties文件
Oracle数据库,我新建了一个datasource-oracle-demo.properties文件
为了方便统一管理数据源共同的属性,再多新建一个公共配置文件:datasource-defualt.properties文件
注意:有几个数据源,就配置几个
如下图所示:
详细配置如下:
3.2.1、datasource-mysql-demo.properties文件
#每个数据源写成独立的配置文件,方便直接移入到nacos等配置中心上
#数据库驱动,使用5版本以上的MySQL,请使用com.mysql.cj.jdbc.Driver
db.driverClassName.demo=com.mysql.jdbc.Driver
#数据库地址
db.url.demo=jdbc:mysql://127.0.0.1:3306/demo
#账号
db.username.demo=root
#密码
db.password.demo=root
3.2.2、datasource-oracle-demo.properties文件
#每个数据源写成独立的配置文件,方便直接移入到nacos等配置中心上
#Oracle数据库驱动
db.driverClassName.demo2=oracle.jdbc.OracleDriver
#数据库地址
db.url.demo2=jdbc:oracle:thin:@127.0.0.1:1521:demo2
#用户账号
db.username.demo2=root
#密码
db.password.demo2=123456
3.2.3、datasource-defualt.properties文件
#########数据源公共配置,单独写成一个文件,便于移植带nacos中################ |
3.3、在spring文件夹中,新建两个数据源的xml文件
-
MySQL数据源文件名为:spring-datasource-mysql.xml
-
Oracle数据源文件名为:spring-datasource-oracle.xml
-
注意:有几个数据源,就配置几个,与dataSource文件夹下的properties对应
如图:
详细配置如下(注意:复制完成后,value会显示红色,正常现象,先不管)
3.3.1、spring-datasource-mysql.xml文件
<?xml version=”1.0″ encoding=”UTF-8″?>
<beans xmlns=”http://www.springframework.org/schema/beans” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xmlns:context=”http://www.springframework.org/schema/context”
xmlns:tx=”http://www.springframework.org/schema/tx”
xsi:schemaLocation=”http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd”><!– DataSource –>
<bean id=”dataSourceMySQL” class=”com.alibaba.druid.pool.DruidDataSource” destroy-method=”close” init-method=”init”>
<property name=”driverClassName” value=”${db.driverClassName.demo}” />
<property name=”url” value=”${db.url.demo}” />
<property name=”username” value=”${db.username.demo}” />
<property name=”password” value=”${db.password.demo}” />
<!– 初始化连接数量 –>
<property name=”initialSize” value=”${db.initialSize}” />
<!– 最大连接数 –>
<property name=”maxActive” value=”${db.maxActive}” />
<!– 配置获取连接等待超时的时间 –>
<property name=”maxWait” value=”${db.maxWait}” />
<property name=”validationQuery” value=”${db.validationQuery}” />
<property name=”testWhileIdle” value=”${db.testWhileIdle}” />
<property name=”testOnBorrow” value=”${db.testOnBorrow}” />
<property name=”testOnReturn” value=”${db.testOnReturn}” />
<!– 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 –>
<property name=”timeBetweenEvictionRunsMillis” value=”${db.timeBetweenEvictionRunsMillis}” />
<!– 配置一个连接在池中最小生存的时间,单位是毫秒 –>
<property name=”minEvictableIdleTimeMillis” value=”${db.minEvictableIdleTimeMillis}” />
<!– 打开PSCache –>
<property name=”poolPreparedStatements” value=”${db.poolPreparedStatements}” />
<!– 指定每个连接上PSCache的大小 –>
<property name=”maxOpenPreparedStatements” value=”${db.maxOpenPreparedStatements}” />
<!– 配置监控统计拦截的filters –>
<property name=”filters” value=”${db.filters}” />
<!– 超过时间限制是否回收 –>
<property name=”removeAbandoned” value=”${db.removeAbandoned}” />
<!– 超时时间:单位为秒,300秒=5分钟 –>
<property name=”removeAbandonedTimeout” value=”${db.removeAbandonedTimeout}” />
<!– 关闭abanded连接时输出错误日志 –>
<property name=”logAbandoned” value=”${db.logAbandoned}” />
</bean><bean id=”transactionManagerMySQL” class=”org.springframework.jdbc.datasource.DataSourceTransactionManager”>
<property name=”dataSource” ref=”dataSourceMySQL” />
<property name=”globalRollbackOnParticipationFailure” value=”true” />
</bean><tx:annotation-driven transaction-manager=”transactionManagerMySQL” proxy-target-class=”true” />
<!– MyBatis配置 –>
<bean id=”sqlSessionFactoryMySQL” class=”org.mybatis.spring.SqlSessionFactoryBean”>
<property name=”dataSource” ref=”dataSourceMySQL” />
<property name=”configLocation” value=”classpath:mybatisConfig/mybatis-config.xml” />
<property name=”mapperLocations”>
<array><!–这里是存放SQL的xml文件位置,以后该数据源下的SQL都需要放到该文件夹中!不在该文件夹中,会报错–>
<value>classpath*:mybatis/mysql/*.xml</value>
<value>classpath*:mybatis/mysql/**/*.xml</value>
</array>
</property>
</bean><bean id=”mapperScannerConfigurerMySQL” class=”org.mybatis.spring.mapper.MapperScannerConfigurer”>
<property name=”annotationClass” value=”org.springframework.stereotype.Repository” />
<!– 扫描的Java包,这里也可以使用com.shuizhu.**.dao.** –>
<property name=”basePackage” value=”com.shuizhu.**.dao.mysql” />
<property name=”sqlSessionFactoryBeanName” value=”sqlSessionFactoryMySQL” />
<!– <property name=”properties”> –>
<!– <value> –>
<!– mappers=tk.mybatis.mapper.common.Mapper –>
<!– ORDER=BEFORE –>
<!– </value> –>
<!– </property> –>
</bean>
</beans>
3.3.2、spring-datasource-oracle.xml文件
<?xml version=”1.0″ encoding=”UTF-8″?>
<beans xmlns=”http://www.springframework.org/schema/beans” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xmlns:context=”http://www.springframework.org/schema/context”
xmlns:tx=”http://www.springframework.org/schema/tx”
xsi:schemaLocation=”http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd”><!– DataSource –>
<bean id=”dataSourceOracle” class=”com.alibaba.druid.pool.DruidDataSource” destroy-method=”close” init-method=”init”>
<property name=”driverClassName” value=”${db.driverClassName.demo2}” />
<property name=”url” value=”${db.url.demo2}” />
<property name=”username” value=”${db.username.demo2}” />
<property name=”password” value=”${db.password.demo2}” />
<!– 初始化连接数量 –>
<property name=”initialSize” value=”${db.initialSize}” />
<!– 最大连接数 –>
<property name=”maxActive” value=”${db.maxActive}” />
<!– 配置获取连接等待超时的时间 –>
<property name=”maxWait” value=”${db.maxWait}” />
<property name=”validationQuery” value=”${db.validationQuery}” />
<property name=”testWhileIdle” value=”${db.testWhileIdle}” />
<property name=”testOnBorrow” value=”${db.testOnBorrow}” />
<property name=”testOnReturn” value=”${db.testOnReturn}” />
<!– 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 –>
<property name=”timeBetweenEvictionRunsMillis” value=”${db.timeBetweenEvictionRunsMillis}” />
<!– 配置一个连接在池中最小生存的时间,单位是毫秒 –>
<property name=”minEvictableIdleTimeMillis” value=”${db.minEvictableIdleTimeMillis}” />
<!– 打开PSCache –>
<property name=”poolPreparedStatements” value=”${db.poolPreparedStatements}” />
<!– 指定每个连接上PSCache的大小 –>
<property name=”maxOpenPreparedStatements” value=”${db.maxOpenPreparedStatements}” />
<!– 配置监控统计拦截的filters –>
<property name=”filters” value=”${db.filters}” />
<!– 超过时间限制是否回收 –>
<property name=”removeAbandoned” value=”${db.removeAbandoned}” />
<!– 超时时间:单位为秒,300秒=5分钟 –>
<property name=”removeAbandonedTimeout” value=”${db.removeAbandonedTimeout}” />
<!– 关闭abanded连接时输出错误日志 –>
<property name=”logAbandoned” value=”${db.logAbandoned}” />
</bean><bean id=”transactionManagerOracle” class=”org.springframework.jdbc.datasource.DataSourceTransactionManager”>
<property name=”dataSource” ref=”dataSourceOracle” />
<property name=”globalRollbackOnParticipationFailure” value=”true” />
</bean><tx:annotation-driven transaction-manager=”transactionManagerOracle” proxy-target-class=”true” />
<!– MyBatis配置 –>
<bean id=”sqlSessionFactoryOracle” class=”org.mybatis.spring.SqlSessionFactoryBean”>
<property name=”dataSource” ref=”dataSourceOracle” />
<property name=”configLocation” value=”classpath:mybatisConfig/mybatis-config.xml” />
<property name=”mapperLocations”>
<array><!–这里是存放SQL的xml文件位置,以后该数据源下的SQL都需要放到该文件夹中!不在该文件夹中,会报错–>
<value>classpath*:mybatis/oralce/*.xml</value>
<value>classpath*:mybatis/oralce/**/*.xml</value>
</array>
</property>
</bean><bean id=”mapperScannerConfigurerOracle” class=”org.mybatis.spring.mapper.MapperScannerConfigurer”>
<property name=”annotationClass” value=”org.springframework.stereotype.Repository” />
<!– 扫描的Java包,这里也可以使用com.shuizhu.**.dao.** –>
<property name=”basePackage” value=”com.shuizhu.**.dao.oralce” />
<property name=”sqlSessionFactoryBeanName” value=”sqlSessionFactoryOracle” />
<!– <property name=”properties”> –>
<!– <value> –>
<!– mappers=tk.mybatis.mapper.common.Mapper –>
<!– ORDER=BEFORE –>
<!– </value> –>
<!– </property> –>
</bean>
</beans>
3.4、在spring文件夹中,新建spring-context.xml配置文件
如图示:
spring-context.xml文件详细配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 加载spring文件时,再指定加载以下路径中的文件 -->
<import resource="classpath:spring/spring-datasource-mysql.xml" />
<import resource="classpath:spring/spring-datasource-oracle.xml" />
<!-- 加载自定义数据源配置文件,这里不能配错,否则无法创建DataSource的bean -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:dataSource/*.properties</value>
</list>
</property>
</bean>
<!-- 其他配置都不需要管,springboot都自动配置好了 -->
</beans>
3.5、在springboot启动类上,指定spring配置文件加载的位置
@ImportResource({"classpath:/spring/spring-context.xml"})//加载spring配置
//以下不能省略
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class})
public class ScaffoldingShuizhuApplication {
public static void main(String[] args) {
SpringApplication.run(ScaffoldingShuizhuApplication.class, args);
}
}
3.6、在mybatisConfig文件夹下,新建mybatis-config.xml文件(mybatis配置文件)
如图所示:
mybatis-config.xml文件详细信息如下:
<?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>
<!-- In the configuration file, plugins location must meet the requirements as the following order: -->
<!-- properties, settings, typeAliases, typeHandlers, objectFactory, -->
<!-- objectWrapperFactory, plugins, environments, databaseIdProvider, mappers -->
<settings>
<setting name="cacheEnabled" value="true" />
<setting name="lazyLoadingEnabled" value="false" />
<setting name="useColumnLabel" value="true" />
<!-- 默认的超时时间是30s -->
<setting name="defaultStatementTimeout" value="7200" />
<!-- <setting name="useGeneratedKeys" value="true" /> -->
<!-- 配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新。默认SIMPLE -->
<setting name="defaultExecutorType" value="REUSE" />
</settings>
<!-- mybatis映射文件中所用到的别名配置 -->
<typeAliases>
</typeAliases>
</configuration>
至此,配置完成
4、初始化springboot配置
在resource下的application.properties中,配置以下信息(可忽略)
# 应用名称
spring.application.name=scaffolding-shuizhu
# 应用服务 WEB 访问端口
server.port=8080
#开启bean冲突覆盖
spring.main.allow-bean-definition-overriding=true
5、编写测试代码
这里就是写一个测试接口,查看SQL是否能正常执行,且接口能返回数据
步骤:
5.1、新建基本的包
如:controller、service、dao、domain(实体类存放包)
如图所示:
5.2、初始化上面包中的代码
5.2.1、Controller层:
package com.shuizhu.controller;
import com.shuizhu.domain.City;
import com.shuizhu.domain.User;
import com.shuizhu.service.IDemoService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
/**
* @author 睡竹
* @date 2022/9/15
*/
@RestController
public class DemoController {
@Resource
private IDemoService service;
/**
* 测试MySQL数据源是否生效
* @return
*/
@RequestMapping("testMySQL")
public Object testMySQL(){
List<User> users = service.getUsers();
return users;
}
/**
* 测试Oracle数据源是否生效
* @return
*/
@RequestMapping("testOracle")
public Object testOracle(){
List<City> users = service.getCitys();
return users;
}
}
5.2.2、Service接口层:
package com.shuizhu.service;
import com.shuizhu.domain.City;
import com.shuizhu.domain.User;
import java.util.List;
/**
* @author 睡竹
* @date 2022/9/15
*/
public interface IDemoService {
List<User> getUsers();
List<City> getCitys();
}
5.2.3、Service接口实现层:
package com.shuizhu.service.impl;
import com.shuizhu.dao.mysql.DemoDao;
import com.shuizhu.dao.oracle.DemoOracleDao;
import com.shuizhu.domain.City;
import com.shuizhu.domain.User;
import com.shuizhu.service.IDemoService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 偷懒了,直接写入到同一个service
* @author 睡竹
* @date 2022/9/15
*/
@Service
@RequiredArgsConstructor
public class DemoService implements IDemoService {
//MySQL的Dao构造器注入
final DemoDao dao1;
//Oracle的Dao构造器注入
final DemoOracleDao dao2;
@Override
public List<User> getUsers() {
List<User> users = dao1.getUsers();
return users;
}
@Override
public List<City> getCitys() {
List<City> citys = dao2.getCitys();
return citys;
}
}
5.2.4、Domain实体类层:
User实体类:
package com.shuizhu.domain;
import lombok.Data;
import java.io.Serializable;
/**
* MySQL库user表实体类
* @author 睡竹
* @date 2022/9/15
*/
@Data
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
private Integer age;
}
City实体类:
package com.shuizhu.domain;
import lombok.Data;
import java.io.Serializable;
/**
* Oracle库city表实体类
* @author 睡竹
* @date 2022/9/16
*/
@Data
public class City implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
private String parent;
}
5.2.5、Dao层:
MySQL数据源的Dao:
package com.shuizhu.dao.mysql;
import com.shuizhu.domain.User;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* MySQL数据源的dao
* @author 睡竹
* @date 2022/9/15
*/
@Repository
public interface DemoDao {
List<User> getUsers();
}
Oracle数据源的Dao:
package com.shuizhu.dao.oracle;
import com.shuizhu.domain.City;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* Oracle数据源的dao
* @author 睡竹
* @date 2022/9/15
*/
@Repository
public interface DemoOracleDao {
List<City> getCitys();
}
5.3、在resource/mybatis目录下,新建2个数据源对应的2个存放xml文件的文件夹
如图所示:
5.4、分别新建2个数据源的xml文件,并写测试SQL语句
如图所示:
5.4.1、Demo.xml代码(MySQL数据源):
<?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.shuizhu.dao.mysql.DemoDao">
<select id="getUsers" resultType="com.shuizhu.domain.User">
select id,name,age from user
</select>
</mapper>
5.4.2、Demo2.xml代码(Oracle数据源)
<?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.shuizhu.dao.oracle.DemoOracleDao">
<select id="getCitys" resultType="com.shuizhu.domain.City">
select id,name,parent from city
</select>
</mapper>
至此,测试流程及代码都已实现
附上整个springboot项目完整目录结构如:
6、使用api工具测试接口
使用api工具对接口进行测试,检验数据源是否生效
6.1、测试MySQL数据的接口
请求路径:http://127.0.0.1:9080/testMySQL
6.2、 测试Oracle数据的接口
请求路径:http://127.0.0.1:9080/testOracle
测试成功,多数据源配置生效
案例源码位置:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/99570.html