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. 【MOOC EXP】Linux内核分析实验三报告

     程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 [跟踪分析Linux内核的启动过程] ...

  2. c++ 读写功能

    课程作业三 git链接: Operations 感想        这次代码修改的地方主要有,加入了文件读写.读出功能,以及分离函数写到了头文件里.        但是也有很多不足的地方,首先本来想要 ...

  3. 在eclipse中编译调试ns3

    1首先把ns3项目导入eclipse 然后把上面的的ns3按照上面的提示即可导入成功.   然后可以运行一下 ./waf configure     2 配置C/C++ Build 右键工程,选择属性 ...

  4. Django 图片上传、存储与显示

    参考博客:http://www.cognize.me/2016/05/09/djangopic 开始之前要先安装python图像处理库:pip install --use-wheel Pillow 一 ...

  5. final发布简评

    1.nice!——约跑app:本次发布使用摄像头展示,比之前清晰的多,展示效果很好,值得学习!功能都已实现,已经可以使用,好评. 2.飞天小女警——礼物挑选:本次发布风格与上次不同,除此之外添加了猜你 ...

  6. Elasticsearch学习系列之term和match查询

    lasticsearch查询模式 一种是像传递URL参数一样去传递查询语句,被称为简单查询 GET /library/books/_search //查询index为library,type为book ...

  7. Android GridView数据绑定

    java代码构造个泛型数组用于存放item,作为title        List<Map<String, Object>> items = new ArrayList< ...

  8. Ubuntu17安装MySql5.7

    安装: sudo apt-get update sudo apt-get install mysql-server 配置远程访问: vi /etc/mysql/mysql.conf.d/mysqld. ...

  9. ABP-JavaScript API

    一.AJAX 1,ABP采用的方式 ASP.NET Boilerplate通过用abp.ajax函数包装AJAX调用来自动执行其中的一些步骤. 一个例子ajax调用: var newPerson = ...

  10. 「NOI2018」你的名字

    「NOI2018」你的名字 题目描述 小A 被选为了\(ION2018\) 的出题人,他精心准备了一道质量十分高的题目,且已经 把除了题目命名以外的工作都做好了. 由于\(ION\) 已经举办了很多届 ...