手牵手入门Spring6整合Mybatis3.5

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: Spring是Java EE编程领域的一个轻量级开源框架,该框架由一个叫Rod Johnson的程序员在 2002 年最早提出并随后创建,是为了解决企业级编程开发中的复杂性,实现敏捷开发的应用型框架 。

Spring是Java EE编程领域的一个轻量级开源框架,该框架由一个叫Rod Johnson的程序员在 2002 年最早提出并随后创建,是为了解决企业级编程开发中的复杂性,实现敏捷开发的应用型框架 。Spring是一个开源容器框架,它集成各类型的工具,通过核心的Bean factory实现了底层的类的实例化和生命周期的管理。在整个框架中,各类型的功能被抽象成一个个的 Bean,这样就可以实现各种功能的管理,包括动态加载和切面编程。


Spring致力于提供一种方法管理你的业务对象。

Spring是全面的和模块化的。Spring有分层的体系结构,这意味着你能选择使用它孤立的任何部分,它的架构仍然是内在稳定的。例如,你可能选择仅仅使用Spring来简单化JDBC的使用,或用来管理所有的业务对象。

它的设计从底部帮助你编写易于测试的代码。Spring是用于测试驱动工程的理想的framework。

Spring对你的工程来说,它不需要一个以上的framework。Spring是潜在地一站式解决方案,定位于与典型应用相关的大部分基础结构。它也涉及到其他framework没有考虑到的内容。


MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录


简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件。易于学习,易于使用。通过文档和源代码,可以比较完全的掌握它的设计思路和实现。

灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。

解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。

提供映射标签,支持对象与数据库的ORM字段关系映射。

提供对象关系映射标签,支持对象关系组建维护。

提供xml标签,支持编写动态sql。


方式一

Object类


13.png

get和set,无参构造+有参构造



12.png

Pom.xml引入依赖


11.png

<!--    打包方式jar-->

<packaging>jar</packaging>

<!--配置多个仓库 -->

<repositories>

   <!-- Spring6 -->

   <repository>

       <id>repository.spring.milestone</id>

       <name>Spring Milestone Repository</name>

       <url>https://repo.spring.io/milestone</url>

   </repository>

</repositories>

<!-- 依赖-->

<dependencies>

   <!-- 引入Spring context依赖-->

   <dependency>

       <groupId>org.springframework</groupId>

       <artifactId>spring-context</artifactId>

       <version>6.0.0-M2</version>

   </dependency>

   <!--引入Spring-jdbc-->

   <dependency>

       <groupId>org.springframework</groupId>

       <artifactId>spring-jdbc</artifactId>

       <version>6.0.0-M2</version>

   </dependency>

   <!--引入mysql驱动-->

   <dependency>

       <groupId>mysql</groupId>

       <artifactId>mysql-connector-java</artifactId>

       <version>8.0.17</version>

   </dependency>

   <!--引入mybatis依赖-->

   <dependency>

       <groupId>org.mybatis</groupId>

       <artifactId>mybatis</artifactId>

       <version>3.5.11</version>

   </dependency>

   <!--引入mybatis-spring依赖-->

   <!--        -->

   <dependency>

       <groupId>org.mybatis</groupId>

       <artifactId>mybatis-spring</artifactId>

       <version>3.0.1</version>

   </dependency>

   <!-- 引入德鲁伊连接池-->

   <dependency>

       <groupId>com.alibaba</groupId>

       <artifactId>druid</artifactId>

       <version>1.2.15</version>

   </dependency>

   <!-- Spring框架对Junit支持的依赖-->

   <dependency>

       <groupId>org.springframework</groupId>

       <artifactId>spring-test</artifactId>

       <version>6.0.0-M2</version>

       <!--6.0.0-M2既支持junit4又支持junit5-->

   </dependency>

   <!--junit依赖-->

   <dependency>

       <groupId>org.junit.jupiter</groupId>

       <artifactId>junit-jupiter-api</artifactId>

       <version>5.8.2</version>

       <scope>test</scope>

   </dependency>

   <dependency>

       <groupId>org.example</groupId>

       <artifactId>review-annotation</artifactId>

       <version>1.0-SNAPSHOT</version>

       <scope>test</scope>

   </dependency>

   <!--   @Resource注解的依赖-->

   <dependency>

       <groupId>jakarta.annotation</groupId>

       <artifactId>jakarta.annotation-api</artifactId>

       <version>2.1.0</version>

   </dependency>

</dependencies>


Dao层

public interface TTTDao {

   //查询所有

   List<TTT11> selectAll();

   //插入

   int insert(TTT11 ttt11);

   //通过id删除

   int deleteById(int id);

   //更新

   int update(TTT11 ttt11);

}


myabtis-Mapper配置文件


10.png

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper

       PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

       "https://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.bank.dao.TTTDao">

   <select id="selectAll" resultType="com.bank.object.TTT11">

       select id,name,address from TTT11

   </select>

   <insert id="insert">

       insert into TTT11 values(#{id},#{name},#{address})

   </insert>

   <delete id="deleteById" >

       delete from TTT11 where id = #{id}

   </delete>

   <update id="update">

       update TTT11 set address =#{address} where id=#{id}

   </update>

</mapper>


编写jdbc.properties文件和Mybatis.xml核心配置文件

jdbc.properties


9.png


jdbc.driver=com.mysql.cj.jdbc.Driver

jdbc.url=jdbc:mysql://IP:3306/mysql?

jdbc.user= root

jdbc.password= 111111

Mybatis.xml主配置文件

8.png



<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE configuration

       PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

       "https://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

   <!--settings控制mybatis全局行为-->

   <settings>

       <!-- logImpl设置mybatis输出日志-->

       <setting name="logImpl" value="STDOUT_LOGGING"/>

   </settings>

</configuration>


Service接口和serviceimp


7.png

接口


public interface TTTService {

   int save(TTT11 ttt11);

   int delecyById(int id);

   List<TTT11> selectAll();

   int update(TTT11 ttt11);

}

Spring框架实现了控制反转IoC


Spring是一个实现了IoC思想的容器


控制反转的实现方式有多种,其中比较重要的:依赖注入(Dependency Injection,简称DI)


控制反转是思想。依赖注入是具体实现。


依赖注入DI,又包括常见的两种方式:set注入(执行set方法给属性赋值)、构造方式注入(执行构造方法给属性赋值)


依赖:A对象和B对象的关系。


注入:是一种手段,通过这种手段,可以让A对象和B对象产生关系


依赖注入:对象A和对象B之间的关系,靠注入的手段来维护。而注入包括:set注入和构造注入。


构造注入:核心原理通过调用构造方法来给属性赋值。


实现类


@Transactional

@Service("tTTService")

public class TTTServiceimpl implements TTTService {

   @Resource

   private TTTDao tttDao;

   @Override

   public int save(TTT11 ttt11) {

       return tttDao.insert(ttt11);

   }

   @Override

   public int delecyById(int id) {

       return tttDao.deleteById(id);

   }

   @Override

   public List<TTT11> selectAll() {

       return tttDao.selectAll();

   }

   @Override

   public int update(TTT11 ttt11) {

       return tttDao.update(ttt11);

   }

}


Spring.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/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd">

       <context:component-scan base-package="com.bank"></context:component-scan>

       <!--引入外部文件-->

       <context:property-placeholder location="jdbc.properties"/>

       <bean id="dateSource" class="com.alibaba.druid.pool.DruidDataSource">

               <property name="driverClassName" value="${jdbc.driver}"></property>

               <property name="url" value="${jdbc.url}"></property>

               <property name="username" value="${jdbc.user}"></property>

               <property name="password" value="${jdbc.password}"></property>

       </bean>

       <!--配置SqlSessionFactoryBean-->

       <bean class="org.mybatis.spring.SqlSessionFactoryBean">

       <!--注入数据源-->

               <property name="dataSource" ref="dateSource"/>

               <!--指定Mybatis-config.xml文件-->

               <property name="configLocation" value="mybatis-config.xml"/>

               <!--注入别名-->

               <property name="typeAliasesPackage" value="com.bank.object"/>

       </bean>

               <!--扫描mapper配置器-->

       <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

               <property name="basePackage" value="com.bank.dao"/>

       </bean>

               <!--事务管理器-->

       <bean id="TransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

               <property name="dataSource" ref="dateSource"/>

       </bean>

<!--        启动事务注解-->

       <tx:annotation-driven transaction-manager="TransactionManager"/>

</beans>


测试类


6.png

public class springMybatisTest {

   @Test

   public void sMybatisTest(){

       ApplicationContext applicationContext =new ClassPathXmlApplicationContext("SpringConfig.xml");

       TTTService tTTService = applicationContext.getBean("tTTService", TTTService.class);

       tTTService.selectAll();

   }

}

方式二


5.png

pom.xml配置

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"

        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

   <modelVersion>4.0.0</modelVersion>

   <groupId>org.example</groupId>

   <artifactId>spring6mybatis</artifactId>

   <version>1.0-SNAPSHOT</version>

   <properties>

       <maven.compiler.source>17</maven.compiler.source>

       <maven.compiler.target>17</maven.compiler.target>

       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

   </properties>

   <!--    打包方式jar-->

   <packaging>jar</packaging>

   <!--配置多个仓库 -->

   <repositories>

       <!-- Spring6 -->

       <repository>

           <id>repository.spring.milestone</id>

           <name>Spring Milestone Repository</name>

           <url>https://repo.spring.io/milestone</url>

       </repository>

   </repositories>

   <!-- 依赖-->

   <dependencies>

       <!-- 引入Spring context依赖-->

       <dependency>

           <groupId>org.springframework</groupId>

           <artifactId>spring-context</artifactId>

           <version>6.0.0-M2</version>

       </dependency>

       <!--引入Spring-jdbc-->

       <dependency>

           <groupId>org.springframework</groupId>

           <artifactId>spring-jdbc</artifactId>

           <version>6.0.0-M2</version>

       </dependency>

       <!--引入mysql驱动-->

       <dependency>

           <groupId>mysql</groupId>

           <artifactId>mysql-connector-java</artifactId>

           <version>8.0.17</version>

       </dependency>

       <!--引入mybatis依赖-->

       <dependency>

           <groupId>org.mybatis</groupId>

           <artifactId>mybatis</artifactId>

           <version>3.5.11</version>

       </dependency>

       <!--引入mybatis-spring依赖-->

       <!--        -->

       <dependency>

           <groupId>org.mybatis</groupId>

           <artifactId>mybatis-spring</artifactId>

           <version>3.0.1</version>

       </dependency>

       <!-- 引入德鲁伊连接池-->

       <dependency>

           <groupId>com.alibaba</groupId>

           <artifactId>druid</artifactId>

           <version>1.2.15</version>

       </dependency>

       <!-- Spring框架对Junit支持的依赖-->

       <dependency>

           <groupId>org.springframework</groupId>

           <artifactId>spring-test</artifactId>

           <version>6.0.0-M2</version>

           <!--6.0.0-M2既支持junit4又支持junit5-->

       </dependency>

       <!--junit依赖-->

       <dependency>

           <groupId>org.junit.jupiter</groupId>

           <artifactId>junit-jupiter-api</artifactId>

           <version>5.8.2</version>

           <scope>test</scope>

       </dependency>

   </dependencies>

   <build>

       <resources>

           <resource>

               <!--所在的目录-->

               <directory>src/main/java</directory>

               <includes>

                   <!--包括目录下的.properties .xml文件都会扫描到-->

                   <include>**/*.properties</include>

                   <include>**/*.xml</include>

               </includes>

               <filtering>false</filtering>

           </resource>

       </resources>

   </build>

</project>


实体类


4.png

get、set、toString、无参有参构造方法。


接口


3.png

public interface TTTDao {

   //查询所有

   List<TTT11> selectAll();

}

mapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper

       PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

       "https://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.dao.TTTDao">

   <select id="selectAll" resultType="com.object.TTT11">

       select id,name,address from TTT11

   </select>

   <insert id="insert">

       insert into TTT11 values(#{id},#{name},#{address})

   </insert>

   <delete id="deleteById" >

       delete from TTT11 where id = #{id}

   </delete>

   <update id="update">

       update TTT11 set address =#{address} where id=#{id}

   </update>

</mapper>


Service接口和实现类


2.png


public interface TTTService {

   List<TTT11> selectAll();

}

public class TTTServiceimpl implements TTTService {

   private TTTDao tttDao;

 

   public TTTServiceimpl(TTTDao tttDao) {

       this.tttDao = tttDao;

   }

   @Override

   public List<TTT11> selectAll() {

       return tttDao.selectAll();

   }

}

jdbc.properties

jdbc.driver=com.mysql.cj.jdbc.Driver

jdbc.url=jdbc:mysql://IP:3306/mysql

jdbc.user= root

jdbc.password= 111111

mybatis-config.xml主配置文件

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE configuration

       PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

       "https://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

   <settings>

       <!-- logImpl设置mybatis输出日志-->

       <setting name="logImpl" value="STDOUT_LOGGING"/>

   </settings>

   <mappers>

       <package name="com.dao"/>

   </mappers>

</configuration>


SpringConfig.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/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd">

<!--        组件扫描-->

       <context:component-scan base-package="com"></context:component-scan>

       <!--引入外部文件-->

       <context:property-placeholder location="jdbc.properties"/>

<!--        声明数据来源-->

       <bean id="dateSource" class="com.alibaba.druid.pool.DruidDataSource">

               <property name="driverClassName" value="${jdbc.driver}"></property>

               <property name="url" value="${jdbc.url}"></property>

               <property name="username" value="${jdbc.user}"></property>

               <property name="password" value="${jdbc.password}"></property>

       </bean>

       <!--配置SqlSessionFactoryBean-->

       <bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean">

               <!--注入数据源-->

               <property name="dataSource" ref="dateSource"/>

               <!--指定Mybatis-config.xml主配置文件-->

               <property name="configLocation" value="mybatis-config.xml"/>

               <!--注入别名-->

               <property name="typeAliasesPackage" value="com.object"/>

       </bean>

               <!--扫描mapper配置器 SqlSession.Mapper()-->

       <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

               <property name="sqlSessionFactoryBeanName" value="factory"></property>

               <property name="basePackage" value="com.dao"/>

       </bean>

       <bean id="tttServiceimpl" class="com.service.TTTServiceimpl">

               <!--构造注入-->

               <constructor-arg index="0" ref="TTTDao"></constructor-arg>

       </bean>

               <!--事务管理器-->

       <bean id="TransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

               <property name="dataSource" ref="dateSource"/>

       </bean>

<!--        启动事务注解-->

       <tx:annotation-driven transaction-manager="TransactionManager"/>

</beans>


测试类

public class smtest {

   @Test

   public void test(){

       ApplicationContext applicationContext =new ClassPathXmlApplicationContext("SpringConfig.xml");

       TTTService tttServiceimpl = applicationContext.getBean("tttServiceimpl", TTTService.class);

       tttServiceimpl.selectAll();

   }

}

1.png



如有错误请指正,谢谢

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
XML Java 测试技术
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
这篇文章介绍了Spring5框架的三个新特性:支持@Nullable注解以明确方法返回、参数和属性值可以为空;引入函数式风格的GenericApplicationContext进行对象注册和管理;以及如何整合JUnit5进行单元测试,同时讨论了JUnit4与JUnit5的整合方法,并提出了关于配置文件加载的疑问。
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
|
9天前
|
Java 数据库连接 数据库
spring复习05,spring整合mybatis,声明式事务
这篇文章详细介绍了如何在Spring框架中整合MyBatis以及如何配置声明式事务。主要内容包括:在Maven项目中添加依赖、创建实体类和Mapper接口、配置MyBatis核心配置文件和映射文件、配置数据源、创建sqlSessionFactory和sqlSessionTemplate、实现Mapper接口、配置声明式事务以及测试使用。此外,还解释了声明式事务的传播行为、隔离级别、只读提示和事务超时期间等概念。
spring复习05,spring整合mybatis,声明式事务
|
12天前
|
Java 数据库连接 数据库
SpringBoot 整合jdbc和mybatis
本文详细介绍了如何在SpringBoot项目中整合JDBC与MyBatis,并提供了具体的配置步骤和示例代码。首先,通过创建用户实体类和数据库表来准备基础环境;接着,配置Maven依赖、数据库连接及属性;最后,分别展示了JDBC与MyBatis的集成方法及其基本操作,包括增删查改等功能的实现。适合初学者快速入门。
SpringBoot 整合jdbc和mybatis
|
22天前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
9天前
|
XML Java 关系型数据库
springboot 集成 mybatis-plus 代码生成器
本文介绍了如何在Spring Boot项目中集成MyBatis-Plus代码生成器,包括导入相关依赖坐标、配置快速代码生成器以及自定义代码生成器模板的步骤和代码示例,旨在提高开发效率,快速生成Entity、Mapper、Mapper XML、Service、Controller等代码。
springboot 集成 mybatis-plus 代码生成器
|
9天前
|
SQL XML Java
springboot整合mybatis-plus及mybatis-plus分页插件的使用
这篇文章介绍了如何在Spring Boot项目中整合MyBatis-Plus及其分页插件,包括依赖引入、配置文件编写、SQL表创建、Mapper层、Service层、Controller层的创建,以及分页插件的使用和数据展示HTML页面的编写。
springboot整合mybatis-plus及mybatis-plus分页插件的使用
|
9天前
|
XML Java 数据库连接
springboot中整合mybatis及简单使用
这篇文章介绍了如何在Spring Boot项目中整合MyBatis,包括依赖引入、配置数据源、创建测试表、编写Mapper接口和XML文件、以及创建Service和Controller层的步骤。
springboot中整合mybatis及简单使用
|
23天前
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
|
2月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
27天前
|
前端开发 JavaScript Java
技术分享:使用Spring Boot3.3与MyBatis-Plus联合实现多层次树结构的异步加载策略
在现代Web开发中,处理多层次树形结构数据是一项常见且重要的任务。这些结构广泛应用于分类管理、组织结构、权限管理等场景。为了提升用户体验和系统性能,采用异步加载策略来动态加载树形结构的各个层级变得尤为重要。本文将详细介绍如何使用Spring Boot3.3与MyBatis-Plus联合实现这一功能。
57 2
下一篇
无影云桌面