1.首先应该明白,mybatis增删改返回值是int型的影响行数的值

mapper接口

package cn.xm.mapper;

import java.util.List;

import cn.xm.pojo.Questions;

/**
* 自定义的批量删除与批量增加试题
* @author liqiang
*
*/
public interface QuestionsCustomMapper {
/**
* 批量导入试题
* @param list 需要倒入的试题集合
* @return
* @throws Exception
*/
public int saveQuestionBatch()throws Exception; }

 mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离 注意:使用mapper代理方法开发,namespace有特殊重要的作用 -->
<mapper namespace="cn.xm.mapper.QuestionsCustomMapper"> <insert id="saveQuestionBatch">
INSERT INTO `exam`.`questions`
VALUES ('7',
'1',
'测试题目7',
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
"安全知识")
</insert> </mapper>

测试代码:

package cn.xm.test.mybatis;

import java.io.InputStream;
import java.net.URL;
import java.util.Date;
import java.util.List; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReportJmxMBean;
import org.junit.Before;
import org.junit.Test; import cn.xm.mapper.EmployeeInMapper;
import cn.xm.mapper.QuestionsCustomMapper;
import cn.xm.pojo.EmployeeIn;
import cn.xm.pojo.EmployeeInExample; public class MybatisTest2 { private SqlSessionFactory sqlSessionFactory; @Before
public void setUp() throws Exception {
// 将全局配置文件作为一个流
String resource = "sqlMapConfig.xml";
String realPath = this.getClass().getClassLoader().getResource("sqlMapConfig.xml").getPath();
InputStream inputStream = Resources.getResourceAsStream(resource);
// 建立一个SqlSession工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} // 测试增加
@Test
public void testAdd() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
QuestionsCustomMapper qsm = sqlSession.getMapper(QuestionsCustomMapper.class);
int total = qsm.saveQuestionBatch();
System.out.println(total);
sqlSession.commit();
sqlSession.close();
} }

结果:

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC8AAAAZCAIAAAAuZuBLAAAAhklEQVRIie3Wuw2AMAxF0TeXB/I8nsYVI7BBKhpGoH0UfBR+EgUEEL5yZUXKqaKAy5q2m8ermhfkBOjZItl6M4XbNdu7TQhhekRD0pVANnp0sIjmdKEJzT81yQQAdO/9KqtxBcRM36BxHQz+Ck2mCk1oQnOBZnz38sT2vk1FNHcXmtB8X9MDk7MwqzLmPsEAAAAASUVORK5CYII=" alt="" />

2.批量增加

  sql语句:  insert into xxx values ("xx1",'xxx1'),("xx2","xxx2"),("xx3","xxx3")

mapper接口

/**
* 批量导入试题
* @param list 需要倒入的试题集合
* @return 影响的行数
* @throws Exception
*/
public int saveQuestionBatch(List<Questions> list)throws Exception;

xml配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离 注意:使用mapper代理方法开发,namespace有特殊重要的作用 -->
<mapper namespace="cn.xm.mapper.QuestionsCustomMapper"> <!-- INSERT INTO `exam`.`questions` VALUES ('7', '1', '测试题目7', NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, "安全知识") -->
<insert id="saveQuestionBatch" parameterType="java.util.List">
INSERT INTO `exam`.`questions`
VALUES
<foreach collection="list" item="question" separator=",">
(#{question.questionid},#{question.questionbankid},#{question.question},#{question.questionwithtag},#{question.answer},#{question.analysis},#{question.type},#{question.level},#{question.employeeid},#{question.uploadtime},#{question.status},#{question.knowledgetype})
</foreach>
</insert> </mapper>

测试代码:

package cn.xm.test.mybatis;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test; import cn.xm.bean.basebean.Questions;
import cn.xm.mapper.QuestionsCustomMapper; public class MybatisTest2 { private SqlSessionFactory sqlSessionFactory; @Before
public void setUp() throws Exception {
// 将全局配置文件作为一个流
String resource = "sqlMapConfig.xml";
String realPath = this.getClass().getClassLoader().getResource("sqlMapConfig.xml").getPath();
InputStream inputStream = Resources.getResourceAsStream(resource);
// 建立一个SqlSession工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
// 测试批量增加
@Test
public void testBatchAdd() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
QuestionsCustomMapper qsm = sqlSession.getMapper(QuestionsCustomMapper.class);
List<Questions> list = new ArrayList<>();
list.add(new Questions("8", "1", "测试题目8", "", "", "", "", "", "",null, "", ""));
list.add(new Questions("9", "1", "测试题目8", "", "", "", "", "", "",null, "", ""));
list.add(new Questions("10", "1", "测试题目8", "", "", "", "", "", "",null, "", ""));
list.add(new Questions("11", "1", "测试题目8", "", "", "", "", "", "",null, "", ""));
int total = qsm.saveQuestionBatch(list);
System.out.println(total);
sqlSession.commit();
sqlSession.close();
} }

  总结:传入单个List上面SQL中collection名字应该是list,输入类型是List

3.批量删除

sql语句:  DELETE FROM `exam`.`questions` WHERE `questionId` IN ('10','11','8','9')

java接口:

/**
* 批量删除
* @param ids id集合
* @return 删除条数
* @throws Exception
*/
public int deleteQuestionBatch(List<String> ids)throws Exception;

mapper.xml

<!-- 批量删除 -->
<!-- DELETE FROM `exam`.`questions` WHERE `questionId` in ('10','11','8','9') -->
<delete id="deleteQuestionBatch" parameterType="java.util.List">
DELETE FROM `exam`.`questions` WHERE `questionId` in
<foreach collection="list" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>

测试代码:

package cn.xm.test.mybatis;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test; import cn.xm.bean.basebean.Questions;
import cn.xm.mapper.QuestionsCustomMapper; public class MybatisTest2 { private SqlSessionFactory sqlSessionFactory; @Before
public void setUp() throws Exception {
// 将全局配置文件作为一个流
String resource = "sqlMapConfig.xml";
String realPath = this.getClass().getClassLoader().getResource("sqlMapConfig.xml").getPath();
InputStream inputStream = Resources.getResourceAsStream(resource);
// 建立一个SqlSession工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} // 测试批量删除
@Test
public void testBatchDelete() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
QuestionsCustomMapper qsm = sqlSession.getMapper(QuestionsCustomMapper.class);
List<String> ids = new ArrayList<>();
ids.add("8");
ids.add("9");
ids.add("10");
ids.add("11");
int total = qsm.deleteQuestionBatch(ids);
System.out.println(total);
sqlSession.commit();
sqlSession.close();
} }

4.  批量更新

需要在db链接url后面带一个参数  &allowMultiQueries=true

spring.datasource.url = jdbc:mysql://localhost:3306/fc?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true

如下:

接口方法:

void updateUsers(List<User> users);

xml:

  <update id="updateUsers" parameterType="list">
<foreach collection="list" separator=";" item="item">
update user
<trim prefix="set" suffixOverrides=",">
<if test="item.phone != null and item.phone != ''">
phone = #{item.phone},
</if>
<if test="item.roles != null and item.roles != ''">
roles = #{item.roles},
</if>
</trim>
<where>
<if test="item.id != null and item.id != ''">
id = #{item.id}
</if>
</where>
</foreach>

生成的SQL如下:

2019-09-12 11:23:32.397 DEBUG 16468 --- [nio-8088-exec-1] c.qs.mapper.user.UserMapper.updateUsers  : ==>  Preparing: update user set phone = ?, roles = ? WHERE id = ? ; update user set phone = ?, roles = ? WHERE id = ? ; update user set phone = ?, roles = ? WHERE id = ? ; update user set phone = ?, roles = ? WHERE id = ? ; update user set phone = ?, roles = ? WHERE id = ?
2019-09-12 11:23:32.397 DEBUG 16468 --- [nio-8088-exec-1] c.qs.mapper.user.UserMapper.updateUsers : ==> Parameters: 123123(String), 3(String), 1(Integer), 123123(String), 8(String), 2(Integer), 123123(String), 6(String), 3(Integer), 123123(String), 7(String), 4(Integer), 123123(String), 7(String), 5(Integer)
2019-09-12 11:23:32.613 DEBUG 16468 --- [nio-8088-exec-1] c.qs.mapper.user.UserMapper.updateUsers : <== Updates: 1

  还有第二种case when 语句的批量更新,这种就不通用了。

mybatis批量增加与删除——(十五)的更多相关文章

  1. Spring+SpringMVC+MyBatis深入学习及搭建(十五)——SpringMVC注解开发(基础篇)

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7065294.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十四)--S ...

  2. hibernate 批量增加 修改 删除

    4.2  Hibernate的批量处理 Hibernate完全以面向对象的方式来操作数据库,当程序里以面向对象的方式操作持久化对象时,将被自动转换为对数据库的操作.例如调用Session的delete ...

  3. MyBatis批量添加和删除

    一.批量插入 二.批量删除

  4. ABP 框架集成EF批量增加、删除、修改只针对使用mmsql的

    AppService 层使用nuget 添加 EFCore.BulkExtensions 引用 using Abp.Application.Services.Dto; using Abp.Domain ...

  5. Mybatis批量添加,删除与修改

    1.批量添加元素session.insert(String string,object O) public void batchInsertStudent(){ List<Student> ...

  6. mybatis 批量增加 Parameter '__frch_item_0' not found. Available parameters are [list]

    当在mybatis用到foreach的时候,会报这个错误Parameter '__frch_item_0' not found. Available parameters are [list]会出现的 ...

  7. Spring+SpringMVC+MyBatis深入学习及搭建(十六)——SpringMVC注解开发(高级篇)

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7085268.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十五)——S ...

  8. FreeSql (十五)查询数据

    FreeSql在查询数据下足了功能,链式查询语法.多表查询.表达式函数支持得非常到位. IFreeSql fsql = new FreeSql.FreeSqlBuilder() .UseConnect ...

  9. FreeSql (二十五)延时加载

    FreeSql 支持导航属性延时加载,即当我们需要用到的时候才进行加载(读取),支持1对1.多对1.1对多.多对多关系的导航属性. 当我们希望浏览某条订单信息的时候,才显示其对应的订单详细记录时,我们 ...

随机推荐

  1. 《Linux内核设计与实现》第5章读书整理

                                 <第五章 系统调用>笔记 5.1 与内核通信 系统调用在用户空间和硬件设备之间提供了一个中间层. 中间层的作用: 为用户空间提供一 ...

  2. idea 使用教程

    最智能的IDE IDEA相对于eclipse来说最大的优点就是它比eclipse聪明.聪明到什么程度呢?我们先来看几个简单的例子. 智能提示重构代码 如果你写的代码过于复杂,或者有更好的方式来替代你写 ...

  3. 设置matplotlib画图支持中文显示

    1.安装中文字体 git clone https://github.com/tracyone/program_font && cd program_font && ./ ...

  4. beta3

    吴晓晖(组长) 过去两天完成了哪些任务 一些细节的debug,部分优化,算法中有关记录的部分 展示GitHub当日代码/文档签入记录 接下来的计划 推荐算法 还剩下哪些任务 组员:刘帅珍 过去两天完成 ...

  5. 作业C#程序分析

    阅读下面程序,请回答如下问题: 问题1:这个程序要找的是符合什么条件的数? 问题2:这样的数存在么?符合这一条件的最小的数是什么? 问题3:在电脑上运行这一程序,你估计多长时间才能输出第一个结果?时间 ...

  6. DEP

    DEP(Data execution protect)数据执行保护,这个功能需要操作系统和硬件的共同支持才可以生效.DEP的原理就是在系统的内存页中设置了一个标志位,标示这个内存页的属性(可执行). ...

  7. msgpack生成lib,vs新建lib等

    记录导师交给的任务 新建一个c++项目,运行老师的msgpack的cpp文件,然后会生成相应的lib,我做的东西需要调用到它(这是老师改写后的msgpack的lib) 我的任务是建一个静态库,将客户端 ...

  8. 嵌入AppBar并且带搜索建议的搜索框(Android)

    先看结果: 相关的官方文档在这里:Creating a Search Interface Android官方提供了两种方式: 弹出一个Dialog,覆盖当前的Activity界面 在AppBar中扩展 ...

  9. PAT 甲级 1068 Find More Coins

    https://pintia.cn/problem-sets/994805342720868352/problems/994805402305150976 Eva loves to collect c ...

  10. Jmeter使用笔记之意料之外的

    以下是在测试过程中按照以前loadrunner的思维来做的一点区别: 一.组织方式之setup 在用loadrunner做接口测试的时候如果不是针对login的测试,那么一般也会把login接口放到i ...