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. 美食查询手机应用"吃了么":NABC

    一 N(need) 当你在一个陌生的地方游玩,想吃到当地的招牌美食时怎么办? 当你听说有一个很好吃的家常菜,也想自己下厨试试时怎么办?打印出菜谱,还是奔波于厨房和电脑之前? 查询周边美食的功能对于那些 ...

  2. 一个java实现的简单的4则运算器

    有些基础知识有欠缺,补一下,顺便练习一下java import com.sun.deploy.util.ArrayUtil; import java.util.*; public class Main ...

  3. ns3 myfirst.cc 两个节点点对点通信

    首先在ns3.25/examples/tutorial/下找到 first.cc文件,将他拷贝到到scratch目录下. 然后为了方便将代码打出来 /* -*- Mode:C++; c-file-st ...

  4. python matploblib学习笔记

    import matplotlib.pyplot as pltimport numpy as np # matplotlib画图注释中文需要设置from matplotlib.font_manager ...

  5. GS 服务器端开启webservice 远程调试的方法

    1. 修改 安装目录下 web.config的文件. 一般目录为: C:\Program Files\GenerSoft\bscw_local\web.config 为了保证安全想把文件备份一下. 2 ...

  6. java8新特性(四)_Stream详解

    之前写过一篇用stream处理map的文章,但是对stream没有一个整体的认识,这次结合并发编程网和ibm中介绍stream的文章进行一个总结,我会着重写对list的处理,毕竟实际工作中大家每天进行 ...

  7. developer roadmap

    developer roadmap https://balsamiq.com/ https://balsamiq.com/givingback/free/ https://balsamiq.cloud ...

  8. C#委托的介绍(delegate、Action、Func、predicate)ga

    转载:http://www.cnblogs.com/akwwl/p/3232679.html 感觉写的很好.例子也很简单明了.赞一个 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参 ...

  9. Maven变量及常见插件配置详解(转)

    一.变量-自定义变量及内置变量 1.自定义变量 <properties> <project.build.name>tools</project.build.name> ...

  10. [Swerc2014 C]Golf Bot

    题意:给你N个数字,每次利用这N个数字中最多两个数字进行加法运算,来得到目标中的M个数字. Solution: 我们先来看看多项式乘法:\(A(x)=\sum_{i=0}^{n-1}a_ix^i\), ...