mybatis批量查询-插入-删除
批量插入
WaterEleMapper.xml部分代码
<!--批量增加测试--> <insert id="insertList" parameterType="java.util.List"> insert into t_enterprise_water_ele ( /*方法一*/ -- WATER_ELE_ID, -- ENTERPRISE_ID, -- ENTERPRISE_USCC, -- ENTERPRISE_NAME, -- YEARMONTH, -- WATER_SIZE, -- WATER_AMOUNT, -- ELE_SIZE, -- ELE_AMOUNT, -- STATUS, -- OPERATOR, -- OPERATE_TIME /*方法二*/ <include refid="Base_Column_List"/> ) VALUES <foreach collection="list" item="item" index="index" separator=","> ( #{item.waterEleId,jdbcType=VARCHAR}, #{item.enterpriseId,jdbcType=VARCHAR}, #{item.enterpriseUscc,jdbcType=VARCHAR}, #{item.enterpriseName,jdbcType=VARCHAR}, #{item.yearmonth,jdbcType=VARCHAR}, #{item.waterSize,jdbcType=DECIMAL}, #{item.waterAmount,jdbcType=VARCHAR}, #{item.eleSize,jdbcType=DOUBLE}, #{item.eleAmount,jdbcType=VARCHAR}, #{item.status,jdbcType=INTEGER}, #{item.operator,jdbcType=VARCHAR}, #{item.operateTime,jdbcType=TIMESTAMP} ) </foreach> </insert>
xxxMapper部分代码
int insertList(List<WaterEle> list);
对于foreach标签的解释参考了网上的资料,具体如下:
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。 foreach元素的属性主要有 item,index,collection,open,separator,close。 item表示集合中每一个元素进行迭代时的别名 index指定一个名字,用于表示在迭代过程中,每次迭代到的位置 open表示该语句以什么开始 separator表示在每次进行迭代之间以什么符号作为分隔 符 close表示以什么结束 在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况: 1.如果传入的是单参数且参数类型是一个List的时候,collection属性值为list 2.如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array 3.如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map
使用批量插入执行的SQL语句应该等价于:
insert into redeem_code (batch_id, code, type, facevalue,create_user,create_time) values (?,?,?,?,?,? ),(?,?,?,?,?,? ),(?,?,?,?,?,? ),(?,?,?,?,?,? )
批量删除
1、(使用类似in需要遍历的)传数组/或数组/或map(优先使用)
int deleteByBatch(@Param(value = "array")String[] array);
int deleteByBatch(@Param(value = "list")List list);
<delete id="deleteByBatch" parameterType="java.lang.String"> delete from t_enterprise_output_value where OUTPUT_ID IN <foreach collection="array" item="outputId" open="(" separator="," close=")"> #{outputId} </foreach> </delete>
2、(使用类似in需要遍历的)利用map传String
传的还是map,只不过list拼接成String字符串
因为表中没有fileIds字段,所以如果传map进入的话,需要在map中定义该字段
map.put("fileIds","1,2,3");
//美元符$直接注入(原样注入)
<delete id="deleteByPrimaryKey" parameterType="java.util.Map"> DELETE FROM t_attachment WHERE FILE_ID IN (${fileIds}) </delete>
完整的sql语句是:
DELETE FROM t_attachment WHERE FILE_ID IN (1,2,3)
适用于表中该字段是int或者bigint类型,不适用于varchar。
如果该字段是varchar类型,则正确的sql语句应该是:
DELETE FROM t_attachment WHERE FILE_ID IN ("1","2","3")
map中就应该这样定义了:
数组/集合 -->(1,2,3,4) String userIdList = formData.get("userIdList"); String[] users = userIdList.split(","); String str = ""; for (String user : users) { str += "\"" + user + "\"" + ","; } String substring = str.substring(0, str.lastIndexOf(",")); System.out.println(substring);
3、(不只是遍历,还有别的参数)多参数批量删除示例
如果删除不是以主键为条件,而是多个条件同时成立才可以删除 userIds可以是数组或者list或者map 上面的SYSCODE和ROLE_ID,可以直接传递 int deleteByUserIdSysRoleBatch(@Param(value="sysCode") String sysCode,@Param(value="roleId") String roleId,@Param(value="userIds")int[] userIds); int deleteByUserIdSysRoleBatch(@Param(value="sysCode") String sysCode,@Param(value="roleId") String roleId,@Param(value="userIds")List<Integer> userIds);
<delete id="deleteByUserIdSysRoleBatch"> delete from t_user_role where SYSCODE = #{sysCode,jdbcType=VARCHAR} AND ROLE_ID = #{roleId,jdbcType=VARCHAR} AND USER_ID IN <foreach collection="userIds" item="item" index="index" open="(" separator="," close=")"> #{item} </foreach> </delete>
4.利用map传递多个参数
<delete id="deleteByRole" parameterType="java.util.Map"> DELETE FROM t_user_role <where> <if test="userIdList != null"> USER_ID IN (#{userIdList,jdbcType=VARCHAR}) </if> <if test="roleId != null"> AND ROLE_ID=#{roleId,jdbcType=VARCHAR} </if> <if test="sysCode != null"> AND SYSCODE=#{sysCode} </if> </where> </delete>
批量查询
1.传入list/数组/map(优先使用)
<select id="selectOrder" parameterType="java.util.Map" resultMap="OrderMap"> SELECT * FROM t_ WHERE ORDER_ID in <foreach collection="list" item="item" index="index" open="(" separator="," close=")"> #{item} </foreach> </select>
2、利用map将拼接的String传入
<select id="selectOrder" parameterType="java.util.Map" resultMap="OrderMap"> SELECT * FROM t_ WHERE ORDER_ID in (${orderList}) </select>
①对于表中的主键是bigint / int
==> Preparing: SELECT * FROM t_order WHERE ORDER_ID in (?) ==> Parameters: 1,2,5(String) <== Columns: ORDER_ID, GOODS_ID, UNIT_PRICE, SOLD_NUM, ORDER_STATUS, OPERATOR, OPERATE_TIME <== Row: 1, 356346093, 43.00, 3, 109002, yyadmin, 2017-12-16 21:01:20.0 <== Total: 1
注意"1,2,5"传过来的是String类型,实际sql语句如下:
SELECT * FROM t_order WHERE ORDER_ID in (#{orderList}) SELECT * FROM t_order WHERE ORDER_ID in (‘1,2,5‘)只能查到一条
将mapper.xml中的sql语句改为
SELECT * FROM t_order WHERE ORDER_ID in (${orderList}) SELECT * FROM t_order WHERE ORDER_ID in (1,2,5)就可以全部查到。
②对于表中的主键是varchar
SELECT * FROM t_order WHERE ORDER_ID in (#{orderList}) SELECT * FROM t_order WHERE ORDER_ID in (‘1,2,5‘)查询不到
将mapper.xml中的sql语句改为
SELECT * FROM t_order WHERE ORDER_ID in (${orderList}) SELECT * FROM t_order WHERE ORDER_ID in (‘1‘,‘2‘,‘5‘)就可以全部
‘1,2,5‘转为‘1‘,‘2‘,‘5‘步骤如下:
String categoryIdList = (String) formData.get("categoryIdList"); if (!StringUtils.isEmpty(categoryIdList)) { String[] split = categoryIdList.split(","); String sqlParamter = ""; for (String s : split) { sqlParamter += "‘" + s + "‘,"; } String substring = sqlParamter.substring(0, sqlParamter.length() - 1); formData.put("categoryIdList", substring); }
站在巨人的肩膀上摘苹果:
相关推荐
Dullonjiang 2020-07-30
sofast 2020-07-08
AngelicaA 2020-07-04
Iamready 2020-06-25
TMD咯MySQL 2020-06-16
窃破天道 2020-06-12
tanyhuan 2020-06-09
debugjoker 2020-06-07
nan00zzu 2020-06-07
BiPerler 2020-06-03
勇往直前 2020-06-01
huangyx 2020-05-29
阿亮 2020-05-28
sunnyJam 2020-04-03
数据库之扑朔迷离 2020-04-26
gamestart0 2020-04-10
李轮清 2020-05-11
imacoder 2020-05-10
好记忆也需烂 2020-05-09