Java MyBatis 插入单个/ 使用 foreach传递 List插入多个, 批量插入 亲测

28 篇文章 0 订阅
3 篇文章 0 订阅

1. 相关数据表


CREATE DATABASE `test` DEFAULT CHARSET utf8;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `memo` varchar(2000) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

2. User.java


import java.io.Serializable;

public class User implements Serializable {
    private static final long serialVersionUID = 8755803182642361875L;

    private Long id;

    private String name;

    private String memo;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getMemo() {
        return memo;
    }

    public void setMemo(String memo) {
        this.memo = memo;
    }
}

3. UserMapper.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">
<mapper namespace="com.test.web3.UserMapper">

	<!-- 创建单个 -->
	<insert id="create" parameterType="com.test.web3.entity.User" useGeneratedKeys="true" keyProperty="id">
		INSERT INTO
		`user`
		(`name`,`memo`)
		VALUES
		(#{name},#{memo})
	</insert>

	<!-- 创建多个 通过传递 List参数 VALUES创建多个行  -->
	<insert id="create2" parameterType="java.util.List">
		INSERT INTO
		`user`
		(`name`,`memo`)
		VALUES
		<foreach collection="list" item="item" separator=",">
		(
			#{item.name},
			#{item.memo}
		)
		</foreach>
	</insert>

</mapper>

4. DAO(Data Access Object)数据访问接口 UserDao.java和实现类 UserDaoImpl.java


import com.test.web3.entity.User;
import java.util.List;

public interface UserDao {
    void create(final User user);
    void create(final List<User> users);
}

import com.test.web3.entity.User;
import com.test.web3.dao.UserDao;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.List;

@Repository
public class UserDaoImpl implements UserDao {
    @Autowired
    private SqlSession sqlSession;

    static final String MAPPER = "com.test.web3.UserMapper.";

    @Override
    public void create(final User user) {
        sqlSession.insert(MAPPER + "create", user);
    }

    @Override
    public void create(final List<User> users) {
        sqlSession.insert(MAPPER + "create2", users);
    }

}

5. UserController.java(入口)


import com.test.web3.dao.OrderDao;
import com.test.web3.dao.UserDao;
import com.test.web3.entity.Order;
import com.test.web3.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.util.*;

@Controller
public class UserController {
    @Autowired
    private UserDao userDao;

    @RequestMapping(value = "/createUser1", method = RequestMethod.GET)
    public @ResponseBody Map<String, String> createUser1() {
        /**
         * 创建单个用户
         * */
        final User user = new User();
        user.setName("测试用户1");
        user.setMemo("1号用户的笔记");
        userDao.create(user);
        System.out.println("插入后自增编号: " + user.getId());

        Map<String, String> result = new HashMap<>();
        result.put("message", "创建成功!");
        return result;
    }

    @RequestMapping(value = "/createUser2", method = RequestMethod.GET)
    public @ResponseBody Map<String, String> createUser2() {
        /**
         * 创建多个用户
         * */
        final List<User> users = new ArrayList<>();

        final User user2 = new User();
        user2.setName("测试用户2");
        user2.setMemo("2号用户的笔记");
        users.add(user2);

        final User user3 = new User();
        user3.setName("测试用户3");
        user3.setMemo("3号用户的笔记");
        users.add(user3);

        userDao.create(users);

        Map<String, String> result = new HashMap<>();
        result.put("message", "创建成功!");
        return result;
    }
    
}

如果您觉得有帮助,欢迎点赞哦 ~ 谢谢!!

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
回答: MyBatis实现批量插入数据操作时,可以使用foreach标签来进行处理。然而需要注意的是,MyBatisforeach标签并不是真正的批量操作,而是生成一个包含多个占位符的单个插入语句。这样的实现方式存在一些缺点。首先,这个语句无法被缓存,因为它包含了foreach元素,而这个元素的值会根据参数的不同而变化。因此,每次执行这个语句时,MyBatis都需要重新解析语句字符串并构建参数映射。这样的过程会带来一定的性能开销。 要实现高效的批量插入操作,可以考虑使用MyBatis批量插入功能。这个功能可以通过使用MyBatis提供的批量插入方法,将多个实体对象一次性插入到数据库中。这样可以减少与数据库的交互次数,提高性能。 另外,还可以通过使用MyBatis批量插入语句,将多个实体对象拼接成一个较大的插入语句,然后一次性执行这个语句。这样可以减少每次插入的开销,提高效率。 总之,要实现高效的批量插入操作,可以考虑使用MyBatis批量插入功能或者拼接批量插入语句的方式,以减少与数据库的交互次数,提高性能。123 #### 引用[.reference_title] - *1* [Mybatis如何实现一个高效的批量插入操作呢?](https://blog.csdn.net/qq_25073223/article/details/128073041)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *2* *3* [Mybatis批量插入大量数据最优方式](https://blog.csdn.net/blueheartstone/article/details/126602810)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值