zoukankan      html  css  js  c++  java
  • mybatis批量增删改——(十五)

    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();
        }
    
    }

    结果:

    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 语句的批量更新,这种就不通用了。

  • 相关阅读:
    面试题12:打印1到最大的n位数
    java生成指定范围的随机数
    排序
    Java中的String类和算法例子替换空格
    动态规划、贪心算法笔记
    牛客编程巅峰赛S1第2场
    UVA 489
    UVA 1339
    UVA 1587
    UVA 202
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/7294478.html
Copyright © 2011-2022 走看看