zoukankan      html  css  js  c++  java
  • spring+redis+mysql做缓存操作 look

    spring+redis+mysql做缓存操作

    idea创建普通java项目

    在这里插入图片描述

    修改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>com.sxt</groupId>
      <artifactId>03redis-spring-mysql</artifactId>
      <version>1.0</version>
    
      <name>03redis-spring-mysql</name>
      <!-- FIXME change it to the project's website -->
      <url>http://www.example.com</url>
    
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
        <mybatis.version>3.5.2</mybatis.version>
        <mybatis-spring.version>2.0.2</mybatis-spring.version>
        <spring.version>4.3.24.RELEASE</spring.version>
        <druid.version>1.0.18</druid.version>
        <mysql.version>8.0.17</mysql.version>
        <fastjson.version>1.2.59</fastjson.version>
        <!-- 注意只能使用2.0以下的版本 -->
        <log4j.version>1.2.17</log4j.version>
        <jedis.version>3.1.0</jedis.version>
    <lombok.verison>1.18.10</lombok.verison>
    
      </properties>
    
      <dependencies>
        <!-- mybatis -->
        <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>${mybatis.version}</version>
        </dependency>
        <!-- mybatis-spring -->
        <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis-spring</artifactId>
          <version>${mybatis-spring.version}</version>
        </dependency>
        <!-- 导入spring -->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-aspects</artifactId>
          <version>${spring.version}</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-aop</artifactId>
          <version>${spring.version}</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context-support</artifactId>
          <version>${spring.version}</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>${spring.version}</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-core</artifactId>
          <version>${spring.version}</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-jdbc</artifactId>
          <version>${spring.version}</version>
        </dependency>
        <!-- mysql数据库驱动 -->
        <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>${mysql.version}</version>
        </dependency>
        <!-- json -->
        <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>fastjson</artifactId>
          <version>${fastjson.version}</version>
        </dependency>
        <!-- log4j -->
        <dependency>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
          <version>${log4j.version}</version>
        </dependency>
        <dependency>
          <groupId>redis.clients</groupId>
          <artifactId>jedis</artifactId>
          <version>${jedis.version}</version>
        </dependency>
    <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>${lombok.verison}</version>
      <scope>provided</scope>
    </dependency>
    
    
      </dependencies>
    
      <build>
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
          <plugins>
            <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
            <plugin>
              <artifactId>maven-clean-plugin</artifactId>
              <version>3.1.0</version>
            </plugin>
            <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
            <plugin>
              <artifactId>maven-resources-plugin</artifactId>
              <version>3.0.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>3.8.0</version>
            </plugin>
            <plugin>
              <artifactId>maven-surefire-plugin</artifactId>
              <version>2.22.1</version>
            </plugin>
            <plugin>
              <artifactId>maven-jar-plugin</artifactId>
              <version>3.0.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-install-plugin</artifactId>
              <version>2.5.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-deploy-plugin</artifactId>
              <version>2.8.2</version>
            </plugin>
            <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
            <plugin>
              <artifactId>maven-site-plugin</artifactId>
              <version>3.7.1</version>
            </plugin>
            <plugin>
              <artifactId>maven-project-info-reports-plugin</artifactId>
              <version>3.0.0</version>
            </plugin>
          </plugins>
        </pluginManagement>
      </build>
    </project>
    

    我这里用的是Mybatisgenerator插件

    生成User实体类

    import java.io.Serializable;
    import java.util.Date;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class User implements Serializable {
        /**
        * 用户编号
        */
        private Integer id;
    
        /**
        * 用户姓名
        */
        private String name;
    
        /**
        * 用户地址
        */
        private String address;
    
        /**
        * 出生时间
        */
        private Date birth;
    
        /**
        * 是否删除1删除0未删除
        */
        private Integer flag;
    
        private static final long serialVersionUID = 1L;
    }
    

    生成UserMapper

    import com.sxt.domain.User;
    
    import java.util.List;
    
    public interface UserMapper {
        int deleteByPrimaryKey(Integer id);
    
        int insert(User record);
    
        int insertSelective(User record);
    
        User selectByPrimaryKey(Integer id);
    
        int updateByPrimaryKeySelective(User record);
    
        int updateByPrimaryKey(User record);
    
        List<User> queryAllUser();
    }
    

    生成UserMapper.xml

    <?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.hgzy.mapper.UserMapper">
      <resultMap id="BaseResultMap" type="com.hgzy.domain.User">
        <!--@mbg.generated-->
        <!--@Table sys_user-->
        <id column="id" jdbcType="INTEGER" property="id" />
        <result column="name" jdbcType="VARCHAR" property="name" />
        <result column="address" jdbcType="VARCHAR" property="address" />
        <result column="birth" jdbcType="DATE" property="birth" />
        <result column="flag" jdbcType="INTEGER" property="flag" />
      </resultMap>
      <sql id="Base_Column_List">
        <!--@mbg.generated-->
        id, `name`, address, birth, flag
      </sql>
      <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
        <!--@mbg.generated-->
        select 
        <include refid="Base_Column_List" />
        from sys_user
        where id = #{id,jdbcType=INTEGER}
      </select>
      <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
        <!--@mbg.generated-->
        delete from sys_user
        where id = #{id,jdbcType=INTEGER}
      </delete>
      <insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.hgzy.domain.User" useGeneratedKeys="true">
        <!--@mbg.generated-->
        insert into sys_user (`name`, address, birth, 
          flag)
        values (#{name,jdbcType=VARCHAR}, #{address,jdbcType=VARCHAR}, #{birth,jdbcType=DATE}, 
          #{flag,jdbcType=INTEGER})
      </insert>
      <insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="com.hgzy.domain.User" useGeneratedKeys="true">
        <!--@mbg.generated-->
        insert into sys_user
        <trim prefix="(" suffix=")" suffixOverrides=",">
          <if test="name != null">
            `name`,
          </if>
          <if test="address != null">
            address,
          </if>
          <if test="birth != null">
            birth,
          </if>
          <if test="flag != null">
            flag,
          </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
          <if test="name != null">
            #{name,jdbcType=VARCHAR},
          </if>
          <if test="address != null">
            #{address,jdbcType=VARCHAR},
          </if>
          <if test="birth != null">
            #{birth,jdbcType=DATE},
          </if>
          <if test="flag != null">
            #{flag,jdbcType=INTEGER},
          </if>
        </trim>
      </insert>
      <update id="updateByPrimaryKeySelective" parameterType="com.hgzy.domain.User">
        <!--@mbg.generated-->
        update sys_user
        <set>
          <if test="name != null">
            `name` = #{name,jdbcType=VARCHAR},
          </if>
          <if test="address != null">
            address = #{address,jdbcType=VARCHAR},
          </if>
          <if test="birth != null">
            birth = #{birth,jdbcType=DATE},
          </if>
          <if test="flag != null">
            flag = #{flag,jdbcType=INTEGER},
          </if>
        </set>
        where id = #{id,jdbcType=INTEGER}
      </update>
      <update id="updateByPrimaryKey" parameterType="com.hgzy.domain.User">
        <!--@mbg.generated-->
        update sys_user
        set `name` = #{name,jdbcType=VARCHAR},
          address = #{address,jdbcType=VARCHAR},
          birth = #{birth,jdbcType=DATE},
          flag = #{flag,jdbcType=INTEGER}
        where id = #{id,jdbcType=INTEGER}
      </update>
    
      <select id="queryAllUser" resultMap="BaseResultMap">
        <!--@mbg.generated-->
        select
        <include refid="Base_Column_List" />
        from sys_user
    
        </select>
    </mapper>
    

    生成UserService

    
    import com.sxt.domain.User;
    
    import java.util.List;
    
    public interface UserService{
    
    
        int deleteByPrimaryKey(Integer id);
    
        User insert(User user);
    
    
        User selectByPrimaryKey(Integer id);
    
    
        User updateByPrimaryKey(User user);
    
        List<User> queryAllUser();
    
    }
    
    

    生成UserServiceImpl

    
    import com.sxt.domain.User;
    import com.sxt.mapper.UserMapper;
    import com.sxt.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    @Service
    public class UserServiceImpl implements UserService{
    
        @Autowired
        private UserMapper userMapper;
    
    
        @Override
        public int deleteByPrimaryKey(Integer id) {
            return this.userMapper.deleteByPrimaryKey(id);
        }
    
        @Override
        public User insert(User user) {
            this.userMapper.insert(user);
            return user;
        }
    
        @Override
        public User selectByPrimaryKey(Integer id) {
            return this.userMapper.selectByPrimaryKey(id);
        }
    
        @Override
        public User updateByPrimaryKey(User user) {
            int index = this.userMapper.updateByPrimaryKey(user);
            return user;
        }
    
        @Override
        public List<User> queryAllUser() {
            return this.userMapper.queryAllUser();
        }
    }
    

    创建application-redis.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">
    
        <!--声明配置-->
        <bean id="poolConfig" class="org.apache.commons.pool2.impl.GenericObjectPoolConfig">
            <property name="maxTotal" value="100"></property>
            <property name="maxIdle" value="80"></property>
            <property name="minIdle" value="20"></property>
            <property name="maxWaitMillis" value="2000"></property>
            <property name="testOnBorrow" value="true"></property>
        </bean>
        <!--jedispool-->
        <bean id="jedisPool" class="redis.clients.jedis.JedisPool">
            <!--因为JedisPool没有属性  所以只能使用构造器的注入方式-->
            <constructor-arg name="poolConfig" ref="poolConfig"/>
            <constructor-arg name="host" value="ip地址"/>
            <constructor-arg name="port" value="7001"/>
            <constructor-arg name="timeout" value="2000"/>
            <constructor-arg name="password" value="317311"/>
        </bean>
    </beans>
    

    创建db.properties

    driverClassName=com.mysql.cj.jdbc.Driver
    url=jdbc:mysql://127.0.0.1:3306/redis-test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    username=root
    password=317311
    

    创建log4j的配置文件

    # Global logging configuration
    log4j.rootLogger=DEBUG, stdout
    # MyBatis logging configuration...
    log4j.logger.org.mybatis.example.BlogMapper=TRACE
    # Console output...
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
    

    创建application-dao.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:aop="http://www.springframework.org/schema/aop"
           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/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    
        <!-- 引入db.properties -->
        <context:property-placeholder
                location="classpath*:db.properties" system-properties-mode="FALLBACK" />
    
        <!-- 声明dataSource -->
        <bean id="dataSource"
              class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <!-- 注入连接属性 -->
            <property name="driverClassName" value="${driverClassName}"></property>
            <property name="url" value="${url}"></property>
            <property name="username" value="${username}"></property>
            <property name="password" value="${password}"></property>
        </bean>
        <!-- 声明sessionFactory 并注入mybatis.cfg.xml -->
        <bean id="sqlSessionFactory"
              class="org.mybatis.spring.SqlSessionFactoryBean">
            <!-- 注入数据源 -->
            <property name="dataSource" ref="dataSource"></property>
            <!-- 注入mapper.xml -->
            <property name="mapperLocations">
                <array>
                    <value>classpath:mapper/*Mapper.xml</value>
                </array>
            </property>
        </bean>
    
        <!-- 扫描mapper接口 -->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <!-- 注入mapper接口所在的包 注意多个包的情况的配置 -->
            <property name="basePackage">
                <value>
                    com.sxt.mapper
                </value>
            </property>
            <!-- 注入sqlSessionFactory -->
            <property name="sqlSessionFactoryBeanName"
                      value="sqlSessionFactory"></property>
        </bean>
    </beans>
    

    创建application-service.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:aop="http://www.springframework.org/schema/aop"
           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/aop http://www.springframework.org/schema/aop/spring-aop.xsd
    		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    
        <context:component-scan base-package="com.sxt.service.impl"></context:component-scan>
    
        <!-- 1,声明事务管理器 -->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"></property>
        </bean>
        <!-- 启动注解事务 -->
        <!-- <tx:annotation-driven/> -->
        <!-- 2,声明事务的传播特性 也就是通知 -->
        <tx:advice id="advise" transaction-manager="transactionManager">
            <tx:attributes>
                <!-- 以add开头的方法名需要事务 -->
                <tx:method name="add*" propagation="REQUIRED"/>
                <tx:method name="insert*" propagation="REQUIRED"/>
                <tx:method name="save*" propagation="REQUIRED"/>
                <tx:method name="update*" propagation="REQUIRED"/>
                <tx:method name="delete*" propagation="REQUIRED"/>
                <tx:method name="change*" propagation="REQUIRED"/>
                <tx:method name="reset*" propagation="REQUIRED"/>
                <tx:method name="get*" read-only="true"/>
                <tx:method name="load*" read-only="true"/>
                <tx:method name="*" read-only="true"/>
            </tx:attributes>
        </tx:advice>
        <!-- 3进行AOP织入 -->
        <aop:config>
            <!-- 声明切面 -->
            <aop:pointcut expression="execution(* com.sxt.service.impl.*.*(..))" id="pc"/>
            <!-- 织入 -->
            <aop:advisor advice-ref="advise" pointcut-ref="pc"/>
        </aop:config>
    </beans>
    

    创建CacheUserAspect(切面)

    package com.sxt.cache;
    
    import com.alibaba.fastjson.JSON;
    import com.sxt.domain.User;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.EnableAspectJAutoProxy;
    import org.springframework.stereotype.Component;
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPool;
    
    import java.io.Serializable;
    
    /**
     * @program: redis-code
     * @author: 雷哥
     * @create: 2019-12-31 16:39
     **/
    @Component
    @Aspect
    @EnableAspectJAutoProxy
    public class CacheUserAspect {
    
    
        private Log log= LogFactory.getLog(CacheUserAspect.class);
    
        public static final String POINTCUT_ADD="execution(* com.sxt.service.impl.UserServiceImpl.insert(..))";
        public static final String POINTCUT_UPDATE="execution(* com.sxt.service.impl.UserServiceImpl.updateByPrimaryKey(..))";
        public static final String POINTCUT_DELETE="execution(* com.sxt.service.impl.UserServiceImpl.deleteByPrimaryKey(..))";
        public static final String POINTCUT_GETONE="execution(* com.sxt.service.impl.UserServiceImpl.selectByPrimaryKey(..))";
    
        //redis里面的前缀
        public static final String PROFIX="user:";
    
        //注入JedisPool
        @Autowired
        private JedisPool jedisPool;
    
    
    
        @Around(value = CacheUserAspect.POINTCUT_ADD)
        public Object cacheAddUser(ProceedingJoinPoint pjp) throws Throwable {
            //插入数据库
            User user = (User) pjp.proceed();
            Jedis jedis = jedisPool.getResource();
    
            //把user转成json串
            String json= JSON.toJSONString(user);
            jedis.set(PROFIX+user.getId(),json);
            log.info(PROFIX+user.getId()+"数据已存入到Redis");
            jedis.close();
            return user;
        }
    
        @Around(value = CacheUserAspect.POINTCUT_UPDATE)
        public Object cacheUpdateUser(ProceedingJoinPoint pjp) throws Throwable {
            //修改数据库
            User user = (User) pjp.proceed();
            Jedis jedis = jedisPool.getResource();
            //把user转成json串
            String json= JSON.toJSONString(user);
            jedis.set(PROFIX+user.getId(),json);
            log.info(PROFIX+user.getId()+"数据已更新到Redis");
            jedis.close();
            return user;
        }
    
        @Around(value = CacheUserAspect.POINTCUT_DELETE)
        public Object cacheDeleteUser(ProceedingJoinPoint pjp) throws Throwable {
            //删除数据库
            Serializable id = (Serializable) pjp.getArgs()[0];
            log.info(PROFIX+id+"数据库数据已删除");
            Jedis jedis = jedisPool.getResource();
            if(jedis.exists(PROFIX+id)){
                jedis.del(PROFIX+id);
                log.info(PROFIX+id+"数据已从Redis删除");
            }
            jedis.close();
            return id;
        }
    
        @Around(value = CacheUserAspect.POINTCUT_GETONE)
        public Object cacheGetOneUser(ProceedingJoinPoint pjp) throws Throwable {
            Serializable id = (Serializable) pjp.getArgs()[0];
            if(null==id){
                return null;
            }
            Jedis jedis = jedisPool.getResource();
            String json = jedis.get(PROFIX + id);
            if(null!=json){
                User user=JSON.parseObject(json,User.class);
                log.info(PROFIX+id+"已从redis里机查询到数据");
                jedis.close();
                return user;
            }else{
                log.info(PROFIX+id+"缓存里面没有数据,要从数据库里面查询");
                User user= (User) pjp.proceed();
                if(null!=user){
                    jedis.set(PROFIX+user.getId(),JSON.toJSONString(user));
                    log.info(PROFIX+id+"数据已存入redis");
                }
                jedis.close();
                return  user;
            }
        }
    }
    

    创建application-cache.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"
           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">
    
        <context:component-scan base-package="com.sxt.cache"></context:component-scan>
    
    </beans>
    

    创建applicationContext.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">
    
    
        <import resource="classpath*:application-dao.xml"></import>
        <import resource="classpath*:application-service.xml"></import>
        <import resource="classpath*:application-redis.xml"></import>
        <import resource="classpath*:application-cache.xml"></import>
    </beans>
    

    测试

    public class TestApp {
    
        public static void main(String[] args) {
            ApplicationContext context=new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
    
            UserService userService = context.getBean(UserService.class);
    
            User user=new User();
            user.setName("张三");
            user.setAddress("株洲");
            user.setBirth(new Date());
            user.setFlag(1);
            userService.insert(user);
            System.out.println("成功");
        }
    }
    
  • 相关阅读:
    4.5计算机网络笔记
    3.29计算机网络笔记
    3.22计算机网络笔记
    3.15计算机网络笔记
    用int类型表示最大公倍数
    markdown入门
    learning by doing
    技术博客(初用markdown)。
    物联网PPT智能家居王思齐和陈由钧第10组
    第六次java作业
  • 原文地址:https://www.cnblogs.com/look-word/p/15785735.html
Copyright © 2011-2022 走看看