myBatis的批量插入数据总结

本文提供了一种在MySQL中使用MyBatis进行学生信息批量插入的方法,并分享了一个生成32位UUID作为自增主键的技巧。

找了很多资料,很多都有问题,可能是数据库不同,这个是mysql的,测试可行。

http://topmanopensource.iteye.com/blog/1833001

</insert>

< insert  id ="insertBatch" >
insert into student ( 
< include  refid ="Base_Column_List" />  ) 
values 
< foreach  collection ="list"  item ="item"  index ="index"  separator ="," >
(null,#{item.name},#{item.sex},#{item.address},#{item.telephone},#{item.tId})
</ foreach >

</insert>


还有一个问题,就是自动生成32位的主键,这个也是找的大神的总结。

http://www.mysqlops.com/2011/03/01/mysql-uuid.html


oot@localhost : (none) 06:09:40> SELECT UUID(),UUID(),LENGTH(UUID()),CHAR_LENGTH(UUID())\G

*************************** 1. row ***************************

(注:其中 \G代表前一个匹配的结束   参考建:http://wenku.baidu.com/view/f5e5dcf07c1cfad6195fa711.html)

UUID(): de7ee638-4322-11e0-85ab-842b2b4a7e75

UUID(): de7ee642-4322-11e0-85ab-842b2b4a7e75

LENGTH(UUID()): 36

CHAR_LENGTH(UUID()): 36

1 row in set (0.00 sec)


<think>好的,我现在需要解决用户的问题:MyBatis批量插入时是否可以使用自增ID,以及具体的实现方式。首先,我需要回顾MyBatis处理自增ID的知识点,尤其是批量插入的情况。 根据用户提供的引用内容,引用[1]提到MyBatis批量插入返回自增主键的问题,可能需要使用特定的KeyGenerator,比如Jdbc3KeyGenerator。引用[3]和[4]则分别展示了Oracle中使用存储过程和获取自增ID的代码示例。这说明不同数据库可能有不同的处理方式,比如Oracle使用序列,而MySQL可能依赖自动递增字段。 接下来,我需要确认MyBatis批量插入时如何返回自增ID。通常,单条插入时,可以使用useGeneratedKeys属性来获取自增主键。但批量插入时,是否同样适用?根据引用[1]中的讨论,可能需要在MyBatis配置中启用批处理,并确保KeyGenerator正确工作。例如,Jdbc3KeyGenerator可能支持批量获取生成的键,但需要数据库驱动支持。 然后,考虑不同数据库的实现差异。对于MySQL,可能只需要在insert语句中指定useGeneratedKeys和keyProperty,而Oracle则需要使用序列和触发器,或者在插入语句中直接调用nextval,如引用[3]所示。这时,需要明确用户使用的数据库类型,但用户的问题没有指定,所以需要分别说明。 另外,引用[4]提到在Java代码中通过流处理获取自增ID列表,这说明在插入后,MyBatis会将生成的主键回填到实体对象的属性中,因此需要确保实体类有对应的字段,并在映射文件中正确配置keyProperty。 可能需要注意的问题包括:数据库是否支持批量获取自增ID、MyBatis版本是否兼容、配置是否正确。例如,某些旧版本的MyBatis可能在批量插入时无法正确回填主键,需要升级或应用补丁,如引用[1]中的GitHub链接提到的PR 324。 总结步骤应该是: 1. 配置MyBatis的useGeneratedKeys和keyProperty。 2. 根据数据库类型调整SQL语句,比如Oracle使用序列。 3. 确保数据库驱动和MyBatis版本支持批量插入返回主键。 4. 在代码中验证主键是否成功回填到实体对象中。 现在需要将这些步骤整理成清晰的中文回答,并生成相关问题。同时确保遵循系统级指令中的格式要求,如数学表达式使用$...$,引用标识正确添加。</think>### MyBatis批量插入实现自增ID的解决方案 MyBatis在不同数据库环境下实现批量插入自增ID主要通过以下三种方式实现: #### 一、MySQL数据库实现方案 1. **XML映射文件配置** 使用`useGeneratedKeys`和`keyProperty`属性实现主键回填: ```xml <insert id="insertBatch" useGeneratedKeys="true" keyProperty="id"> INSERT INTO table_name (column1, column2) VALUES <foreach collection="list" item="item" separator=","> (#{item.column1}, #{item.column2}) </foreach> </insert> ``` - `useGeneratedKeys="true"`:声明使用数据库生成的主键 - `keyProperty="id"`:将生成的主键值回填到实体类的`id`字段[^1] 2. **代码验证** 插入后可直接从对象列表中获取主键: ```java List<Entity> list = new ArrayList<>(); mapper.insertBatch(list); List<Long> ids = list.stream().map(Entity::getId).collect(Collectors.toList()); ``` #### 二、Oracle数据库实现方案 Oracle需通过**序列(Sequence)**生成自增ID,两种实现方式: 1. **直接调用序列** 在SQL中显式使用`序列名.nextval`: ```xml <insert id="insertBatch"> INSERT INTO WF_TASKTEMP_DEALSTAFF (DEAL_ID, TEMP_ID) SELECT WF_TASKTEMP_DEALSTAFF$SEQ.NEXTVAL, A.* FROM ( <foreach collection="list" item="item" separator="UNION ALL"> SELECT #{item.tempId} AS TEMP_ID FROM DUAL </foreach> ) A </insert> ``` *适用场景:插入量较小的情况[^3]* 2. **存储过程批量插入** 使用PL/SQL块提高性能: ```xml <insert id="insertBatch"> BEGIN <foreach collection="list" item="item"> INSERT INTO table_name (ID, COLUMN1) VALUES (SEQ_NAME.NEXTVAL, #{item.column1}); </foreach> END; </insert> ``` *优势:减少网络传输开销,适合大数据插入* #### 三、注意事项 1. **数据库驱动兼容性** MySQL需确保JDBC驱动支持`rewriteBatchedStatements=true`参数以启用批量操作: ```properties jdbc.url=jdbc:mysql://host/db?rewriteBatchedStatements=true ``` 2. **MyBatis版本限制** - 批量插入返回主键需要MyBatis 3.3.1+版本 - 低版本需手动引入`Jdbc3KeyGenerator`类(参考GitHub补丁[^1]) 3. **性能优化** | 方案 | 数据量适应范围 | 主键获取方式 | |---------------------|----------------|-------------------| | 直接插入 | < 1000条 | 序列.nextval | | 存储过程 | > 1000条 | 回填到对象属性[^4]| #### 四、验证示例 以MySQL为例,实体类需包含`id`字段及setter方法: ```java public class User { private Long id; // 必须包含此字段 // getter/setter } ``` 执行插入后检查`userList`中的`id`是否被正确赋值。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值