无法通过MyBatis将批处理插入到SQL中。

huangapple 未分类评论54阅读模式
英文:

Unable to insert the batch in sql via MyBatis

问题

int insertSelective(List<Reason> record);

我正在寻找以下方法来插入批量的"Reason"对象,但现在无法理解如何在XML文件中进行映射。

<insert id="insertSelectiveBatch" parameterType="java.util.List">
    <!--
        WARNING - @mbg.generated
        This element is automatically generated by MyBatis Generator, do not modify.
        This element was generated on Sun Apr 05 18:38:46 IST 2020.
    -->
    insert into REASON (REASON_ID, IS_NOTE_REQUIRED, IS_SYSTEM_RESERVED, 
      EFFECTIVE_FROM, EFFECTIVE_TO, CREATED_ON, 
      CREATED_BY, LAST_UPDATED_ON, LAST_UPDATED_BY, 
      REASON_TYPE, REASON_NAME)
    values
    <foreach collection="list" item="item" separator=",">
        (#{item.reasonId,jdbcType=CHAR}, #{item.isNoteRequired,jdbcType=BIT}, #{item.isSystemReserved,jdbcType=BIT}, 
          #{item.effectiveFrom,jdbcType=NVARCHAR}, #{item.effectiveTo,jdbcType=NVARCHAR}, #{item.createdOn,jdbcType=TIMESTAMP}, 
          #{item.createdBy,jdbcType=NVARCHAR}, #{item.lastUpdatedOn,jdbcType=TIMESTAMP}, #{item.lastUpdatedBy,jdbcType=NVARCHAR}, 
          #{item.reasonType,jdbcType=NVARCHAR}, #{item.reasonName,jdbcType=VARCHAR})
    </foreach>
</insert>

你的ReasonMapper.xml文件应该添加这个新的批量插入方法。这个方法将使用MyBatis的foreach标签来处理批量插入。在你的DAO类中,你可以使用insertSelectiveBatch方法来进行批量插入。

在你的DAO类的调用部分:

reasonMapper.insertSelectiveBatch(reasonList);

确保你在<mapper>标签内添加了这个新的批量插入方法,这样MyBatis才能正确地找到它。此外,请确保你的Reason对象列表(reasonList)不为null且不为空。

另外,你在配置文件ReferenceDataConfiguration中设置了批量操作的SqlSessionTemplate,这是正确的。检查一下你的数据库是否支持批量插入操作,以及数据库连接的设置是否适合执行大批量的操作。

英文:

I've recently started learning to use MyBatis and I am stuck up in one scenario. I am not able to insert the list of Reason object in sql by using MyBatis. I am having below ReasonMapper.xml file but not able to understand how to write insert query to insert reason object as a batch.

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;!DOCTYPE mapper PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot; &quot;http://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&gt;
&lt;mapper namespace=&quot;aero.sita.gsl.ee.services.referencedata.generated.mapper.ReasonMapper&quot;&gt;
  &lt;resultMap id=&quot;BaseResultMap&quot; type=&quot;aero.sita.gsl.ee.services.referencedata.generated.model.Reason&quot;&gt;
    &lt;!--
      WARNING - @mbg.generated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Sun Apr 05 18:38:46 IST 2020.
    --&gt;
    &lt;result column=&quot;REASON_ID&quot; jdbcType=&quot;CHAR&quot; property=&quot;reasonId&quot; /&gt;
    &lt;result column=&quot;IS_NOTE_REQUIRED&quot; jdbcType=&quot;BIT&quot; property=&quot;isNoteRequired&quot; /&gt;
    &lt;result column=&quot;IS_SYSTEM_RESERVED&quot; jdbcType=&quot;BIT&quot; property=&quot;isSystemReserved&quot; /&gt;
    &lt;result column=&quot;EFFECTIVE_FROM&quot; jdbcType=&quot;NVARCHAR&quot; property=&quot;effectiveFrom&quot; /&gt;
    &lt;result column=&quot;EFFECTIVE_TO&quot; jdbcType=&quot;NVARCHAR&quot; property=&quot;effectiveTo&quot; /&gt;
    &lt;result column=&quot;CREATED_ON&quot; jdbcType=&quot;TIMESTAMP&quot; property=&quot;createdOn&quot; /&gt;
    &lt;result column=&quot;CREATED_BY&quot; jdbcType=&quot;NVARCHAR&quot; property=&quot;createdBy&quot; /&gt;
    &lt;result column=&quot;LAST_UPDATED_ON&quot; jdbcType=&quot;TIMESTAMP&quot; property=&quot;lastUpdatedOn&quot; /&gt;
    &lt;result column=&quot;LAST_UPDATED_BY&quot; jdbcType=&quot;NVARCHAR&quot; property=&quot;lastUpdatedBy&quot; /&gt;
    &lt;result column=&quot;REASON_TYPE&quot; jdbcType=&quot;NVARCHAR&quot; property=&quot;reasonType&quot; /&gt;
    &lt;result column=&quot;REASON_NAME&quot; jdbcType=&quot;VARCHAR&quot; property=&quot;reasonName&quot; /&gt;
  &lt;/resultMap&gt;
  &lt;sql id=&quot;Example_Where_Clause&quot;&gt;
    &lt;!--
      WARNING - @mbg.generated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Sun Apr 05 18:38:46 IST 2020.
    --&gt;
    &lt;where&gt;
      &lt;foreach collection=&quot;oredCriteria&quot; item=&quot;criteria&quot; separator=&quot;or&quot;&gt;
        &lt;if test=&quot;criteria.valid&quot;&gt;
          &lt;trim prefix=&quot;(&quot; prefixOverrides=&quot;and&quot; suffix=&quot;)&quot;&gt;
            &lt;foreach collection=&quot;criteria.criteria&quot; item=&quot;criterion&quot;&gt;
              &lt;choose&gt;
                &lt;when test=&quot;criterion.noValue&quot;&gt;
                  and ${criterion.condition}
                &lt;/when&gt;
                &lt;when test=&quot;criterion.singleValue&quot;&gt;
                  and ${criterion.condition} #{criterion.value}
                &lt;/when&gt;
                &lt;when test=&quot;criterion.betweenValue&quot;&gt;
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                &lt;/when&gt;
                &lt;when test=&quot;criterion.listValue&quot;&gt;
                  and ${criterion.condition}
                  &lt;foreach close=&quot;)&quot; collection=&quot;criterion.value&quot; item=&quot;listItem&quot; open=&quot;(&quot; separator=&quot;,&quot;&gt;
                    #{listItem}
                  &lt;/foreach&gt;
                &lt;/when&gt;
              &lt;/choose&gt;
            &lt;/foreach&gt;
          &lt;/trim&gt;
        &lt;/if&gt;
      &lt;/foreach&gt;
    &lt;/where&gt;
  &lt;/sql&gt;
  &lt;sql id=&quot;Update_By_Example_Where_Clause&quot;&gt;
    &lt;!--
      WARNING - @mbg.generated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Sun Apr 05 18:38:46 IST 2020.
    --&gt;
    &lt;where&gt;
      &lt;foreach collection=&quot;example.oredCriteria&quot; item=&quot;criteria&quot; separator=&quot;or&quot;&gt;
        &lt;if test=&quot;criteria.valid&quot;&gt;
          &lt;trim prefix=&quot;(&quot; prefixOverrides=&quot;and&quot; suffix=&quot;)&quot;&gt;
            &lt;foreach collection=&quot;criteria.criteria&quot; item=&quot;criterion&quot;&gt;
              &lt;choose&gt;
                &lt;when test=&quot;criterion.noValue&quot;&gt;
                  and ${criterion.condition}
                &lt;/when&gt;
                &lt;when test=&quot;criterion.singleValue&quot;&gt;
                  and ${criterion.condition} #{criterion.value}
                &lt;/when&gt;
                &lt;when test=&quot;criterion.betweenValue&quot;&gt;
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                &lt;/when&gt;
                &lt;when test=&quot;criterion.listValue&quot;&gt;
                  and ${criterion.condition}
                  &lt;foreach close=&quot;)&quot; collection=&quot;criterion.value&quot; item=&quot;listItem&quot; open=&quot;(&quot; separator=&quot;,&quot;&gt;
                    #{listItem}
                  &lt;/foreach&gt;
                &lt;/when&gt;
              &lt;/choose&gt;
            &lt;/foreach&gt;
          &lt;/trim&gt;
        &lt;/if&gt;
      &lt;/foreach&gt;
    &lt;/where&gt;
  &lt;/sql&gt;
  &lt;sql id=&quot;Base_Column_List&quot;&gt;
    &lt;!--
      WARNING - @mbg.generated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Sun Apr 05 18:38:46 IST 2020.
    --&gt;
    REASON_ID, IS_NOTE_REQUIRED, IS_SYSTEM_RESERVED, EFFECTIVE_FROM, EFFECTIVE_TO, CREATED_ON, 
    CREATED_BY, LAST_UPDATED_ON, LAST_UPDATED_BY, REASON_TYPE, REASON_NAME
  &lt;/sql&gt;
  &lt;select id=&quot;selectByExample&quot; parameterType=&quot;aero.sita.gsl.ee.services.referencedata.generated.model.ReasonExample&quot; resultMap=&quot;BaseResultMap&quot;&gt;
    &lt;!--
      WARNING - @mbg.generated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Sun Apr 05 18:38:46 IST 2020.
    --&gt;
    select
    &lt;if test=&quot;distinct&quot;&gt;
      distinct
    &lt;/if&gt;
    &lt;include refid=&quot;Base_Column_List&quot; /&gt;
    from REASON
    &lt;if test=&quot;_parameter != null&quot;&gt;
      &lt;include refid=&quot;Example_Where_Clause&quot; /&gt;
    &lt;/if&gt;
    &lt;if test=&quot;orderByClause != null&quot;&gt;
      order by ${orderByClause}
    &lt;/if&gt;
  &lt;/select&gt;
  &lt;delete id=&quot;deleteByExample&quot; parameterType=&quot;aero.sita.gsl.ee.services.referencedata.generated.model.ReasonExample&quot;&gt;
    &lt;!--
      WARNING - @mbg.generated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Sun Apr 05 18:38:46 IST 2020.
    --&gt;
    delete from REASON
    &lt;if test=&quot;_parameter != null&quot;&gt;
      &lt;include refid=&quot;Example_Where_Clause&quot; /&gt;
    &lt;/if&gt;
  &lt;/delete&gt;
  &lt;insert id=&quot;insert&quot; parameterType=&quot;aero.sita.gsl.ee.services.referencedata.generated.model.Reason&quot;&gt;
    &lt;!--
      WARNING - @mbg.generated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Sun Apr 05 18:38:46 IST 2020.
    --&gt;
    insert into REASON (REASON_ID, IS_NOTE_REQUIRED, IS_SYSTEM_RESERVED, 
      EFFECTIVE_FROM, EFFECTIVE_TO, CREATED_ON, 
      CREATED_BY, LAST_UPDATED_ON, LAST_UPDATED_BY, 
      REASON_TYPE, REASON_NAME)
    values (#{reasonId,jdbcType=CHAR}, #{isNoteRequired,jdbcType=BIT}, #{isSystemReserved,jdbcType=BIT}, 
      #{effectiveFrom,jdbcType=NVARCHAR}, #{effectiveTo,jdbcType=NVARCHAR}, #{createdOn,jdbcType=TIMESTAMP}, 
      #{createdBy,jdbcType=NVARCHAR}, #{lastUpdatedOn,jdbcType=TIMESTAMP}, #{lastUpdatedBy,jdbcType=NVARCHAR}, 
      #{reasonType,jdbcType=NVARCHAR}, #{reasonName,jdbcType=VARCHAR})
  &lt;/insert&gt;
  &lt;insert id=&quot;insertSelective&quot; parameterType=&quot;aero.sita.gsl.ee.services.referencedata.generated.model.Reason&quot;&gt;
    &lt;!--
      WARNING - @mbg.generated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Sun Apr 05 18:38:46 IST 2020.
    --&gt;
    insert into REASON
    &lt;trim prefix=&quot;(&quot; suffix=&quot;)&quot; suffixOverrides=&quot;,&quot;&gt;
      &lt;if test=&quot;reasonId != null&quot;&gt;
        REASON_ID,
      &lt;/if&gt;
      &lt;if test=&quot;isNoteRequired != null&quot;&gt;
        IS_NOTE_REQUIRED,
      &lt;/if&gt;
      &lt;if test=&quot;isSystemReserved != null&quot;&gt;
        IS_SYSTEM_RESERVED,
      &lt;/if&gt;
      &lt;if test=&quot;effectiveFrom != null&quot;&gt;
        EFFECTIVE_FROM,
      &lt;/if&gt;
      &lt;if test=&quot;effectiveTo != null&quot;&gt;
        EFFECTIVE_TO,
      &lt;/if&gt;
      &lt;if test=&quot;createdOn != null&quot;&gt;
        CREATED_ON,
      &lt;/if&gt;
      &lt;if test=&quot;createdBy != null&quot;&gt;
        CREATED_BY,
      &lt;/if&gt;
      &lt;if test=&quot;lastUpdatedOn != null&quot;&gt;
        LAST_UPDATED_ON,
      &lt;/if&gt;
      &lt;if test=&quot;lastUpdatedBy != null&quot;&gt;
        LAST_UPDATED_BY,
      &lt;/if&gt;
      &lt;if test=&quot;reasonType != null&quot;&gt;
        REASON_TYPE,
      &lt;/if&gt;
      &lt;if test=&quot;reasonName != null&quot;&gt;
        REASON_NAME,
      &lt;/if&gt;
    &lt;/trim&gt;
    &lt;trim prefix=&quot;values (&quot; suffix=&quot;)&quot; suffixOverrides=&quot;,&quot;&gt;
      &lt;if test=&quot;reasonId != null&quot;&gt;
        #{reasonId,jdbcType=CHAR},
      &lt;/if&gt;
      &lt;if test=&quot;isNoteRequired != null&quot;&gt;
        #{isNoteRequired,jdbcType=BIT},
      &lt;/if&gt;
      &lt;if test=&quot;isSystemReserved != null&quot;&gt;
        #{isSystemReserved,jdbcType=BIT},
      &lt;/if&gt;
      &lt;if test=&quot;effectiveFrom != null&quot;&gt;
        #{effectiveFrom,jdbcType=NVARCHAR},
      &lt;/if&gt;
      &lt;if test=&quot;effectiveTo != null&quot;&gt;
        #{effectiveTo,jdbcType=NVARCHAR},
      &lt;/if&gt;
      &lt;if test=&quot;createdOn != null&quot;&gt;
        #{createdOn,jdbcType=TIMESTAMP},
      &lt;/if&gt;
      &lt;if test=&quot;createdBy != null&quot;&gt;
        #{createdBy,jdbcType=NVARCHAR},
      &lt;/if&gt;
      &lt;if test=&quot;lastUpdatedOn != null&quot;&gt;
        #{lastUpdatedOn,jdbcType=TIMESTAMP},
      &lt;/if&gt;
      &lt;if test=&quot;lastUpdatedBy != null&quot;&gt;
        #{lastUpdatedBy,jdbcType=NVARCHAR},
      &lt;/if&gt;
      &lt;if test=&quot;reasonType != null&quot;&gt;
        #{reasonType,jdbcType=NVARCHAR},
      &lt;/if&gt;
      &lt;if test=&quot;reasonName != null&quot;&gt;
        #{reasonName,jdbcType=VARCHAR},
      &lt;/if&gt;
    &lt;/trim&gt;
  &lt;/insert&gt;
  &lt;select id=&quot;countByExample&quot; parameterType=&quot;aero.sita.gsl.ee.services.referencedata.generated.model.ReasonExample&quot; resultType=&quot;java.lang.Long&quot;&gt;
    &lt;!--
      WARNING - @mbg.generated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Sun Apr 05 18:38:46 IST 2020.
    --&gt;
    select count(*) from REASON
    &lt;if test=&quot;_parameter != null&quot;&gt;
      &lt;include refid=&quot;Example_Where_Clause&quot; /&gt;
    &lt;/if&gt;
  &lt;/select&gt;
  &lt;update id=&quot;updateByExampleSelective&quot; parameterType=&quot;map&quot;&gt;
    &lt;!--
      WARNING - @mbg.generated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Sun Apr 05 18:38:46 IST 2020.
    --&gt;
    update REASON
    &lt;set&gt;
      &lt;if test=&quot;record.reasonId != null&quot;&gt;
        REASON_ID = #{record.reasonId,jdbcType=CHAR},
      &lt;/if&gt;
      &lt;if test=&quot;record.isNoteRequired != null&quot;&gt;
        IS_NOTE_REQUIRED = #{record.isNoteRequired,jdbcType=BIT},
      &lt;/if&gt;
      &lt;if test=&quot;record.isSystemReserved != null&quot;&gt;
        IS_SYSTEM_RESERVED = #{record.isSystemReserved,jdbcType=BIT},
      &lt;/if&gt;
      &lt;if test=&quot;record.effectiveFrom != null&quot;&gt;
        EFFECTIVE_FROM = #{record.effectiveFrom,jdbcType=NVARCHAR},
      &lt;/if&gt;
      &lt;if test=&quot;record.effectiveTo != null&quot;&gt;
        EFFECTIVE_TO = #{record.effectiveTo,jdbcType=NVARCHAR},
      &lt;/if&gt;
      &lt;if test=&quot;record.createdOn != null&quot;&gt;
        CREATED_ON = #{record.createdOn,jdbcType=TIMESTAMP},
      &lt;/if&gt;
      &lt;if test=&quot;record.createdBy != null&quot;&gt;
        CREATED_BY = #{record.createdBy,jdbcType=NVARCHAR},
      &lt;/if&gt;
      &lt;if test=&quot;record.lastUpdatedOn != null&quot;&gt;
        LAST_UPDATED_ON = #{record.lastUpdatedOn,jdbcType=TIMESTAMP},
      &lt;/if&gt;
      &lt;if test=&quot;record.lastUpdatedBy != null&quot;&gt;
        LAST_UPDATED_BY = #{record.lastUpdatedBy,jdbcType=NVARCHAR},
      &lt;/if&gt;
      &lt;if test=&quot;record.reasonType != null&quot;&gt;
        REASON_TYPE = #{record.reasonType,jdbcType=NVARCHAR},
      &lt;/if&gt;
      &lt;if test=&quot;record.reasonName != null&quot;&gt;
        REASON_NAME = #{record.reasonName,jdbcType=VARCHAR},
      &lt;/if&gt;
    &lt;/set&gt;
    &lt;if test=&quot;_parameter != null&quot;&gt;
      &lt;include refid=&quot;Update_By_Example_Where_Clause&quot; /&gt;
    &lt;/if&gt;
  &lt;/update&gt;
  &lt;update id=&quot;updateByExample&quot; parameterType=&quot;map&quot;&gt;
    &lt;!--
      WARNING - @mbg.generated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Sun Apr 05 18:38:46 IST 2020.
    --&gt;
    update REASON
    set REASON_ID = #{record.reasonId,jdbcType=CHAR},
      IS_NOTE_REQUIRED = #{record.isNoteRequired,jdbcType=BIT},
      IS_SYSTEM_RESERVED = #{record.isSystemReserved,jdbcType=BIT},
      EFFECTIVE_FROM = #{record.effectiveFrom,jdbcType=NVARCHAR},
      EFFECTIVE_TO = #{record.effectiveTo,jdbcType=NVARCHAR},
      CREATED_ON = #{record.createdOn,jdbcType=TIMESTAMP},
      CREATED_BY = #{record.createdBy,jdbcType=NVARCHAR},
      LAST_UPDATED_ON = #{record.lastUpdatedOn,jdbcType=TIMESTAMP},
      LAST_UPDATED_BY = #{record.lastUpdatedBy,jdbcType=NVARCHAR},
      REASON_TYPE = #{record.reasonType,jdbcType=NVARCHAR},
      REASON_NAME = #{record.reasonName,jdbcType=VARCHAR}
    &lt;if test=&quot;_parameter != null&quot;&gt;
      &lt;include refid=&quot;Update_By_Example_Where_Clause&quot; /&gt;
    &lt;/if&gt;
  &lt;/update&gt;
&lt;/mapper&gt;

I am having below methods in my ReasonMapper.java class :

package aero.sita.gsl.ee.services.referencedata.generated.mapper;

import aero.sita.gsl.ee.services.referencedata.generated.model.Reason;
import aero.sita.gsl.ee.services.referencedata.generated.model.ReasonExample;
import java.util.List;
import org.apache.ibatis.annotations.Param;

public interface ReasonMapper {
    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table REASON
     *
     * @mbg.generated Sun Apr 05 18:38:46 IST 2020
     */
    long countByExample(ReasonExample example);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table REASON
     *
     * @mbg.generated Sun Apr 05 18:38:46 IST 2020
     */
    int deleteByExample(ReasonExample example);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table REASON
     *
     * @mbg.generated Sun Apr 05 18:38:46 IST 2020
     */
    int insert(Reason record);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table REASON
     *
     * @mbg.generated Sun Apr 05 18:38:46 IST 2020
     */
    int insertSelective(Reason record);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table REASON
     *
     * @mbg.generated Sun Apr 05 18:38:46 IST 2020
     */
    List&lt;Reason&gt; selectByExample(ReasonExample example);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table REASON
     *
     * @mbg.generated Sun Apr 05 18:38:46 IST 2020
     */
    int updateByExampleSelective(@Param(&quot;record&quot;) Reason record, @Param(&quot;example&quot;) ReasonExample example);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table REASON
     *
     * @mbg.generated Sun Apr 05 18:38:46 IST 2020
     */
    int updateByExample(@Param(&quot;record&quot;) Reason record, @Param(&quot;example&quot;) ReasonExample example);
}

I am looking for below method to insert the batch of reason object but now able to understand how to map it in the xml file.

int insertSelective(List&lt;Reason&gt; record);

I have done below changes in configuration file :

public class ReferenceDataConfiguration {
    
    /** The datasource url. */
    @Value(&quot;${gsl.ee.datasource.url}&quot;)
    private String datasourceUrl;

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setUrl(datasourceUrl);
        return dataSource;
    }

    @Bean
    public DataSourceTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setTypeAliasesPackage(&quot;aero.sita.gsl.ee.services.referencedata&quot;);
        return sessionFactory.getObject();
    }

    @Bean
    @Primary
    public SqlSessionTemplate batchSqlSessionTemplate() throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory(), ExecutorType.BATCH);
    }

And I am calling it on Dao class as below :

 for(Reason reasonInsert : reason){
      num = reasonMapper.insertSelective(reasonInsert);
  }

But above two changes are not doing any batch insertion.

huangapple
  • 本文由 发表于 2020年4月6日 00:28:02
  • 转载请务必保留本文链接:https://java.coder-hub.com/61045761.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定