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

  • 相关阅读:
    关于深拷贝和浅拷贝的理解
    Oracle数据库入门
    单例模式入门
    oracle存储过程 (还没动手实践、剩余内容找时间在处理、游标还没接触)
    Oracle用户名及默认密码
    oracle数据库怎么创建数据库实例
    Java 强、弱、软、虚,你属于哪一种?
    内存溢出和内存泄漏的区别
    aop中execution 表达式
    JPA 中@Enumerated
  • 原文地址:https://www.cnblogs.com/cuijiade/p/9883884.html
Copyright © 2011-2022 走看看