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会很长,第三种是真正意义上的批量新增,在开发中不要使用第二种,如果数据不是特别多可以使用第一种,数据量大使用第三种。