Mybatis 入参格式、批量新增学习笔记

一、Mybatis参数处理

1.单参数:因为只传递一个参数,所以接口中参数名与mapper中入参名写什么都可以,规范上两者相同

接口代码

void  deletePerson(Integer id);

mapper代码

 

<delete id="deletePerson" parameterType="int">
    delete from person where id=#{123}
</delete>

 

2.多参数:三种传递方式(1.Map 2.@param注解 3.JavaBean传递参数)

下面这种方式mybatis会报错,找不到对应的参数,所以我们需要使用上面介绍的三种方式进行参数传递

Person getPersonByNameAndGender(String username,String gender);

 

<select id="getPersonByNameAndGender" resultType="person"> 
  select * from person where username=#{username} and gender=#{gender} 
</select>

 

——map方式:在mapper中入参就是map中的key,一定要对应上

       接口代码

Person getPersonByNameAndGender(Map<String,Object> param);

       mapper代码

<select id="getPersonByNameAndGender" resultType="person">
    select * from person where username=#{username} and gender=#{gender}
</select>

——@param注解方式:这种方式无需对参数进行封装,相当于重命名,在mybatis内部会转化成map中的key

     接口代码

Person getPersonByNameAndGender(@Param("username")String username,@Param("gender")String gender);

     mapper代码

<select id="getPersonByNameAndGender" resultType="person"> 
  select * from person where username=#{username} and gender=#{gender} 
</select>

——JavaBean方式:可以把参数封装到实体类中,然后直接传入实体类

  接口代码

Person getPersonByNameAndGender(Person person);

  mapper代码

<select id="getPersonByNameAndGender" parameterType="person" resultType="person"> 
  select * from person where username=#{username} and gender=#{gender}
</select>

上述三种处理方式总结:

  ◆使用map传递参数,业务可读性差

  ◆@param,收到参数个数(n)的影响,建议(n)<5时,为最佳的传参方式

  ◆参数个数大于5,建议使用JavaBean

3.入参为数组、集合

——mapper入参为数组中一个元素时

  接口代码

Person getPersonByCollection(@Param("test") int[] ids);

  mapper代码

<select id="getPersonByCollection" resultType="person">
   select * from person where id=#{test[0]}
</select>

——使用数组中多个元素,例如sql中where语句是in,使用foreach标签

  接口代码

List<Person> getPersonsByIds(int[] ids);

  mapper代码

  <select id="getPersonsByIds" resultType="person">
    select * from person where id in
    <foreach collection="array" item="id" index="i" open="(" close=")" separator=",">
      #{id}
    </foreach>
  </select>

 4.批量新增 oracle与mysql不同

一、values中填写多条值,用逗号隔开   语法:insert into 表名(column1,column2) values (xx,xx),(xx,xx),(xx,xx) 此方法仅支持mysql数据库

  接口代码

void addPersons(@Param("persons") List<Person> persons);

  mapper代码

<insert id="addPersons">
    insert into person(username,email,gender) values
    <foreach collection="persons" item="person" separator=",">
      (#{person.username},#{person.email},#{person.gender})
    </foreach>
</insert>

  此方法插入10000条数据时间为2554毫秒

  oracle中类似方法:https://www.cnblogs.com/cuijiade/p/9882750.html

二、把insert语句也写入到循环中,然后每条sql用分号隔开,这种方法mysql连接数据库时后面要有参数allowMultiQueries=true

jdbc:mysql://localhost:3306/mybatis?allowMultiQueries=true

  接口代码

void addPersons1(@Param("persons") List<Person> persons);

  mapper代码

<insert id="addPersons1">
    <foreach collection="persons" item="person" separator=";">
      insert into person (username,email,gender) VALUES (#{person.username},#{person.email},#{person.gender})
    </foreach>
 </insert>

  此方法插入10000条数据时间为2604毫秒,不建议使用

三、真正的批量处理,借助Executor的Batch批量添加,需要配置一个可以执行批量的sqlSession

  配置文件中需要新增配置

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
    <constructor-arg name="executorType" value="BATCH"></constructor-arg>
</bean>

  在程序中注入sqlSession

@Autowired
SqlSession sqlSession;

  得到接口实例化对象

PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);

  然后正常调用就可以了,无需传list,入参为对象,接口代码

void addPerson(Person person);

  mapper代码

  <insert id="addPerson" parameterType="person">
    insert into person(username,email,gender) VALUES (#{username},#{email},#{gender})
  </insert>

总结批量新增:第一和第二种是通过拼接sql语句来实现的,如果数据较多sql会很长,第三种是真正意义上的批量新增,在开发中不要使用第二种,如果数据不是特别多可以使用第一种,数据量大使用第三种。

 

posted @ 2018-10-31 16:16  我是小菜啊1  阅读(297)  评论(0编辑  收藏  举报