MyBatis 批量操作

来源:互联网 发布:金丝绒连衣裙新款淘宝 编辑:程序博客网 时间:2024/06/03 18:58

我们在做项目的时候经常会对数据批量的增删改查,有的时候还在城程序中使用for循环进行操作,这种方法并没有错但是性能稍微低了一点。直接在.xml中进行批量的操作相对于在程序中进行循环性能稍好一些,下面就简单介绍一下MyBatis中的批量操作:
一、批量添加

 <insert id="addRecordDetails" parameterType="java.util.List">    INSERT INTO star_test_record_details      (id, details_create_time, details_modify_time,       paper_id, question_id,       user_id, answer_key, answer_results,       question_score, records_id)    VALUE    <foreach collection="list" item="item" index="index" separator=",">      (       #{item.id,jdbcType=VARCHAR},       #{item.detailsCreateTime,jdbcType=VARCHAR},       #{item.detailsModifyTime,jdbcType=VARCHAR},       #{item.paperId,jdbcType=VARCHAR},       #{item.questionId,jdbcType=VARCHAR},       #{item.userId,jdbcType=VARCHAR},       #{item.answerKey,jdbcType=VARCHAR},       #{item.answerResults,jdbcType=VARCHAR},       #{item.questionScore,jdbcType=VARCHAR},       #{item.recordsId,jdbcType=VARCHAR})    </foreach>  </insert>

注意:上面传入的list集合中的每个元素都是一个对象,所以item代表的是集合中的每个元素只不过元素的类型为对象,插入数据库时要获得对象中的每个元素item.xxx(xxx要和对象中的属性保持一致)


二、批量删除

 <delete id="deleteByIdList" parameterType="java.util.List">    DELETE  FROM  star_test_questions    WHERE id IN    <foreach collection="list" index="index" item="item" open="(" separator="," close=")">      #{item,jdbcType=VARCHAR}    </foreach>  </delete>

注意:上面传入集合的类型为String类型所以这里的item代表集合中的每个元素,元素的类型为String

三、批量修改

 <update id="updateByIdList" parameterType="java.util.List">      UPDATE star_test_questions SET question_state = 1    WHERE id IN    <foreach collection="list" index="index" item="item" open="(" separator="," close=")">      #{item,jdbcType=VARCHAR}    </foreach>  </update>

四、批量查询(可以使用在多表查询中)

<select id="selectQuestionAndOption" parameterType="java.util.List" resultMap="questionAndOptionMap">    SELECT  que.id as qid, que.question_content,    que.paper_type, que.question_answer, que.question_points,     op.id as oid ,op.question_id, op.option_content    FROM star_test_questions que ,star_test_option op    WHERE que.id IN    <foreach collection="list" index="index" item="item" open="(" separator="," close=")">      #{item,jdbcType=VARCHAR}    </foreach>    AND     op.question_id = que.id    AND    que.paper_type = 0  </select>  <resultMap id="questionAndOptionMap" type="cn.demo.model.StartTestQuestion">    <id column="qid" jdbcType="VARCHAR" property="id" />    <result column="question_content" jdbcType="VARCHAR" property="questionContent" />    <result column="paper_type" jdbcType="VARCHAR" property="paperType" />    <result column="question_answer" jdbcType="VARCHAR" property="questionAnswer" />    <result column="question_points" jdbcType="VARCHAR" property="questionPoints" />    <result column="question_order" jdbcType="VARCHAR" property="questionOrder" />    <collection property="startTestOptionList" ofType="cn.demo.model.StartTestOption">      <id column="oid" jdbcType="VARCHAR" property="id" />      <result column="question_id" jdbcType="VARCHAR" property="questionId" />      <result column="option_content" jdbcType="VARCHAR" property="optionContent" />    </collection>  </resultMap>

最后对foreach元素属性进行说明:
item:表示集合中每个元素进行迭代的时的别名
index:指定一个名字,用于表示在迭代的过程中每次迭代到的位置
open:表示该语句以什么开始
separator:表示在每次进行迭代之间以什么符号作为分隔 符,
close:表示以什么结束
collection:表示传入集合的参数类型,在不同的情况下该属性值是不同的,一般分为以下三种情况:


1)如果传入的参数是单参数且参数类型是一个list时,collection为list(上面的都是这种类型)

2)如果传入的是单参数且参数的类型为array数组时collection为array
例如:

 <delete id="deleteByArray" parameterType="java.util.ArrayList">    DELETE  FROM  star_test_questions    WHERE id IN    <foreach collection="array" index="index" item="item" open="(" separator="," close=")">      #{item,jdbcType=VARCHAR}    </foreach>  </delete>

此时我传入的参数是下面这样的

String[] ids = new String[] {"1","2","3"};

3) 如果传入的参数是多个封装成map,例如:

 <select id="selectByMap" parameterType="java.util.HashMap" resultType="java.lang.String">    SELECT question_content FROM star_test_questions    WHERE  question_state = #{questionState,jdbcType=VARCHAR}    AND id IN    <foreach collection="idList" item="item" index="index" open="(" separator="," close=")">     #{item,jdbcType=VARCHAR}    </foreach>

此时我传入的参数是这样的:

Map paraMap = new HashMap();paraMap.put("questionState","1");//questionIdList是一个String类型的集合paraMap.put("idList",questionIdList);

注意:参数名和map中的key值保持一致。

原创粉丝点击