• mybatis整合spring


    Mybatis与spring集成

    1、导入pom依赖

    1.1 添加spring相关依赖(5.0.2.RELEASE)

           spring-core

           spring-beans

           spring-context

           spring-orm

           spring-tx

           spring-aspects

           spring-web

     

       1.2 添加mybatis相关依赖

           mybatis核心:mybatis(3.4.5)

           Mybatis分页:pagehelper(5.1.2)

     

       1.3 spring整合mybatis(1.3.1)

           mybatis-spring

     

       1.4 添加dbcp2连接池

           commons-dbcp2(2.1.1)

           commons-pool2(2.4.3)

     

       1.5 添加日志配置(2.9.1)

           log4j-core

           log4j-api

           log4j-web

     

       1.6 其他

           junit(4.12)

           javax.servlet-api(4.0.0)

           lombok(1.18.2)

     

       注:使用mybatis-generator插件,pom文件添加支持 

    pom.xml依赖

      1 <?xml version="1.0" encoding="UTF-8"?>
      2 
      3 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      4   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      5   <modelVersion>4.0.0</modelVersion>
      6 
      7   <groupId>com.yuan</groupId>
      8   <artifactId>ssm</artifactId>
      9   <version>1.0-SNAPSHOT</version>
     10   <packaging>war</packaging>
     11 
     12   <name>ssm Maven Webapp</name>
     13   <!-- FIXME change it to the project's website -->
     14   <url>http://www.example.com</url>
     15 
     16   <properties>
     17     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     18     <maven.compiler.source>1.8</maven.compiler.source>
     19     <maven.compiler.target>1.8</maven.compiler.target>
     20     <maven.compiler.plugin.version>3.7.0</maven.compiler.plugin.version>
     21 
     22     <!--添加jar包依赖-->
     23     <!--1.spring 5.0.2.RELEASE相关-->
     24     <spring.version>5.0.2.RELEASE</spring.version>
     25     <!--2.mybatis相关-->
     26     <mybatis.version>3.4.5</mybatis.version>
     27     <!--mysql-->
     28     <mysql.version>5.1.44</mysql.version>
     29     <!--pagehelper分页jar依赖-->
     30     <pagehelper.version>5.1.2</pagehelper.version>
     31     <!--mybatis与spring集成jar依赖-->
     32     <mybatis.spring.version>1.3.1</mybatis.spring.version>
     33     <!--3.dbcp2连接池相关 druid-->
     34     <commons.dbcp2.version>2.1.1</commons.dbcp2.version>
     35     <commons.pool2.version>2.4.3</commons.pool2.version>
     36     <!--4.log日志相关-->
     37     <log4j2.version>2.9.1</log4j2.version>
     38     <!--5.其他-->
     39     <junit.version>4.12</junit.version>
     40     <servlet.version>4.0.0</servlet.version>
     41     <lombok.version>1.18.2</lombok.version>
     42   </properties>
     43 
     44 
     45   <dependencies>
     46     <!--1.spring相关-->
     47     <dependency>
     48       <groupId>org.springframework</groupId>
     49       <artifactId>spring-context</artifactId>
     50       <version>${spring.version}</version>
     51     </dependency>
     52     <dependency>
     53       <groupId>org.springframework</groupId>
     54       <artifactId>spring-orm</artifactId>
     55       <version>${spring.version}</version>
     56     </dependency>
     57     <dependency>
     58       <groupId>org.springframework</groupId>
     59       <artifactId>spring-tx</artifactId>
     60       <version>${spring.version}</version>
     61     </dependency>
     62     <dependency>
     63       <groupId>org.springframework</groupId>
     64       <artifactId>spring-aspects</artifactId>
     65       <version>${spring.version}</version>
     66     </dependency>
     67     <dependency>
     68       <groupId>org.springframework</groupId>
     69       <artifactId>spring-web</artifactId>
     70       <version>${spring.version}</version>
     71     </dependency>
     72     <dependency>
     73       <groupId>org.springframework</groupId>
     74       <artifactId>spring-test</artifactId>
     75       <version>${spring.version}</version>
     76     </dependency>
     77     <!--2.mybatis相关-->
     78     <dependency>
     79       <groupId>org.mybatis</groupId>
     80       <artifactId>mybatis</artifactId>
     81       <version>${mybatis.version}</version>
     82     </dependency>
     83     <!--mysql-->
     84     <dependency>
     85       <groupId>mysql</groupId>
     86       <artifactId>mysql-connector-java</artifactId>
     87       <version>${mysql.version}</version>
     88     </dependency>
     89     <!--pagehelper分页插件jar包依赖-->
     90     <dependency>
     91       <groupId>com.github.pagehelper</groupId>
     92       <artifactId>pagehelper</artifactId>
     93       <version>${pagehelper.version}</version>
     94     </dependency>
     95     <!--mybatis与spring集成jar包依赖-->
     96     <dependency>
     97       <groupId>org.mybatis</groupId>
     98       <artifactId>mybatis-spring</artifactId>
     99       <version>${mybatis.spring.version}</version>
    100     </dependency>
    101     <!--3.dbcp2连接池相关-->
    102     <dependency>
    103       <groupId>org.apache.commons</groupId>
    104       <artifactId>commons-dbcp2</artifactId>
    105       <version>${commons.dbcp2.version}</version>
    106     </dependency>
    107     <dependency>
    108       <groupId>org.apache.commons</groupId>
    109       <artifactId>commons-pool2</artifactId>
    110       <version>${commons.pool2.version}</version>
    111     </dependency>
    112     <!--4.log日志相关依赖-->
    113     <!--核心log4j2jar包-->
    114     <dependency>
    115       <groupId>org.apache.logging.log4j</groupId>
    116       <artifactId>log4j-core</artifactId>
    117       <version>${log4j2.version}</version>
    118     </dependency>
    119     <dependency>
    120       <groupId>org.apache.logging.log4j</groupId>
    121       <artifactId>log4j-api</artifactId>
    122       <version>${log4j2.version}</version>
    123     </dependency>
    124     <!--web工程需要包含log4j-web,非web工程不需要-->
    125     <dependency>
    126       <groupId>org.apache.logging.log4j</groupId>
    127       <artifactId>log4j-web</artifactId>
    128       <version>${log4j2.version}</version>
    129     </dependency>
    130     <!--5.其他-->
    131     <dependency>
    132       <groupId>junit</groupId>
    133       <artifactId>junit</artifactId>
    134       <version>${junit.version}</version>
    135       <scope>test</scope>
    136     </dependency>
    137     <dependency>
    138       <groupId>javax.servlet</groupId>
    139       <artifactId>javax.servlet-api</artifactId>
    140       <version>${servlet.version}</version>
    141       <scope>provided</scope>
    142     </dependency>
    143     <dependency>
    144       <groupId>org.projectlombok</groupId>
    145       <artifactId>lombok</artifactId>
    146       <version>${lombok.version}</version>
    147       <scope>provided</scope>
    148     </dependency>
    149 
    150 
    151 
    152 
    153 
    154 
    155   </dependencies>
    156 
    157   <build>
    158     <finalName>ssm</finalName>
    159     <resources>
    160       <!--解决mybatis-generator-maven-plugin运行时没有将XxxMapper.xml文件放入target文件夹的问题-->
    161       <resource>
    162         <directory>src/main/java</directory>
    163         <includes>
    164           <include>**/*.xml</include>
    165         </includes>
    166       </resource>
    167       <!--解决mybatis-generator-maven-plugin运行时没有将jdbc.properites文件放入target文件夹的问题-->
    168       <resource>
    169         <directory>src/main/resources</directory>
    170         <includes>
    171           <include>jdbc.properties</include>
    172           <include>*.xml</include>
    173         </includes>
    174       </resource>
    175     </resources>
    176 
    177 
    178     <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
    179       <plugins>
    180         <plugin>
    181           <groupId>org.apache.maven.plugins</groupId>
    182           <artifactId>maven-compiler-plugin</artifactId>
    183           <version>${maven.compiler.plugin.version}</version>
    184           <configuration>
    185             <source>${maven.compiler.source}</source>
    186             <target>${maven.compiler.target}</target>
    187             <encoding>${project.build.sourceEncoding}</encoding>
    188           </configuration>
    189         </plugin>
    190         <plugin>
    191           <groupId>org.mybatis.generator</groupId>
    192           <artifactId>mybatis-generator-maven-plugin</artifactId>
    193           <version>1.3.2</version>
    194           <dependencies>
    195             <!--使用Mybatis-generator插件不能使用太高版本的mysql驱动 -->
    196             <dependency>
    197               <groupId>mysql</groupId>
    198               <artifactId>mysql-connector-java</artifactId>
    199               <version>${mysql.version}</version>
    200             </dependency>
    201           </dependencies>
    202           <configuration>
    203             <overwrite>true</overwrite>
    204           </configuration>
    205         </plugin>
    206 
    207 
    208         <plugin>
    209           <artifactId>maven-clean-plugin</artifactId>
    210           <version>3.1.0</version>
    211         </plugin>
    212         <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
    213         <plugin>
    214           <artifactId>maven-resources-plugin</artifactId>
    215           <version>3.0.2</version>
    216         </plugin>
    217         <plugin>
    218           <artifactId>maven-compiler-plugin</artifactId>
    219           <version>3.8.0</version>
    220         </plugin>
    221         <plugin>
    222           <artifactId>maven-surefire-plugin</artifactId>
    223           <version>2.22.1</version>
    224         </plugin>
    225         <plugin>
    226           <artifactId>maven-war-plugin</artifactId>
    227           <version>3.2.2</version>
    228         </plugin>
    229         <plugin>
    230           <artifactId>maven-install-plugin</artifactId>
    231           <version>2.5.2</version>
    232         </plugin>
    233         <plugin>
    234           <artifactId>maven-deploy-plugin</artifactId>
    235           <version>2.8.2</version>
    236         </plugin>
    237       </plugins>
    238     </pluginManagement>
    239   </build>
    240 </project>

    2、利用mybatis逆向工程生成模型层层代码

    3、编写配置文件 applicationContext-mybatis.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4        xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
     5        xmlns:aop="http://www.springframework.org/schema/aop"
     6        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 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
     7 
     8 
     9     <!--1. 注解式开发 -->
    10     <!-- 注解驱动 -->
    11     <context:annotation-config/>
    12     <!-- 用注解方式注入bean,并指定查找范围:com.yuan.ssm及子子孙孙包-->
    13     <context:component-scan base-package="com.yuan"/>
    14 
    15     <context:property-placeholder location="classpath:jdbc.properties"/>
    16 
    17     <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
    18           destroy-method="close">
    19         <property name="driverClassName" value="${jdbc.driver}"/>
    20         <property name="url" value="${jdbc.url}"/>
    21         <property name="username" value="${jdbc.username}"/>
    22         <property name="password" value="${jdbc.password}"/>
    23         <!--初始连接数-->
    24         <property name="initialSize" value="10"/>
    25         <!--最大活动连接数-->
    26         <property name="maxTotal" value="100"/>
    27         <!--最大空闲连接数-->
    28         <property name="maxIdle" value="50"/>
    29         <!--最小空闲连接数-->
    30         <property name="minIdle" value="10"/>
    31         <!--设置为-1时,如果没有可用连接,连接池会一直无限期等待,直到获取到连接为止。-->
    32         <!--如果设置为N(毫秒),则连接池会等待N毫秒,等待不到,则抛出异常-->
    33         <property name="maxWaitMillis" value="-1"/>
    34     </bean>
    35 
    36     <!--4. spring和MyBatis整合 -->
    37     <!--1) 创建sqlSessionFactory-->
    38     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    39         <!-- 指定数据源 -->
    40         <property name="dataSource" ref="dataSource"/>
    41         <!-- 自动扫描XxxMapping.xml文件,**任意路径 -->
    42         <property name="mapperLocations" value="classpath*:com/yuan/**/mapper/*.xml"/>
    43         <!-- 指定别名 -->
    44         <property name="typeAliasesPackage" value="com/yuan/**/model"/>
    45         <!--配置pagehelper插件-->
    46         <property name="plugins">
    47             <array>
    48                 <bean class="com.github.pagehelper.PageInterceptor">
    49                     <property name="properties">
    50                         <value>
    51                             helperDialect=mysql
    52                         </value>
    53                     </property>
    54                 </bean>
    55             </array>
    56         </property>
    57     </bean>
    58 
    59     <!--2) 自动扫描com/yuan/ssm/**/mapper下的所有XxxMapper接口(其实就是DAO接口),并实现这些接口,-->
    60     <!--   即可直接在程序中使用dao接口,不用再获取sqlsession对象-->
    61     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    62         <!--basePackage 属性是映射器接口文件的包路径。-->
    63         <!--你可以使用分号或逗号 作为分隔符设置多于一个的包路径-->
    64         <property name="basePackage" value="com/yuan/**/mapper"/>
    65         <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    66     </bean>
    67 
    68     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    69         <property name="dataSource" ref="dataSource" />
    70     </bean>
    71     <tx:annotation-driven transaction-manager="transactionManager" />
    72     <aop:aspectj-autoproxy/>
    73 
    74 
    75 </beans>

    编写配置文件applicationContext.xml

    1 <?xml version="1.0" encoding="UTF-8"?>
    2 <beans xmlns="http://www.springframework.org/schema/beans"
    3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    5 
    6     <!--整合mybatis框架-->
    7     <import resource="applicationContext-mybatis.xml"></import>
    8 </beans>

    Spring Test+junit完美组合

    在工程中的pom文件增加spring-test的依赖

     <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-test</artifactId>
           <version>${spring.version}</version>
         </dependency>

    创建SpringBaseTest,并加上以下两个注解

     1 package com.yuan;
     2 
     3 import com.yuan.model.Book;
     4 import com.yuan.util.PageBean;
     5 import org.junit.Before;
     6 import org.junit.runner.RunWith;
     7 import org.springframework.test.context.ContextConfiguration;
     8 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
     9 
    10 @RunWith(SpringJUnit4ClassRunner.class)
    11 @ContextConfiguration(locations={"classpath:applicationContext.xml"})
    12 public class SpringBaseTest {
    13 
    14     protected Book book;
    15     protected PageBean pageBean;
    16 
    17     @Before
    18     public void init(){
    19         book = new Book();
    20         pageBean = new PageBean();
    21     }
    22 
    23 }

    相关层Service代码

    BookService.java

     1 package com.yuan.service;
     2 
     3 import com.yuan.model.Book;
     4 import com.yuan.util.PageBean;
     5 import org.springframework.stereotype.Service;
     6 
     7 import java.util.List;
     8 
     9 
    10 public interface BookService {
    11 
    12     int deleteByPrimaryKey(Integer bid);
    13 
    14     int insert(Book record);
    15 
    16     int insertSelective(Book record);
    17 
    18     Book selectByPrimaryKey(Integer bid);
    19 
    20     int updateByPrimaryKeySelective(Book record);
    21 
    22     int updateByPrimaryKey(Book record);
    23 
    24     List<Book> listPager(Book book, PageBean pageBean);
    25 }

    BookServiceImpl.java

     1 package com.yuan.service.impl;
     2 
     3 import com.yuan.mapper.BookMapper;
     4 import com.yuan.model.Book;
     5 import com.yuan.service.BookService;
     6 import com.yuan.util.PageBean;
     7 import org.springframework.beans.factory.annotation.Autowired;
     8 import org.springframework.stereotype.Service;
     9 
    10 import java.util.List;
    11 
    12 @Service
    13 public class BookServiceImpl implements BookService {
    14     @Autowired
    15     private BookMapper bookMapper;
    16 
    17     @Override
    18     public int deleteByPrimaryKey(Integer bid) {
    19         return bookMapper.deleteByPrimaryKey(bid);
    20     }
    21 
    22     @Override
    23     public int insert(Book record) {
    24         return bookMapper.insert(record);
    25     }
    26 
    27     @Override
    28     public int insertSelective(Book record) {
    29         return bookMapper.insertSelective(record);
    30     }
    31 
    32     @Override
    33     public Book selectByPrimaryKey(Integer bid) {
    34         return bookMapper.selectByPrimaryKey(bid);
    35     }
    36 
    37     @Override
    38     public int updateByPrimaryKeySelective(Book record) {
    39         return bookMapper.updateByPrimaryKeySelective(record);
    40     }
    41 
    42     @Override
    43     public int updateByPrimaryKey(Book record) {
    44         return bookMapper.updateByPrimaryKey(record);
    45     }
    46 
    47     @Override
    48     public List<Book> listPager(Book book, PageBean pageBean) {
    49         return bookMapper.listPager(book);
    50     }
    51 }

    测试层BookServiceImplTest.java

     1 package com.yuan.service.impl;
     2 
     3 import com.yuan.SpringBaseTest;
     4 import com.yuan.model.Book;
     5 import com.yuan.service.BookService;
     6 import com.yuan.util.PageBean;
     7 import com.yuan.util.StringUtil;
     8 import org.junit.Test;
     9 import org.junit.runner.RunWith;
    10 import org.springframework.beans.factory.annotation.Autowired;
    11 
    12 import java.util.List;
    13 
    14 import static org.junit.Assert.*;
    15 
    16 public class BookServiceImplTest extends SpringBaseTest {
    17 
    18     @Autowired
    19     private BookService bookService;
    20 
    21     /**
    22      * 新增
    23      */
    24     @Test
    25     public void insert() {
    26         book.setBid(2);
    27         book.setBname("T226 ssm");
    28         book.setPrice(996f);
    29         this.bookService.insert(book);
    30 
    31     }
    32 
    33     /**
    34      * 查询
    35      */
    36     @Test
    37     public void selectByPrimaryKey() {
    38         Book book = this.bookService.selectByPrimaryKey(2);
    39         System.out.println(book);
    40     }
    41 
    42     /**
    43      * 删除
    44      */
    45     @Test
    46     public void deleteByPrimaryKey() {
    47         bookService.deleteByPrimaryKey(2);
    48     }
    49 
    50     /**
    51      * 分页优化
    52      */
    53     @Test
    54     public void listPager() {
    55         Book book = new Book();
    56         //带条件分页查询
    57         book.setBname(StringUtil.toLikeStr("圣墟"));
    58         PageBean pageBean = new PageBean();
    59         //不分页
    60 //        pageBean.setPagination(false);
    61         //根据页码分页查询
    62         pageBean.setPage(2);
    63         List<Book> books = bookService.listPager(book, pageBean);
    64         for (Book b : books) {
    65             System.out.println(b);
    66         }
    67     }
    68 
    69 }

    插入成功

    查询结果

    删除结果

    Aop整合pagehelper插件

    注意:记得开动态代理

     

    使用AOP编程解决分页代码重复的问题

       @Around("execution(* *..*Service.*pager(..))")

       public Object invoke(ProceedingJoinPoint args)

     

    语法结构:execution(方法修饰符  方法返回值  方法所属类 匹配方法名 (  方法中的形参表 )  方法申明抛出的异常  )

    "*"  :代表一个任意类型的参数;

    ..”:代表零个或多个任意类型的参数。

    案例:

    PageAspect.java

     1 package com.yuan.component;
     2 
     3 import com.github.pagehelper.PageHelper;
     4 import com.github.pagehelper.PageInfo;
     5 import com.yuan.util.PageBean;
     6 import org.aspectj.lang.ProceedingJoinPoint;
     7 import org.aspectj.lang.annotation.Around;
     8 import org.aspectj.lang.annotation.Aspect;
     9 import org.springframework.stereotype.Component;
    10 
    11 import java.util.List;
    12 
    13 @Component
    14 @Aspect
    15 public class PagerAspect {
    16 
    17     @Around("execution(* *..*Service.*Pager(..))")
    18     public Object invoke(ProceedingJoinPoint args)throws Throwable{
    19         //符合*..*Service.*Pager(..)规则的方法,调用时所携带的参数
    20         Object[] params = args.getArgs();
    21         PageBean pageBean = null;
    22         for (Object param : params) {
    23             if(param instanceof  PageBean){
    24                 pageBean = (PageBean)param;
    25                 break;
    26             }
    27         }
    28 
    29         if(pageBean!=null && pageBean.isPagination()){
    30             PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
    31         }
    32 
    33         Object list = args.proceed(params);
    34         if(pageBean!=null && pageBean.isPagination()){
    35             PageInfo pageInfo = new PageInfo((List) list);
    36             pageBean.setTotal(pageInfo.getTotal()+"");
    37         }
    38 
    39         return  list;
    40     }
    41 
    42 
    43 }

    Bookmapper.java

     1 package com.yuan.mapper;
     2 
     3 import com.yuan.model.Book;
     4 import org.springframework.stereotype.Repository;
     5 
     6 import java.util.List;
     7 
     8 @Repository
     9 public interface BookMapper {
    10     int deleteByPrimaryKey(Integer bid);
    11 
    12     int insert(Book record);
    13 
    14     int insertSelective(Book record);
    15 
    16     Book selectByPrimaryKey(Integer bid);
    17 
    18     int updateByPrimaryKeySelective(Book record);
    19 
    20     int updateByPrimaryKey(Book record);
    21 
    22     List<Book> listPager(Book book);
    23 
    24 }

    BookMapper.xml

     <select id="listPager" resultType="com.yuan.model.Book" parameterType="com.yuan.model.Book">
            select
            <include refid="Base_Column_List"/>
            from t_mvc_book
            <where>
                <if test="bname != null and bname !=''">
                    bname like #{bname}
                </if>
            </where>
        </select>

    service层

     1 package com.yuan.service;
     2 
     3 import com.yuan.model.Book;
     4 import com.yuan.util.PageBean;
     5 import org.springframework.stereotype.Service;
     6 
     7 import java.util.List;
     8 
     9 
    10 public interface BookService {
    11 
    12 
    13     List<Book> listPager(Book book, PageBean pageBean);
    14 }

    测试层代码

     1 /**
     2      * 分页优化
     3      */
     4     @Test
     5     public void listPager() {
     6         Book book = new Book();
     7         //带条件分页查询
     8         book.setBname(StringUtil.toLikeStr("圣墟"));
     9         PageBean pageBean = new PageBean();
    10         //不分页
    11 //        pageBean.setPagination(false);
    12         //根据页码分页查询
    13         pageBean.setPage(2);
    14         List<Book> books = bookService.listPager(book, pageBean);
    15         for (Book b : books) {
    16             System.out.println(b);
    17         }
    18     }

    不带条件分页查询

    带条件分页查询

     

    谢谢观看!!!

  • 相关阅读:
    CCPC2018-湖南全国邀请赛
    2019中山大学程序设计竞赛
    [POJ]poj1185 炮兵营地(状压DP)
    [CF]Codeforces Round #551 (Div. 2)
    [EOJ]2019 ECNU XCPC April Selection #1
    [现场赛]“新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛
    欧拉函数 欧拉筛法 欧拉定理
    [CF]301D Yaroslav and Divisors
    岸芷汀兰的诗集(持续更新)
    模板柱(持续更新)
  • 原文地址:https://www.cnblogs.com/ly-0919/p/11711180.html
Copyright © 2020-2023  润新知